Seite 1 von 2
Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 9:00 am
von Mampf111
Schönen guten Tag!
Ich habe mich mal an die Programmierung eines Snake-Spieles gewagt.
Soweit bin ich mit dem Ergebnis mehr als zufrieden.
Allerdings ist noch eine kleine Sache die mich stört:
Ich frage derzeit die Pfeiltasten mit dieser Funktion ab:
Code: Alles auswählen
if(kbhit()){
pressed_key=key_input();
if((pressed_key==KEY_UP && direction!=KEY_DOWN) ||
(pressed_key==KEY_RIGHT && direction!=KEY_LEFT) ||
(pressed_key==KEY_DOWN && direction!=KEY_UP) ||
(pressed_key==KEY_LEFT && direction!=KEY_RIGHT))
{
direction=pressed_key;
}
}
Code: Alles auswählen
char key_input()
{
char ch;
ch=getch();
ch=getch();
return ch;
}
Mein Problem ist, dass sich (wahrscheinlich durch den doppelten Aufruf von getch()) das Spiel durch drücken einer anderen Taste außer der Pfeiltasten pausieren lässt...
Mache ich nur eine getch() abfrage erkennt das Programm die Eingabe erst bei dem zweiten Durchlauf. Daraus ergibt sich, dass die Schlange eine zu lange Reaktionszeit auf die Eingabe hat.
Gibt es eine andere/bessere Möglichkeit dieses Problem anzugehen?
Gruß!
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 9:33 am
von cloidnerux
Gibt es eine andere/bessere Möglichkeit dieses Problem anzugehen?
Nicht "getch" verwenden, das ist ~BÖSE~.
Der einfachste Weg wird SDL sein. Alles andere erfordert, dass du direkt mit dem Betriebssystem/Tastaturtreiber kommunizierst.
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 9:40 am
von mfro
cloidnerux hat geschrieben:Gibt es eine andere/bessere Möglichkeit dieses Problem anzugehen?
Nicht "getch" verwenden, das ist ~BÖSE~.
Der einfachste Weg wird SDL sein. Alles andere erfordert, dass du direkt mit dem Betriebssystem/Tastaturtreiber kommunizierst.
Wieso ist getch() böse?
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 9:54 am
von cloidnerux
Wieso ist getch() böse?
Es ist so böse wie nicht an einem Stop-Schild zu halten.
Das Problem mit getch ist, dass es in der conio.h definiert ist, die aber nicht teil irgendeines Standards ist und fast ausschließlich auf Windows zu finden ist.
Es ist mitunter nicht einmal einheitlich, was man alles in der conio.h finden wird.
http://en.wikipedia.org/wiki/Conio.h
Es gab da sogar ein Nützlichen Link für das Thema hier:
http://c-faq.com/osdep/cbreak.html
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 10:15 am
von nufan
Hallo
Ca. 5,5 Jahre später ein Link auf den allerersten Thread in diesem Unterforum ^^
http://www.proggen.org/forum/viewtopic.php?f=21&t=81
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 10:26 am
von Mampf111
So ganz konnte ich da jetzt leider keine Lösung entnehmen.. soweit ich mitbekommen hat ist SDL für C++, ode rgeht es auch für C?
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 10:32 am
von cloidnerux
soweit ich mitbekommen hat ist SDL für C++, ode rgeht es auch für C?
libssl.org hat geschrieben:SDL is written in C, works natively with C++
Es funktioniert auch in C. Ansonsten ist das kein Problem, dein C++ Compiler versteht auch C.
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 10:36 am
von nufan
cloidnerux hat geschrieben:libsdl.org hat geschrieben:SDL is written in C, works natively with C++
Ich muss zugeben das überrascht mich etwas, ich hätte genau das Gegenteil erwartet. Die Teile von SDL an denen ich mal gewerkelt hab waren soweit ich mich erinnern kann in C++ geschrieben und über
dem C-Compiler zugänglich gemacht worden.
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 11:08 am
von Mampf111
Okay, dann werde ich das mal ausprobieren!
Allerdings habe ich jetzt nebeibei noch eine andere Lösung gefunden, die mein Problem ebenfalls löst.
Nur vielleicht nicht so schön wie es SDL tun würde...
Code: Alles auswählen
int key_input()
{
int ch=0;
while(ch==0 || ch==224){
ch=getch();
if(ch==0 || ch==224){
ch=getch();
if(ch==KEY_UP ||
ch==KEY_DOWN ||
ch==KEY_RIGHT ||
ch==KEY_LEFT)
{
break;
}
}
}
return ch;
}
Re: Pfeiltasten-Abfrage
Verfasst: Fr Feb 14, 2014 1:04 pm
von mfro
cloidnerux hat geschrieben:Wieso ist getch() böse?
Es ist so böse wie nicht an einem Stop-Schild zu halten.
Das Problem mit getch ist, dass es in der conio.h definiert ist, die aber nicht teil irgendeines Standards ist und fast ausschließlich auf Windows zu finden ist.
Es ist mitunter nicht einmal einheitlich, was man alles in der conio.h finden wird.
http://en.wikipedia.org/wiki/Conio.h
Es gab da sogar ein Nützlichen Link für das Thema hier:
http://c-faq.com/osdep/cbreak.html
Da scheinen wir ein wenig aneinander vorbeizureden.
"Mein" getch() ist nicht in conio.h definiert und durchaus ein Standard.
"Mein" getch() (und das ist wohl auch das, um das es hier geht) stammt aus curses.h bzw. der curses-Library und das bzw. die ist standardisiert, seit es UNIX System V Version 4 gibt (also seit grob mindestens etwa 25 Jahren, auch wenn es die curses-Libraries schon sehr viel länger gibt). Es funktioniert auch anders als die ursprünglich auf einem DOS-Aufruf aufsetzende Windows-Variante.