Кнопка отправки в последовательном

1

Я хочу сделать RC и удалять его с помощью последовательной связи. Я хочу:

  • если я нажимаю 'W' на клавиатуре, отправьте '1000'
  • если я нажимаю 'S' на клавиатуре, отправьте '0100'
  • если я нажимаю 'A' на клавиатуре, отправьте '0010'
  • если я нажимаю 'D' на клавиатуре, отправьте '0001'
  • если я нажму 'W' и 'A', отправьте '1010'
  • если я нажимаю 'W' и 'D', отправьте '1001'
  • и т.д., так же, как мы играем в игру

Я делаю код, но он не работает, когда я нажимаю A и W вместе. Код не отправил '1010', а только отправил '1000'

private void SEND_KeyPress(object sender, KeyPressEventArgs e)
{
    string tx;
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
    {
        tx = "1010";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.D)
    {
        tx = "1001";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.S & e.KeyChar == (char)Keys.A)
    {
        tx = "0110";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
    {
        tx = "0101";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.W)
    {
        tx = "1000";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.S)
    {
        tx = "0100";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.A)
    {
        tx = "0010";
        serialPort1.Write(tx);
    }
    if (e.KeyChar == (char)Keys.D)
    {
        tx = "0001";
        serialPort1.Write(tx);
    }
}
  • 0
    if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A) ? Вы, вероятно, имеете в виду, if (e.KeyChar == (char)Keys.W && e.KeyChar == (char)Keys.A) . Обратите внимание, что когда e.KeyChar == (char)Keys.W имеет значение true , e.KeyChar == (char)Keys.A имеет значение false и наоборот. Это означает, что все выражение всегда возвращает false
  • 0
    @MadSorcerer & отлично подходит для этого в C #.
Показать ещё 1 комментарий
Теги:

4 ответа

0
Лучший ответ
//DetectCombination like this:
    public DateTime PrevPress { get; set; }
    public DateTime CurrentPress { get; set; }
    public string PrevKey { get; set; }

    private void SEND_KeyPress(object sender, KeyPressEventArgs e)
    {
        string keycomb = DetectCombination(e.KeyChar.toString);
    }
    public string DetectCombination(string currentKey)
    {
        CurrentPress = DateTime.Now;
        if(CurrentPress.CompareTo(PrevPress) < //100ms)
        {
            PrevKey+=currentKey;
        }
        else
        {
            PrevKey = currentKey;
            PrevPress = CurrentPress;
        }
        return PrevKey;
    }

//Для применения вашей логики потребуется еще одна функция, но, похоже, вы позаботились об этом.

1

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

Вам необходимо подписаться на keydown и keyup. Когда происходит сбой, записывайте ключ, который был нажат в хеш-листе. Когда происходит проверка ключа, проверьте, содержит ли хеш-лист A и W, а затем отправьте 1010.

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

  • 1
    +1 Также обратите внимание, что в его комбинациях конкретные «биты» по-прежнему соответствуют W / S / A / D. Более простая реализация с быстрым откликом состояла бы в том, чтобы поддерживать состояние каждого из четырех, соответствующим образом корректировать с помощью keydown и keyup, и, если любое из них изменяется, создайте строку «1» и «0» из сохраненного состояния и отправьте ее. Для этого не нужен хеш-лист и не нужна специальная логика для комбинаций.
  • 0
    @JasonC хороший совет. Также я заметил еще одну ошибку с ним. При проверке комбинаций клавиш включите его, но проверьте клавиши, которые еще не нажаты, поскольку пользователь не может отпустить все клавиши одновременно.
0

A и W никогда не могут быть действительно нажаты одновременно, сначала проверьте W, а затем проверьте A, наконец, передайте значение 1010

if (e.KeyChar == (char) Keys.W)

{

   if(e.KeyChar == (char)Keys.A)
    { 
      tx = "1010";
      serialPort1.Write(tx);
    }

}

0

Из документации MSDN:

Происходит, когда персонаж. пробел или клавиша Backspace нажата, когда управление имеет фокус.

Этот обработчик событий запускается один раз за ключ. Это означает, что эта строка

if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)

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

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

  • 2
    Эта строка всегда будет иметь значение false, но не из-за способа запуска обработчика событий. Он всегда будет иметь значение false, поскольку переменная не может иметь два разных значения одновременно. Также лучшей стратегией было бы отслеживать события нажатия клавиш и нажатия клавиш, чтобы увидеть, действительно ли они нажаты одновременно, без времени; в противном случае это не очень хорошо для игры, в которой вы можете просто нажать «W», а затем «A» быстро после этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню