Klawiatura - 2 przyciski naraz

0

Problem jest zapewne banalny.. ale nigdzie nie moge znalezc odpowiedzi. Chodzi mi o to aby klawiatura zachowywala sie tak jak podczas gry np w need for speeda.. Jesli nadusimy strzalke do przodu i w prawo to samochod pojedzie prosto i w prawo, jesli w tym momencie puscimy strzalke w prawo samochod pojedzie prosto.. Czyli w gruncie rzeczy chodzi o to aby wczytywac 2 i wiecej wcisnietych klawiszy jednoczesnie. Probowalem tak:

int main(){
    int i=0;
    while(i!=27){
               i=getch();
               printf("%d\n", i);}
    return 0;
    }

Niestety przy wduszonych 2 przyciskach naraz.. tylko jeden jest wczytywany :( W jaki sposob sobie z tym poradzic??? :/

0

Witam,
Nie wiem czy będzie to idealne rozwiązanie ale powino pomóc. Problem ten można rozwiazać dwa razy musisz odczytać stan klawisza. Po między odczytami wstawić pętlę do-while (pusta), która ma tylko czekać tak długo aż użytkownik naciśnie pierwszy klawisz.
Mając dwa odczyty klawiszy wstawiasz nastepnie odp warunek if i problem rozwiązany.
PS. Pętla do-while jest lepsza od delay ale to na pewno juz wiesz.

0

Musisz pobawić się tym na poziomie sterownika klawiatury. Klawiatura bowiem przekazuje informacje typu: klawisz 23 został wciśnięty, klawisz 23 został puszczony itp. - dopiero sterownik tłumaczy to na swój język (użytkownik wcisnął klawisz 'q' i trzyma go już 200ms etc.). Gdy będziesz odbierał informacje BEZPOŚREDNIO od klawiatury (tzw. tryb RAW, łatwo dostępny m.in. w ncurses), będziesz mógł rozwiązać swój problem.

Pozdrawiam,
Paweł S.

0

nie sadzilem ze to az takie skomplikowane.. :/ ma ktos moze przykladzik jak to zrobic za pomoca ncurses i raw()? jakos niezbyt sobie z tym potrafie poradzic :(

0

nooo.. udalo sie! zrobilem tak:

#include <windows.h>
#include <stdio.h>

int main(){
    int i=0;
    BYTE klawisze[256];
    GetKeyboardState(klawisze);
    if(klawisze[VK_LEFT] & 0x80) printf("strzalka w lewo jest wcisnieta");
    if(klawisze[VK_RIGHT] & 0x80) printf("strzalka w prawo tez");
    return 0;
    }

dziala tak jak powinno :] GetKeyboardState zrzuca do tablicy stan wszystkich klawiszy.. wystarczylo pogooglowac.. Najwiekszy problem to wpisanie odpowiedniego hasla w googlach ;] bo trudno ujac ten problem w kilku slowach :] w kazdym razie najwazniejsze ze dziala! dziekuje wszystkim za pomoc!

0

I chcesz tak co chwile w jakiejś pętli sprawdzać stan klawiszy ?
Użyj ReadConsoleInput, to tak jak getch() tyle że dostajesz dodatkowe informacje tj. jaki klawaisz, czy jest wciskany czy zwalniany oraz ilość autopowtórzeń wciśnięcia, nic skomplikowanego.

#include<windows.h>
#include<iostream>

using namespace std;

void klawisz(KEY_EVENT_RECORD* key)
{
    if(key->bKeyDown) cout << "wciśnięto";
    else cout << "zwolniono";
    cout << " klawisz, vk: " << key->wVirtualKeyCode << " ascii: " << key->uChar.AsciiChar << endl;
}

int main()
{
    DWORD num;
    INPUT_RECORD input[128];
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);

    while (1)
    {
        ReadConsoleInput(hIn, input, 128, &num);
        for(int i = 0; i < num; i++)
        {
            if(input[i].EventType == KEY_EVENT)
                klawisz(&(input[i].Event.KeyEvent));
        }
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1