• 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
551 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 (269,120 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 962 wizyt
pytanie zadane 26 lipca 2019 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 1,081 wizyt
pytanie zadane 31 lipca 2015 w C i C++ przez alfred Początkujący (270 p.)
0 głosów
1 odpowiedź 771 wizyt
pytanie zadane 13 sierpnia 2018 w C i C++ przez Ogleirduwa Nowicjusz (170 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...