C # Пользовательские нажатия клавиш не зарегистрированы - PullRequest
0 голосов
/ 27 февраля 2019

Я начинающий программист, и я пытаюсь сделать так, чтобы пользователь мог перемещать метку с помощью WASD, но, похоже, это не сработало, я скрылся в Интернете за ответ без надежды.Для записи я использую Microsoft Visual Studio 2012.

Это метод определения ключа пользователя

internal class Input
    {
        private static Hashtable keyTable = new Hashtable();

        public static bool KeyPressed(Keys key)
        {
            if (keyTable[key] == null)
                return false;
            return (bool)keyTable[key];
        }
        public static void ChangeState(Keys key, bool state)
        {
            keyTable[key] = state;
        }
    }

И код для фактического перемещения материала при нажатии клавиши

private void moveObject(object sender, EventArgs e)
        {

            {
                if (Input.KeyPressed(Keys.A))
                {
                    label1.Location = new Point(label1.Location.X - 1, label1.Location.Y);
                    MessageBox.Show("test", "test");
                }
                if (Input.KeyPressed(Keys.D))
                {
                    label1.Location = new Point(label1.Location.X +1, label1.Location.Y);
                }
                if (Input.KeyPressed(Keys.S))
                {
                    label1.Location = new Point(label1.Location.X, label1.Location.Y-1);
                }
                if (Input.KeyPressed(Keys.W))
                {
                    label1.Location = new Point(label1.Location.X, label1.Location.Y+1) ;
                }
            }

Мне кажется, что это должно работать на бумаге, но ничего не делает.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

В этом ответе предполагается, что вы используете WinForms.

Почему бы вам просто не использовать встроенное событие?Для класса Form существует событие KeyDown.Затем вы можете использовать свойство KeyEventArgs class 'KeyCode, которое возвращает, какая клавиша была нажата.

Теперь, когда у вас есть какая клавиша была нажата,используйте блок переключателя / корпуса для разделения действий на основе нажатой клавиши.(Просто помните, что каждый блок case должен заканчиваться оператором break;.) Каждый аргумент case будет проверен на соответствие аргументу switch.Если они одинаковы, то данный блок дела будет запущен.В противном случае указанный блок будет пропущен.Например, если вы нажмете кнопку «А», будет запущен только блок case Keys.A.

Затем используйте свойства Top и Leftметки, чтобы переместить метку вокруг.например, если вы нажмете W, он должен переместиться вверх на 1 пиксель, что означает, что свойство Top должно уменьшиться на 1. (Top - это расстояние метки от верхней части окна, Left - это расстояние от егоосталось.)

private void Form_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    switch (e.KeyCode) {
         case Keys.W: { 
             label1.Top -= 1;
             break;
         }
         case Keys.A: { //do stuff on A button }
         case Keys.S: { //do stuff on S button }
         case Keys.D: { //do stuff on D button }
         default: { break; }
    }
}
0 голосов
/ 27 февраля 2019

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

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