Ich finde den fehler nicht!
-
Hi!
ich habe ein seeeeehr primitives raumschiff gezeichnet, dass ich auf dem bildschirm mit den Pfeiltasten bewegen möchte. Ich programmiere das ganze im Dev-C++, mit OpenGL\Glut! Hier die wesentlichen Codeausschnitte:
void idle() { if(buffer[27]) { exit(0); } if(buffer[75]) { move = (move - LENGTH_OF_MOVE); } if(buffer[77]) { move = (move + LENGTH_OF_MOVE); } glutPostRedisplay(); }
so und das Raumschiff, und der Rest:
void display() { glLoadIdentity(); glPushMatrix(); glTranslatef(move,0.0f,0.0f); glBegin(GL_POLYGON); glVertex3f(-0.09f,-0.10f, 0.00f); glVertex3f(-0.06f, 0.05f, 0.00f); glVertex3f(-0.04f, 0.02f, 0.00f); glVertex3f(-0.02f, 0.07f, 0.00f); glVertex3f( 0.00f, 0.08f, 0.00f); glVertex3f( 0.02f, 0.07f, 0.00f); glVertex3f( 0.04f, 0.02f, 0.00f); glVertex3f( 0.06f, 0.05f, 0.00f); glVertex3f( 0.09f,-0.10f, 0.00f); glVertex3f( 0.04f,-0.10f, 0.00f); glVertex3f( 0.00f,-0.07f, 0.00f); glVertex3f(-0.04f,-0.10f, 0.00f); glEnd(); glPopMatrix(); glFlush(); glutSwapBuffers(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); move = 0.0f; }
Nun wenn ich das Programm starte, bewegt sich das Raumschiff kein stück
Was mache ich da falsch??
Danke im Voraus für eure hilfe!
-
du bewegst es zwar doch im nächsten frame setzt du das schiff wieder zurück.
-
das move=0.00f hab ich jetzt wegkommentiert, immernoch der selbe fehler, es tut sich nix
-
und dann hätt ich noch eine frage warum stellt glut mir die auflüsung nicht um?
(ich erkenne das an der Größe des Mauszeigers)int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutGameModeString("800x600:16@75"); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("Leis - FENSTER"); glutFullScreen(); init(); glutIdleFunc(idle); glutDisplayFunc(display); glutKeyboardFunc(key_down); glutKeyboardUpFunc(key_up); glutMainLoop(); return 0; }
-
welchen Typ hat move und LENGTH_OF_MOVE?
-
float move = 0.0f; #define LENGHT_OF_MOVE 0.1f
-
bist du sicher das idle() aufgerufen wird? Mehr kann ich dir leider nicht im Moment helfen, habe zwar Glut + Doku da, aber benutze es nicht.
-
Du lädst die Einheitsmatrix und pushed diese auf den stack?!
für was das?Versuch mal
glLoadIdentity();
glPopMatrix();
glTranslatef(move,0.0f,0.0f);
glBegin(GL_POLYGON);
glVertex3f(-0.09f,-0.10f, 0.00f);
glVertex3f(-0.06f, 0.05f, 0.00f);
glVertex3f(-0.04f, 0.02f, 0.00f);
glVertex3f(-0.02f, 0.07f, 0.00f);glVertex3f( 0.00f, 0.08f, 0.00f);
glVertex3f( 0.02f, 0.07f, 0.00f);
glVertex3f( 0.04f, 0.02f, 0.00f);
glVertex3f( 0.06f, 0.05f, 0.00f);
glVertex3f( 0.09f,-0.10f, 0.00f);glVertex3f( 0.04f,-0.10f, 0.00f);
glVertex3f( 0.00f,-0.07f, 0.00f);
glVertex3f(-0.04f,-0.10f, 0.00f);
glEnd();
glPushMatrix();So müsste es funktionieren...
ich mach das positionieren von objekten so (so geht es fix :D):
Camera Setup
glPushMatrix();und dann beim zeichnen von jedem Objekt:
glLoadIdentity();
glPopMatrix();
glPushMatrix():
glTranslate():
//Rotate, scale ...
//Objekt zeichnen
-
die funktion idle wird aufgerufen. Das Rauschiff wird ja auch gerendert.
irgendwie verstehe ich das noch nicht ganz..., aber wenn ich das so mache:
glLoadIdentity(); glPopMatrix(); glTranslatef(move,0.0f,0.0f); glBegin(GL_POLYGON); glVertex3f(-0.09f,-0.10f, 0.00f); glVertex3f(-0.06f, 0.05f, 0.00f); glVertex3f(-0.04f, 0.02f, 0.00f); glVertex3f(-0.02f, 0.07f, 0.00f); glVertex3f( 0.00f, 0.08f, 0.00f); glVertex3f( 0.02f, 0.07f, 0.00f); glVertex3f( 0.04f, 0.02f, 0.00f); glVertex3f( 0.06f, 0.05f, 0.00f); glVertex3f( 0.09f,-0.10f, 0.00f); glVertex3f( 0.04f,-0.10f, 0.00f); glVertex3f( 0.00f,-0.07f, 0.00f); glVertex3f(-0.04f,-0.10f, 0.00f); glEnd(); glPushMatrix();
habe ich immer noch das problem
-
dann schau mal ob sich der wert von "move" auch wirklich ändert...
-
ich habe jetzt mal das mit reinprogrammiert:
cout << move << endl;
jetzt verschwindet das raumschiff sofort nach rechts, und ich schau in die konsole (die ja bei glut mitläuft) und der wert steigt permanent!?!?
wenn ich das cout wieder herausnehme ist das gleiche wie vorher. ich glaub ich gebe es auf, was verdammt nochmal ist jetzt schon wieder los???!!!
-
Wo rufst du denn "glutenterGameMode" auf?
greets,
cNc (der keine lust hatte sich einzuloggn)
-
Achso, wenn möglich, poste mal den gesamten code, dann geh ich auf fehlersuche ^^
-
#include <windows.h> #include <GL\glut.h> #include <iostream.h> /* D E C L A R E =============== Variablendeklarination */ #define LENGTH_OF_MOVE 0.1f char buffer[12]; float move = 0.0f; /* K E Y _ D O W N =============== Testen ob Taste gedrückt ist */ void key_down(unsigned char key, int x, int y) { buffer[key]=1; } void key_up(unsigned char key, int x, int y) { buffer[key]=0; } /* I N I T =============== Initialisierungsfunktion */ void init() { glClearColor(0,0,0,0); glColor3f(1,1,1); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glMatrixMode(GL_MODELVIEW); } /* I D L E =============== Auswertung der Tasten die gedrückt wurden */ void idle() { if(buffer[27]) { exit(0); } if(buffer[75]) { move = (move - 0.1f); } if(buffer[77]) { move = (move + 0.1f); } glutPostRedisplay(); } /* D I S P L A Y =============== Ausgabefunktion der Primitiven usw. Renderer Funktion */ void display() { glLoadIdentity(); glPopMatrix(); glTranslatef(move,0.0f,0.0f); //cout << move << endl; glBegin(GL_POLYGON); glVertex3f(-0.09f,-0.10f, 0.00f); glVertex3f(-0.06f, 0.05f, 0.00f); glVertex3f(-0.04f, 0.02f, 0.00f); glVertex3f(-0.02f, 0.07f, 0.00f); glVertex3f( 0.00f, 0.08f, 0.00f); glVertex3f( 0.02f, 0.07f, 0.00f); glVertex3f( 0.04f, 0.02f, 0.00f); glVertex3f( 0.06f, 0.05f, 0.00f); glVertex3f( 0.09f,-0.10f, 0.00f); glVertex3f( 0.04f,-0.10f, 0.00f); glVertex3f( 0.00f,-0.07f, 0.00f); glVertex3f(-0.04f,-0.10f, 0.00f); glEnd(); glPushMatrix(); glFlush(); glutSwapBuffers(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //move = 0.0f; } /* M A I N =============== Hauptfunktion des Programmes, Haupteintrittspunkt von hier werden alle Prozesse gesteuert */ int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutGameModeString("800x600:16@75"); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("Leis - FENSTER"); glutFullScreen(); init(); glutIdleFunc(idle); glutDisplayFunc(display); glutKeyboardFunc(key_down); glutKeyboardUpFunc(key_up); glutMainLoop(); return 0; }
-
Buffer geht nur bis 11 und nicht bis 77.
-
hab den Puffer auf 100 geändert es klappt immer noch nicht
-
wo wird denn die idle() funktion aufgerufen?
-
cpt.oneeye schrieb:
}
wo wird denn die idle() funktion aufgerufen?eXpEdItIoN-gEfOrCe!! schrieb:
glutIdleFunc(idle);
als callback hier
-
Wenn du sagst, das das Raumschiff nach einem cout sofort nach rechts verschwindet, kanns eigentlich nur ne falsche Verlinkung des input-output sein
und ändere den buffer auf 255
-
hmmm.. anscheinend mag mich opengl nicht so