Итак, я успешно создал игру Snake, которая прекрасно работает, за исключением одной маленькой вещи, которую я не знаю, как ее решить. Позвольте мне попытаться объяснить.Нужна помощь. Исправлена ошибка в игре Snake.
Итак, игра работает на таймере, где каждый тик таймера означает перемещение каждого блока змеи в указанном направлении. Он работает так, что если вы двигаетесь вправо, вы не можете двигаться влево (потому что тогда голова будет пересекаться с телом, и вы проиграете). То же самое касается всех других возможных направлений. Существует переменная направления, определяющая текущее направление змеи. Поэтому проблема заключается в том, что, когда вы нажимаете левую клавишу, она проверяет правильность направления вправо, и если это так, ничего не произойдет. Но если вы должны были нажать клавишу «вниз», а затем левую клавишу в течение одного и того же промежутка времени, тогда змея движется влево, и вы проиграете. Вот код, который обрабатывает событие KeyDown для формы.
private void frmMain_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.Enter:
if (lblMenu.Visible)
{
lblMenu.Visible = false;
LoadSettings();
gameLoop.Start();
}
break;
case Keys.Space:
if (!lblMenu.Visible)
gameLoop.Enabled = (gameLoop.Enabled) ? false : true;
break;
case Keys.S:
using (frmSettings f = new frmSettings())
{
f.ShowDialog(this);
}
break;
case Keys.Right:
if (direction != Direction.Left)
direction = Direction.Right;
break;
case Keys.Down:
if (direction != Direction.Up)
direction = Direction.Down;
break;
case Keys.Left:
if (direction != Direction.Right)
direction = Direction.Left;
break;
case Keys.Up:
if (direction != Direction.Down)
direction = Direction.Up;
break;
}
}
Вот download к игре, если вы хотите испытать ошибку из первых рук. Спасибо за любую помощь!
Возможно, вы захотите посмотреть [этот пост о том, как обрабатывать время в играх] (http://stackoverflow.com/questions/17440555/using-timer-and-game-loop/17440807#17440807), потому что он сильно отличается от обычного программирования Windows Forms. Наличие обычного таймера вызовет у вас массу проблем. – nvoigt
@nvoigt Это сообщение интересное и очень полезно, я понятия не имел, что игры могут работать! – Minato