Как заставить PictureBox двигаться с помощью клавиш со стрелками/WASD?

#c# #winforms #keydown

Вопрос:

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

У меня включен таймер, и код компилируется, потому что программа загружается без ошибок, но коробки с картинками не двигаются.

Может ли кто-нибудь заметить мою проблему?

 public partial class Form1 : Form
{
    bool P1Up, P1Down, P2Up, P2Down;

    int Speed = 12;
    public Form1()
    {
        InitializeComponent();
    }

    private void MoveTriggerTick(object sender, EventArgs e)
    {
        if (P1Up == true) Player1Paddle.Top  = Speed;
        if (P1Down == true) Player1Paddle.Top -= Speed;
        if (P2Up == true) Player2Paddle.Top  = Speed;
        if (P2Down == true) Player2Paddle.Top -= Speed;
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        int P1Y = Player1Paddle.Location.Y;
        int P2Y = Player2Paddle.Location.Y;
        if (e.KeyCode.ToString() == "w") P1Up = true;
        if (e.KeyCode.ToString() == "s") P1Down = true;
        if (e.KeyCode == Keys.Up) P2Up = true;
        if (e.KeyCode == Keys.Down) P2Down = true;
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        int P1Y = Player1Paddle.Location.Y;
        int P2Y = Player2Paddle.Location.Y;
        if (e.KeyCode.ToString() == "w") P1Up = false;
        if (e.KeyCode.ToString() == "s") P1Down = false;
        if (e.KeyCode == Keys.Up) P2Up = false;
        if (e.KeyCode == Keys.Down) P2Down = false;
    }
}
 

Сноска: Хотел, чтобы движение весла было реализовано, прежде чем смотреть на добавление мяча или счет.

Комментарии:

1. e.Код ключа. toString() делает не то, что вы думаете. Предпочитаю Ключи. W и ключи.S

2. Какой смысл объявлять и назначать две неиспользуемые переменные в обработчиках ввода / вывода ключей ? int P1Y = Player1Paddle.Location.Y; int P2Y = Player2Paddle.Location.Y;

Ответ №1:

 if (e.KeyCode.ToString() == "w")
 

должно быть

 if (e.KeyCode == Keys.W) 
 

и так далее.

Он находится в System.Windows.Forms пространстве имен (см. Документацию).

Также убедитесь, что MoveTriggerTick правильно зарегистрирован в качестве обработчика таймера.

Комментарии:

1. Хорошо, проведя некоторое (вероятно) тестирование джанка, я теперь знаю, что проблема на самом деле в таймере. Я немного покопался и изменил часть кода таймера, чтобы добавить это; private void Form1_Load(object sender, EventArgs e) { Timer move = new Timer(); move.Interval = 20; move.Tick = new EventHandler(MoveTriggerTick); move.Start(); } Но у меня все еще нет движения. Есть идеи, как это исправить?

2. Вам нужно использовать базовые инструменты отладки, мы не можем сделать это вместо вас. Используйте точки останова в каждой функции для выполнения кода строка за строкой и проверьте, установлены ли переменные так, как вы себе представляете, и выполнены ли условные инструкции. В качестве альтернативы вы также можете разместить некоторые Console.WriteLine("Some debug message") повсюду и осмотреть консоль, особенно в if (включите if (condition_xyz) instruction; в if(condition_xyz) { Console.WriteLine("The condition xyz is true!"); instruction; } ). Также читайте ericlippert.com/2014/03/05/how-to-debug-small-programs