Создание событий по нажатию клавиши - PullRequest
0 голосов
/ 09 апреля 2011

Я хочу создать событие, когда происходит каждое нажатие клавиши на клавиатуре. Пока я сделал это:

namespace WindowsFormsApplication1
{
  public partial class SpaceInvadors : Form
  {

    SpaceInvadors sInvaders;
    public SpaceInvadors()
    {
      InitializeComponent();
      KeyStroke keyStroke = new KeyStroke();
      sInvaders=new SpaceInvadors(keyStroke);
    }

    public SpaceInvadors(KeyStroke keyStroke)
    {
      keyStroke.keyStroked += Form1_KeyDown;//How does that chaining to the event work?
      keyStroke.keyStroked += Form1_KeyUp;
    }

    private void Form1_KeyDown(object sender, KeyArgs e)
    {
      if (e.KeyCode == Keys.Q)
      {
        Application.Exit();
      }
    }
  }
  public class KeyStroke
  {
    public event EventHandler<KeyArgs> keyStroked;
    public void Add(Keys key)
    {
        // I need to know how to obtain this key:
        KeyArgs keyAr = new KeyArgs(key);
        keyRisen(keyAr);
    }

    public void keyRisen(KeyArgs kA)
    {
        if (keyStroked != null)
            keyStroked(this, kA);
    }
}

public class KeyArgs : EventArgs
{
    public Keys KeyCode { get; set; }
    public KeyArgs(Keys key)
    {
        KeyCode = key;
    }
}

Кроме того, как я могу постоянно слушать, какие клавиши были нажаты, а не только один раз

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

На ваш вопрос

"Кроме того, как я могу все время слушать на какие клавиши были нажаты, а не только один раз "

Я вижу, что вы уже использовали событие Form.KeyDown, чтобы закрыть игру, если была нажата клавиша "q":

    private void Form1_KeyDown(object sender, KeyArgs e)
        {
          if (e.KeyCode == Keys.Q)
          {
            Application.Exit();
          }
}

Хорошо, вы можете добавить больше ключей к вашему методу:

private void Form1_KeyDown(object sender, KeyArgs e)
    {
      if (e.KeyCode == Keys.Q)
      {
        Application.Exit();
      }
      else if (e.KeyCode == Keys.Up)
        spaceInvaders.MoveUp();
    }

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

0 голосов
/ 09 апреля 2011

Если я правильно понимаю, вы пишете игру, Космические захватчики!:)
Я не думаю, что такой подход хорош для игры.Наиболее подходящий и часто используемый подход - использовать функцию GetKeyboardState .Для достижения хороших результатов в игре с этой функцией вы должны создать таймер и периодически проверять состояния клавиш.И я рекомендую вам выполнять рендеринг также в режиме таймера.

Если по каким-либо причинам вы не можете использовать GetKeyboardState, я рекомендую вам использовать PreviewKeyDown

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...