ventana traer tener tag net frente ejemplo control c# .net winforms user-controls tetris

c# - traer - Mover un control de usuario dentro de otro control de usuario



traer ventana al frente c# (1)

Intento escribir un clon de tetris y, después de investigar un poco, me he topado con un ejemplo que usa pequeños controles de usuario para formar el bloque y un mayor control del usuario que contiene la cuadrícula.

Todo lo que he escrito parece funcionar bien (los bloques se generan y se colocan en la grilla, incluso puedo ubicarlos en otro lugar si cambio el código), pero parece que no puedo mover los bloques mientras el programa se está ejecutando. El ejemplo que uso lo hace cambiando la propiedad control.left de cada uno de los bloques. Intenté esto, lo depuré y mientras la propiedad cambia, el bloque no se mueve.

He buscado alrededor de 4 horas ahora. Soy un programador novato, así que sé que probablemente sea algo estúpido, pero no puedo encontrar lo que es.

Aquí están los métodos que he escrito:

//Class TetrisGame.cs public void MoveRight() { blok.MoveBlock("x", 1); } //Class Shape.cs public void MoveBlock(string pos, int Amount) { if (pos == "x") { for (int i = 0; i < this.Shape().Count; i++) { ((Blokje)this.Shape()[i]).MoveSide(1); } } if (pos == "y") { for (int i = 0; i < this.Shape().Count; i++) { ((Blokje)this.Shape()[i]).MoveDown(1); } } //And, the code that should actually move the block in Block.cs: public void MoveSide(int Step) { this.Left += (Step * 20);//Blocks are 20*20 pixels so should move in steps of 20 pixels }

Shape es en realidad una lista de matrices que solo contiene los 4 bloques. Block.cs es una clase parcial ya que es el código detrás del control de usuario que son los cuadrados pequeños, Shape.cs hace que las formas salgan de los bloques y tetrisgame es solo el gamelogic

el evento Keypress:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) { try { if (e.KeyChar == ''q'')//left { if (!paused) { Game.MoveLeft(); } } else if (e.KeyChar == ''d'')//right { if (!paused) { Game.MoveRight(); } } else if (e.KeyChar == ''p'')//pause { if (paused) { tmrGame.Start(); } else { tmrGame.Stop(); } } else if (e.KeyChar == ''z'')//rotate { if (!paused) { Game.Rotate(); } } else if (e.KeyChar == ''h'')//help { Help.Show(); } else if (e.KeyChar == ''f'')//save { } else if (e.KeyChar == ''s'')//Drop { if (!paused) { Game.Drop(); } } } catch { //no error message has to be displayed, this is just to prevent runtime Errors when pressing keys before the game has started } }


Parece que el "control de usuario más grande que contiene la cuadrícula" con sus hijos no se vuelve a dibujar. Cambiar MoveSide a:

public void MoveSide(int Step) { this.Left += (Step * 20); Update(); }

entonces todo se vuelve a dibujar correctamente.