Я пытаюсь написать клон tetris, и после некоторого исследования я столкнулся с примером, который использует небольшие пользовательские элементы управления для формирования блока и большего пользовательского элемента управления, который содержит сетки.Перемещение пользовательского элемента управления внутри другого пользовательского элемента управления
Все, что я написал, кажется, работает очень хорошо (блоки генерируются и помещаются в сетку, я могу даже разместить их где-нибудь еще, если я изменю код), но я не могу получить блоки для перемещения во время работы программы. Пример, который я использую, делает это, изменяя свойство control.left
каждого из блоков. Я пробовал это, отлаживал его и, пока свойство изменяется, блок не перемещается.
Я искал около 4 часов. Я начинающий программист, поэтому я знаю, что это, наверное, что-то глупое, но я не могу найти, что это такое.
Вот методы я написал:
//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
}
Форма фактически является ArrayList, который содержит только 4 блоков. Block.cs частичный класс, так как это код за UserControl, который небольшие квадраты, Shape.cs делает фигуры из блоков и tetrisgame это только 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
}
}
Как вы получаете ввод? Клавиатура, мышь? Я предполагаю, что ваш подход может работать, если у вас есть только несколько элементов. Вы используете WPF или Winforms? –
Я использую клавиатуру с событием keypress и winforms. Работа с клавиатурой работает, так как я также использую ее для открытия формы справки. – Frederik
попробуйте установить this.location = новая точка (x, y); –