Tasterturabfrage mit Opengl



  • Hallo leute,
    also mein Problem ist das ich mit Opengl ein spiel (4 gewinnt) programmieren möchte. Ich habe mir das so vorgestellt das über den "Gerüst" ein Dreieck ist das anzeigt in welche Spalte man seinen Stein werfen würde. Dazu habe ich gedacht mache ich das mit kbhit() und getch(). Nur ich habe halt ein Konsolen Programm im Hintergrund. Wenn ich also das Opengl-Fenster im Vordergrund habe kann ich keine Tasten einlesen. Bzw. ich weis nicht wie es geht. Ich muss immer erst auf das Konsolen-Fenster Klicken und kann dann eine Eingabe machen.
    Also nun endlich zu meiner Frage.

    Kann ich ohne auf die Konsole zu wechseln mit kbhit und getch das dreieck im vordergrund verrücken? Wenn ja wie, wenn nicht wie sollte ich es dann machen?

    Ich habe mir die Tuts von Nehe schon zum teil angeschaut. Ich blick nur nicht so ganz durch. Der macht das mit der Tasterturabfrage ja ganz anderes. Nur ich denke dazu braucht man WinAPI oder so ?!

    Würde mich um Hilfe freuen. Jetzt noch mein derweiliger (Überhaupt garkein bischen fertiger) Code.

    #include <stdio.h>
    #include "glut.h"
    #include <conio.h>
    
    #pragma comment(lib, "glut32.lib")
    #pragma comment(lib, "opengl32.lib")
    
    void init(void);
    void display(void);
    void feld(void);
    int taste(void);
    
    int main(int argc,char **argv)
    {
    
    	glutInit(&argc,argv);
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    	glutInitWindowSize(450,400); 
    	glutInitWindowPosition(50,50);
    	glutCreateWindow("4");
    	init();
    	glutDisplayFunc(display); 
    	glutMainLoop();
    
    	return 0;
    }
    
    void init(void)
    {	
    
    	glClearColor(1.0, 1.0, 1.0, 0.0);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glOrtho(0,9,0,8,0,10); //links oder rechts müssen ungleich null sein ; hoch oder runter müssen ungleich null sein ; weit oder nah müssen ungleich null sein
    }	
    
    void display(void)
    {
    	int welchetaste;
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	glColor3ub(0, 0, 0);
    
    	feld();
    
    	glutSwapBuffers();
    
    	welchetaste = taste();
    	printf("welchetaste = %d",welchetaste);
    }
    
    int taste(void)
    {
    	int rueck = 0;
    
    	while(rueck == 0)
    	{
    		rueck = kbhit();
    	}
    
    	rueck = getch();
    	rueck = getch();
    	return(rueck);
    
    }
    
    void feld(void)
    {
    	//vertikal
    	glBegin(GL_LINES);
    		glVertex2i(1,1);
    		glVertex2i(1,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(2,1);
    		glVertex2i(2,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(3,1);
    		glVertex2i(3,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(4,1);
    		glVertex2i(4,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(5,1);
    		glVertex2i(5,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(6,1);
    		glVertex2i(6,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(7,1);
    		glVertex2i(7,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(8,1);
    		glVertex2i(8,7);
    	glEnd();
    
    	//horizontal
    
    	glBegin(GL_LINES);
    		glVertex2i(1,7);
    		glVertex2i(8,7);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,6);
    		glVertex2i(8,6);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,5);
    		glVertex2i(8,5);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,4);
    		glVertex2i(8,4);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,3);
    		glVertex2i(8,3);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,2);
    		glVertex2i(8,2);
    	glEnd();
    
    	glBegin(GL_LINES);
    		glVertex2i(1,1);
    		glVertex2i(8,1);
    	glEnd();
    
    }
    

    MfG Ernd



  • Wenn ich Du wär, würd ich das mit SDL (statt glut) lösen. Da ist Tastatur/Maus-Abfrage sehr einfach. SDL ist eh die bessere Wahl, glut wird (soviel ich weiss) auch nicht mehr weiterentwickelt..



  • Ja danke für den Hinweis. Glut kam mir sowieso schon bischen komisch vor.
    Aber gl und glu ist ok oder ?!



  • Ernd schrieb:

    Ja danke für den Hinweis. Glut kam mir sowieso schon bischen komisch vor.
    Aber gl und glu ist ok oder ?!

    Jup, das ist ok. dazu kommt dann noch SDL. Auf www.libsdl.org hats auch ne Doku und tuts und so...



  • Ich habe mir jetzt SDL runtergeladen und kann es auch kompilieren. Nur ich habe 6 Linker fehler. 2001. Und ich weis nicht wie ich die weg bekommen 😞
    .



  • brauchst doch nicht selber kompilieren.
    http://www.libsdl.org/download-1.2.php "Development Libraries:"



  • Ahhh das habe ich übersehen das es dort noch libarys gibt.
    Jetzt einfach mit pragma einbinden. Denk ich
    Vielen Dank.



  • Ich habe die libs jetzt eingefügt. Es kommen aber immer noch Fehler.

    --------------------Konfiguration: 1prog - Win32 Debug--------------------
    Kompilierung läuft...
    1prog.cpp
    Linker-Vorgang läuft...
    LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main
    Debug/1prog.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    1prog.exe - 2 Fehler, 0 Warnung(en)



  • du musst ein konsolen projekt erstellen oder main undefen



  • durito schrieb:

    Wenn ich Du wär, würd ich das mit SDL (statt glut) lösen.

    Oder mit dem tollen DirectInput!

    Bye, TGGC \-/



  • Ein Konsolen Programm habe ich schon die ganze Zeit. Und die Funktion main undefen? ich denke mal du meinst damit die präprozessor anweisung ?! Wobei ich grd drüber nachgedachte habe und glaube das du was anderes meinst, weil mn ja keine Funktionen mit den Präprozesor "behandelt".
    Ähm keine Ahnung 😕



  • TGGC schrieb:

    durito schrieb:

    Wenn ich Du wär, würd ich das mit SDL (statt glut) lösen.

    Oder mit dem tollen DirectInput!

    Bye, TGGC \-/

    Ne bestimmt nicht. Auch Unix/Linux-User spielen Vier gewinnt.. SDL ist ne gute Sache.



  • Ok ich bin dumm ;).
    Nur jetzt ... kommt ne Fehlermeldung.

    sdl1.exe - Fehler in Anwendung

    rot ausgefüllter kreis mit ein weissen x drin.
    Die Anweisung in "0x002436e5" verweist auf Speicher in "0x00000110". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.

    Klicken Sie auf "OK",um die Anwendung zu beenden
    Klicken Sie auf "Abbrechen", um die Anwendung zu debuggen.

    hmmmm. SDL funktz einfach nicht! Das Debuggen kann ich ganz und garnicht!



  • Dochdoch, SDL tut schon..
    k.A. woran das liegt, ich hab noch nie unter Win SDL verwendet.

    PS: Mir ist heute auch n'schweinischer Fehler unterlaufen mit SDL. Warum kann jeweils nur der Thread der die Grafik initialisiert diese dann auch einsetzen?... Gemeinheit.. 😉



  • Einer Deiner Zeiger zeigt ins Nirwana...



  • Danke für den Hinweis @ Sgt.Nukem .



  • durito schrieb:

    TGGC schrieb:

    durito schrieb:

    Wenn ich Du wär, würd ich das mit SDL (statt glut) lösen.

    Oder mit dem tollen DirectInput!

    Bye, TGGC \-/

    Ne bestimmt nicht. Auch Unix/Linux-User spielen Vier gewinnt.. SDL ist ne gute Sache.

    Lieber 'n Scheiss programmiert, der nur unter Windows läuft, als was Supertolles, was nie fertig ist.

    Bye, TGGC \-/



  • TGGC schrieb:

    Lieber 'n Scheiss programmiert, der nur unter Windows läuft, als was Supertolles, was nie fertig ist.

    Naja, so kompliziert ist SDL bestimmt nicht..
    Stimmt schon, solang man nur Games programmiert würde ich auch Win/DirectX verwenden. Aber sobald Du mal was anderes machen musst, n'Simulator oder irgendsowas, wirst Du eh auch mit ner anderen Welt als Windows in Kontakt kommen, und da ists nicht schlecht, wenn man schon was kennt, das überall einsetzbar ist... Aber ich glaub diese Diskussion wurde schon zur Genüge geführt.. *g*



  • bei der glut gibt es eigene call-back funktionen für die tastatur abfrage.. bespiel gibts in der docu ( -> google)

    edit:
    bsp:

    void keys(unsigned char k,int x,int y)
    {
    	switch(k)
    	{
    		case '+':	parameter+=step;
    				break;
    		case '-':	parameter-=step;
    				break;
    		case 'a':	yangel+=1;
    				break;
    		case 's':	yangel-=1;
    				break;
    
    	}
    }
    

    in deiner main musst du dann noch ein

    glutKeyboardFunc(keys);
    

    machen vor deinen glutMainloop



  • Vielen Dank für den Hinweis xroads42.
    Ich werde mich erst noch ein bischen mit glut beschäftigen bevor ich jetzt mit sdl anfange und glut nur zur hälfte gelernt habe.


Anmelden zum Antworten