Sto provando a scrivere un clone di tetris, e dopo aver fatto qualche ricerca mi sono imbattuto in un esempio che utilizza piccoli controlli utente per formare il blocco e un controllo utente più grande che contiene la griglia.Spostare un controllo utente all'interno di un altro controllo utente
Tutto ciò che ho già scritto sembra funzionare bene (i blocchi vengono generati e posizionati sulla griglia, posso anche posizionarli da qualche altra parte se cambio il codice), ma non riesco a ottenere i blocchi per spostarsi mentre il programma è in esecuzione. L'esempio che uso lo fa modificando la proprietà control.left
di ciascuno dei blocchi. Ho provato questo, il debug e mentre la proprietà cambia, il blocco non si muove.
Ho cercato in giro per circa 4 ore. Sono un programmatore alle prime armi, quindi so che probabilmente è qualcosa di stupido, ma non riesco a trovare quello che è.
Ecco i metodi che ho scritto:
//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 è in realtà un ArrayList che contiene solo i 4 blocchi. Block.cs è una classe parziale dal momento che è il codice dietro l'UserControl che sono le piccole piazze, Shape.cs rende le forme dai blocchi e Tetrisgame è solo l'gamelogic
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
}
}
Come stai ottenendo input? Tastiera, mouse? Immagino che il tuo approccio potrebbe funzionare quando hai solo pochi elementi. Stai usando WPF o Winforms? –
Sto usando la tastiera con un evento di pressione tasti e winform. L'input da tastiera funziona, dal momento che lo uso anche per aprire il modulo di aiuto. – Frederik
prova a impostare this.location = new point (x, y); –