Как взять несколько ключей ввода в wxwidgets? - PullRequest
0 голосов
/ 14 февраля 2020

Как я делаю игру в Wxwidgets. Место, где я застрял, - это прыгнуть с Марио и взять сигнал, когда Марио прыгает в воздухе. Позвольте мне прояснить ситуацию: когда игрок нажимает пробел, чтобы прыгать по вертикали, l oop, чтобы прыгать, Марио бежит, но когда игрок нажимает клавишу «d», чтобы двигаться вперед во время прыжка, он должен прыгать вперед .... Мне также нужно ваша помощь, чтобы получить два ввода одновременно, как в игре, когда мы нажимаем Shift и "W", игрок будет идти быстрее, но когда мы нажимаем только клавишу "W", игрок будет идти медленно ..

void MyFrame :: OnChar(wxKeyEvent& event){
     wxChar  uc = event.GetUnicodeKey();
           switch ( uc )
         {
             case 97:
                        tempx = x;
                        x = x - 5;
                        Check(x);
                        FindGround(x);
                        CheckForNextMove(x,y,CurrentGroundX,CurrentGroundY,PreviousGroundX,PreviousGroundY,NextGroundX,NextGroundY);
                        Refresh();
                        break;
             case 100:
                        tempx =x;
                        x = x + 5;
                        Check(x);
                        FindGround(x);
                        CheckForNextMove(x,y,CurrentGroundX,CurrentGroundY,PreviousGroundX,PreviousGroundY,NextGroundX,NextGroundY);
                        Refresh();
                        break;
            case 32:
            tempy = y;
                for(int i=0;i<=10;i++){
                    check = true;
                    tempx = x;
                    Sleep(1);
                        y=y-7;
                        x=x+5;
                        Check(x);
                        FindGround(x);
                        CheckForNextMove(x,y,CurrentGroundX,CurrentGroundY,PreviousGroundX,PreviousGroundY,NextGroundX,NextGroundY);
                        Update();
                        Refresh();
                                              }
                for(int j=0;j<=10;j++){
                    check = true;
                    tempx = x;
                    Sleep(1);
                        y=y+7;
                        x=x+5;
                        Check(x);
                        FindGround(x);
                        CheckForNextMove(x,y,CurrentGroundX,CurrentGroundY,PreviousGroundX,PreviousGroundY,NextGroundX,NextGroundY);
                        Update();
                        Refresh();
                        if(stop){ stop = false; break; }
                                              }
                        check = false;
                        Update();
                        Refresh();
                        break;
 }
event.Skip();
}

вот код, в котором нажатие клавиши пробела заставит Марио прыгнуть по пути параболи c, но я хотел сделать его более профессиональным. Я хочу, чтобы Марио прыгнул в параболе c, когда мы нажимаем две клавиши одновременно, т. Е. (Когда я нажимаю вертикальную клавишу прыжка и правую клавишу движения, тогда ему придется прыгать в правильном направлении по траектории параболы c.

1 Ответ

0 голосов
/ 15 февраля 2020

Вам нужно изменить поток управления программой, чтобы помнить только то, что клавиша была нажата или отпущена в обработчиках wxEVT_KEY_{DOWN,UP}, а не пытаться делать все в обработчике wxEVT_CHAR.

Кроме того, у вас определенно не должно быть никаких вызовов Sleep() или длительных циклов в обработчиках событий, поэтому всякий раз, когда вы думаете об их размещении, вы можете быть уверены, что что-то делаете неправильно.

...