• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

kiedy klawisz nie jest trzymany (conio.h)

VPS Starter Arubacloud
0 głosów
663 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)

jak sprawdzić kiedy żaden klawisz nie jest przyciśnięty

getch() pozwala sprawdzić czy określony klawisz jest wciśnięty i można by było sprawdzić to dla wszystkich klawiszy ale to było by bez sensu.

próbowałem też coś takiego:

bool isPressed;

while(true)
{
isPressed= kbhit();
cout<<isPressed<<endl;
}

ale po ponownym naciśnięciu jakiegoś przycisku isPressed wynosił nadal 1?

co robię źle?
może jest jakaś funkcja która rozwiązuje problem?

pytanie wydaje się błahe i pewnie takie jest ale proszę o pomoc, nie udało mi się znaleźć odpowiedzi, pewnie dlatego, że dla wyszukiwarki is i is not są bardzo podobne :)

2 odpowiedzi

0 głosów
odpowiedź 6 maja 2017 przez Wiciorny Ekspert (277,460 p.)

spróbuj z opcji sprawdzania czy wejśćie STD::CIN>> np jest puste lub nie :D 

np. 

cin >> radius;
if(!cin){
    cout << "Bad value!";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin >> radius;
}

bardzo kompinuj w stronę tego, czy stumień danych posiada jakąs wartość, tzn coś było wciśnięte. Pamiętaj o czyszczeniu tego, bo przy ponownych uruchomieniach, możesz mieć to co poprzednio :D zostało.

 

Edit: a co do problemu szczególnie dla twojego przypadku zajrzyj http://stackoverflow.com/questions/41600981/how-to-check-if-a-key-is-pressed 

komentarz 6 maja 2017 przez Pajdas Mądrala (5,930 p.)

dzięki, ale to cin >> radius; na początku oczekuje na wczytanie wartości i potwierdzenie ENTER, a ja właśnie chcę tego uniknąć

komentarz 6 maja 2017 przez Pajdas Mądrala (5,930 p.)
edycja 6 maja 2017 przez Pajdas

chodzi mi o to, aby rozpoznawać kiedy żaden przycisk nie jest wciśnięty

mam taki prosty kod:

enum Keyboard
{
    W,
    S,
    A,
    D,
    Null
};
int main()
{
    Keyboard WSAD;
    
    char znak;
    
    while(true)
    {
        znak = getch();

        switch(znak)
        {
        case 'w':
            if(WSAD!=W)
            {
                WSAD = W;
                cout<<"tutaj W"<<endl;
            }break;
        case 's':
            if(WSAD!=S)
            {
                WSAD = S;
                cout<<"tutaj S"<<endl;
            }break;
        case 'a':
            if(WSAD!=A)
            {
                WSAD = A;
                cout<<"tutaj A"<<endl;
            }break;
        case 'd':
            if(WSAD!=D)
            {
                WSAD = D;
                cout<<"tutaj D"<<endl;
            }break;
        }
    }
    return 0;
}

kiedy kolejny raz nacisnę ten sam przycisk np. W nacisnę po W, to nic mi się nie wyświetla, a muszę wykonywać if(WSAD!=W) ponieważ nie chcę aby ciągłe trzymanie W dawało true.

Wystarczy, że kiedy żaden klawisz nie będzie wciśnięty i WSAD zaznaczę jako Null, w tedy WSAD != W, bo równa się Null i sprawa załatwiona

ps.

default:
            WSAD = Null;
            break;

taki kod nie rozwiązuje sprawy bo spełnia się gdy nacisnę np. b, a nie kiedy nie naciskam nic

 

W SFML używałem ! isKeyPressed() i wiedziałem wtedy, że klawisz nie jest wciśnięty, potrzebuję właśnie czegoś takiego, żebym wiedział kiedy klawisz jest a kiedy nie jest wciśnięty

0 głosów
odpowiedź 7 maja 2017 przez Gankkah Użytkownik (720 p.)

Zamiast wypisywać na ekran zrób tak:

if(!kbhit())
{
     //Instrukcje w przypadku nie wciśnięcia klawisza.
}

 

komentarz 7 maja 2017 przez Pajdas Mądrala (5,930 p.)
kbhit() i getch() nie działa pisałem o tym w komentarzu wiciorny
komentarz 15 maja 2017 przez Gankkah Użytkownik (720 p.)

A taki kod podziała?

#include <conio.h>

//---------------------------

if(kbhit())
{
      switch(tolower(getch()))
      {
            case 'w':
                   WASD = W;
            break;
            case 'a':
                   WASD = A;
            break;
            case 's':
                   WASD = S;
            break;
            case 'd':
                   WASD = D;
            break;
           default:
                   WASD = Null;
            break;
      }
} else
{
       WASD = Null;
}

 

komentarz 17 maja 2017 przez Pajdas Mądrala (5,930 p.)
kod podziała :) ale nie tak jak chciałem, naciśnięcie jakiegokolwiek przycisku poskutkuje ustawieniem WASD na null
komentarz 20 maja 2017 przez Gankkah Użytkownik (720 p.)
Nie zobaczyłeś bloku else?

Podobne pytania

0 głosów
0 odpowiedzi 1,192 wizyt
pytanie zadane 26 lipca 2019 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 1,298 wizyt
pytanie zadane 31 lipca 2015 w C i C++ przez alfred Początkujący (270 p.)
0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 19 kwietnia w C i C++ przez TomJun Nowicjusz (190 p.)

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

62,350 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...