Pfeiltasten-Abfrage

Schnelle objektorientierte, kompilierende Programmiersprache.
Mampf111
Beiträge: 24
Registriert: Mi Feb 05, 2014 9:59 am
Wohnort: Bielefeld

Pfeiltasten-Abfrage

Beitrag von Mampf111 » Fr Feb 14, 2014 9:00 am

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ß!

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Pfeiltasten-Abfrage

Beitrag von cloidnerux » Fr Feb 14, 2014 9:33 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Pfeiltasten-Abfrage

Beitrag von mfro » Fr Feb 14, 2014 9:40 am

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?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Pfeiltasten-Abfrage

Beitrag von cloidnerux » Fr Feb 14, 2014 9:54 am

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Pfeiltasten-Abfrage

Beitrag von nufan » Fr Feb 14, 2014 10:15 am

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

Mampf111
Beiträge: 24
Registriert: Mi Feb 05, 2014 9:59 am
Wohnort: Bielefeld

Re: Pfeiltasten-Abfrage

Beitrag von Mampf111 » Fr Feb 14, 2014 10:26 am

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?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Pfeiltasten-Abfrage

Beitrag von cloidnerux » Fr Feb 14, 2014 10:32 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Pfeiltasten-Abfrage

Beitrag von nufan » Fr Feb 14, 2014 10:36 am

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

Code: Alles auswählen

extern "C"
dem C-Compiler zugänglich gemacht worden.

Mampf111
Beiträge: 24
Registriert: Mi Feb 05, 2014 9:59 am
Wohnort: Bielefeld

Re: Pfeiltasten-Abfrage

Beitrag von Mampf111 » Fr Feb 14, 2014 11:08 am

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;
}

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Pfeiltasten-Abfrage

Beitrag von mfro » Fr Feb 14, 2014 1:04 pm

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten