Обработка нажатий клавиш в C # - PullRequest
0 голосов
/ 23 ноября 2010

Я делаю игру, и у меня есть класс MainCharacter, который сначала инициализирует главного персонажа (в pictureBox), а затем у меня было событие KeyDown для обработки движения.Внутри этого события я мог управлять движением персонажа, если нажимал клавиши со стрелками, и я даже сделал анимацию движения на основе таймера, чтобы сделать его более плавным.

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

Вот почему я решил использовать событие KeyPress, чтобы, когда я удерживал клавишувниз персонаж будет двигаться в указанном направлении с постоянной скоростью.Однако событие KeyPress не может обрабатывать клавиши со стрелками, поэтому мне пришлось переопределить метод ProcessDialogKey в основной форме.Но если я переопределю его в основной форме, то событие будет срабатывать каждый раз, когда я нажимаю клавишу со стрелкой, даже когда я не в игре, но, например, в главном меню или где-либо еще.Кроме того, я думаю, что это было бы плохой практикой, если бы я все равно пытался так много программировать, пересекая классы.

Итак, есть ли другой способ обработать событие KeyPress для стрелок внутри мой класс MainCharacter без влияния на другие классы?Или у меня есть шанс остаться с событием KeyDown, которое у меня уже было, и сделать так, чтобы оно не могло запускаться повторно, если я удерживаю клавишу?Помните, что я хочу достичь, чтобы мой персонаж свободно двигался, когда я держу нажатой клавишу.Пока все работает нормально, если я нажимаю его только один раз, но обычно люди удерживают клавиши, когда они идут в одном направлении.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

this.position.X + = (this.direction * (this.speed + 10));

0 голосов
/ 23 ноября 2010

Создайте переменную direction в классе MainCharacter.

OnKeyDown левой клавиши, установите направление на -1 и OnKeyDown правой клавиши, установите направление на 1.

Затем OnKeyUp для левой и правой клавиш установите направление на 0.

Затем вы можете перемещать своего персонажа в зависимости от значения, установленного для direction, вместо того, чтобы перемещать егокаждый раз при нажатии физической клавиши.

Очень псевдокод: // Этот пример касается только движения влево / вправо.

void Update(){
    // Update position due to current key state.
    this.position.X += this.direction * this.speed;
}

void OnKeyDown(KeyEventArgs e) {
    if(e.Key == Key.Left) {
        player.direction = -1;
    }
    else if(e.Key == Key.Right) {
        player.direction = 1;
    }
}

void OnKeyUp(KeyEventArgs e) {
    if(e.Key == Key.Left || e.Key == Key.Right) {
        player.direction = 0;
    }
}
...