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

_kbhit i _getch - poruszanie postacią w prostej grze - kilka znaków w buforze

Object Storage Arubacloud
0 głosów
238 wizyt
pytanie zadane 23 kwietnia 2018 w C i C++ przez Dawid Piątek Nowicjusz (120 p.)

Witam :) początkujący phoghamista 1 rok studiów, nudzi mi się na wykładach i zaczynam się bawić kodem. Co pierwsze? hmm może prosty snake? challenge accept!

Idzie mi całkiem nieźle w tym programie, ale mam jeden szczegół z którym sobie nie mogę poradzić,
mianowicie przy wciskaniu jednego klawisza z drobnym odstępem to w pętli do opoznienia on zostaje w buforze i w funkcji elegancko działa a potem się usuwa while(_kbhit())_getch();

No i fajnie, ale jak kliknie się kilka razy to chyba bufor ma np A B i odczyta A zamiast B, tak przynajmniej myślę, poradzi ktoś może coś??

 

while (true)
    {
        sterowanie(mapa, ruch, pozx, pozy);
        reload_mapy(mapa, mapa_x, mapa_y, mapa_z);
 
        Sleep(500);
    }
void sterowanie(int *** mapa, char & ruch, int &pozx, int &pozy)
{
 
    if (_kbhit())
    {
        switch (_getch())
        {
        case 'w':
            if (ruch != 's')ruch = 'w';
            break;
        case 's':
            if (ruch != 'w')ruch = 's';
            break;
        case 'a':
            if (ruch != 'd')ruch = 'a';
            break;
        case 'd':
            if (ruch != 'a')ruch = 'd';
            break;
        }
    }
    while (_kbhit())_getch();
    if (ruch == 'w' ) { mapa[pozx - 1][pozy][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozx--;  }
    if (ruch == 's' ) { mapa[pozx + 1][pozy][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozx++;  }
    if (ruch == 'a' ) { mapa[pozx][pozy - 1][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozy--;  }
    if (ruch == 'd' ) { mapa[pozx][pozy + 1][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozy++;  }
 
}

1 odpowiedź

0 głosów
odpowiedź 23 kwietnia 2018 przez Hiskiel Pasjonat (22,830 p.)

Witam.

Chodzi najpewniej o ten Sleep(500);

Po pierwsze czas wykonania obu funkcji jakiś x czas trwa, po drugie Sleep(500) raz może trwać pił sekundy raz sekundę, raz jeszcze inaczej. Lepiej zaincludować <chrono> i <thread> i napisać zamiast sleep():

this_thread::sleep_for(chrono::milliseconds(500));

 

Pozdrawiam.

Podobne pytania

0 głosów
1 odpowiedź 593 wizyt
pytanie zadane 5 maja 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
3 odpowiedzi 613 wizyt
pytanie zadane 25 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 17 stycznia 2017 w Java przez MyWash Bywalec (2,640 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...