2014-09-24 3 views
3

Итак, я успешно создал игру 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 к игре, если вы хотите испытать ошибку из первых рук. Спасибо за любую помощь!

+0

Возможно, вы захотите посмотреть [этот пост о том, как обрабатывать время в играх] (http://stackoverflow.com/questions/17440555/using-timer-and-game-loop/17440807#17440807), потому что он сильно отличается от обычного программирования Windows Forms. Наличие обычного таймера вызовет у вас массу проблем. – nvoigt

+0

@nvoigt Это сообщение интересное и очень полезно, я понятия не имел, что игры могут работать! – Minato

ответ

3

Что у вас есть на самом деле «особенность». Вы хотите, чтобы иметь возможность идти вниз, затем влево, но вы делаете это в течение таймера, вызывая «ошибку».

Это означает, что вам нужно wait изменить направление. Ваш код будет выглядеть так:

if (direction != Direction.Right) 
    intendedDirection = Direction.Left; 

... 

OnTimerTick() 
{ 
    ... 
    direction = intendedDirection; 
} 

Теперь вы можете нажать столько клавиш, как вы хотите (что действительны) последний вступит в силу на тик таймера, который будет затем позволить следующей клавиши (слева), чтобы работать правильно.

+0

А, классическая «особенность, а не ошибка» – tnw

+0

@tnw Ну, код правильный, только время отключено. Функция здесь корректна. Я мог бы оставить его так, чтобы любой идиот попытался надавить на клавиши слишком быстро, потеряв игру :) Тогда это действительно будет особенностью. – BradleyDotNET

+0

@BradleyDotNET Да, я пробовал что-то почти идентичное этому, а также просто пробую вашу идею в точности, и, хотя она работает, это делает игру менее эффективной. Я имею в виду, что иногда вы будете нажимать вниз и уходить очень быстро, и он продолжит движение вниз и не останется на следующей строке. Я думаю, что я должен просто держать его, хотя это часть игры? – Minato

0

Я не знаю, как вы храните позиции змеи, но я бы удостоверился, что для каждой стрелки нажата позиция в этом направлении отличается от положения головы змей, иначе вы можете игнорировать это нажатие.

Смежные вопросы