OpenGl Fragen



  • Hey all,
    Ich programmiere gerade ein kleines Pingpongspiel mit OpenGl. Das Fenster wird schon im Volbild angezeigt, und jetzt wollte ich noch ein kleines Hauptmenü machen. Also mit Buttons wie "Start", "Beenden" und "Optionen". Bei mir sind das erstmal einfache Rechtecke.
    Außerdem wollte ich gleich dazu noch die Maus einbinden.
    Ich fange die Mausposition mit:

    POINT mPos;	
    GetCursorPos(&mPos);
    

    ab, und ob der Mauszeiger über dem Rechteck des Buttons ist, frage ich in der if-Abfrage:

    if ((mPos.x > posx) & (mPos.x < posx+0.1) & (mPos.y > posy) & (mPos.y < posy+0.02))
    

    ab. Posx und posy ist die Fensterposition des Buttons. Mein Problem ist jetzt, dass ich nicht weiß, wie ich nun abfrage ob die linke Maustaste gedrückt wurde. Bis jetzt habe ich das mit:

    if (mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0))
    

    probiert, jedoch klappt das nicht. Der Compiler sagt dann:
    "error C2451: Bedingter Ausdruck des Typs 'void' nicht zulässig"

    kann mir jemand sagen, wie ich das mache?

    ich danke für jede Antwort,

    Pablo



  • Da mouse_event als Rückgavetyp void hat, kann der Code nicht kompilieren.

    Zum Abfragen der Mausbuttons könntest du entweder die Maus-Events (WM_LBUTTONDOWN etc.) der Windows Callback Funktion benutzen oder GetAsyncKeyState().



  • hi this->that,

    danke vielmals. Klappt jetzt.

    Gruß, Pablo



  • Und kann mir noch jemand sagen wie ich die Mausposition auf dem Fenster ausgeben lassen kann? Die Position des Zeigers ist nämlich vom Datentyp long, und um etwas auf dem Bildschirm ausgeben zu lassen brauche ich eine const char * variable.

    gibt es einen befehl mit dem ich die convertieren lassen kann?

    ich habe schon:

    (char)*zu konvertierende variable*
    

    ausprobiert, aber das klappt nicht.



  • Hat nichts mit Grafikprogrammierung zu tun und kommt darauf an, ob Du C, C++ und welche Libs/Toolkits Du einsetzt.

    Kleinster gemeinsamer Nenner:

    char text[80];
    int nummer= 12345;
    sprintf(text, "zahl: %d", nummer);
    


  • Hey hellihjb,
    danke, das klappt jetzt auch. Jedoch habe ich schon wieder ein "kleines" Problem.

    Und zwar hat das mit dieser Abfrage zu tun:

    if (WM_LBUTTONDOWN)
    

    Die Abfrage soll schauen, ob die linke Maustaste gedrückt wurde. Wenn ja, soll er das Programm beenden.
    Mein Problem: Wenn ich mit der Maus über den Button komme, dann beendet das Programm, auch wenn ich nicht die Maustaste gedrückt habe.

    Woran kann das liegen?

    Gruß,
    Pablo



  • if (WM_LBUTTONDOWN)
    

    "WM_LBUTTONDOWN" spezifiziert die konstante ID einer Window-Message. Da diese nicht 0 ist wird sie als "true" interpretiert und der davon abhaengige Code *immer* ausgefuehrt.
    Du moechtest aber pruefen, ob die ID der Message gleich "WM_LBUTTONDOWN" ist.
    Wie bereits erwaehnt handelt es sich dabei um grundlegende Verstaendnisfragen zu C; dafuer gibt es geeignetere Unterforen.



  • hallo hellihjb,

    okay, ich vergaß zu erwähnen dass ich C++ einsetze.
    Das mit den ID's der Window-Messages habe ich aber leider nicht richtig verstanden. Könntest du oder irgendwer dies nochmal bitte erklären, oder mir einen Link geben wo etwas dazu steht? Ich habe bis jetzt noch nie etwas mit den ID's zu tun gehabt.

    Aber wenn du sagst, dass das zum Grundwissen gehört, dann werde ich mich in die ID's der Window-Messages selbstverständlich einlesen.

    Gruß,
    Pablo



  • Aber wenn du sagst, dass das zum Grundwissen gehört [...]

    Vielleicht liesst Du einfach nochmal was ich geschrieben habe.
    In diesem Teil des Forums geht es ja um Grafikprogrammierung; hier finden sich sicher nur sehr wenige die Dir den Syntax des "if" Befehls erlaeutern moechten.

    Könntest du dies nochmal bitte erklären, oder mir einen Link geben wo etwas dazu steht?

    Klar, hier.



  • Mir ist die Syntax einer if-Anweisung durchaus klar, und ich habe es schonmal mit:

    if (WM_LBUTTONDOWN == TRUE)
    

    probiert, was aber auch nicht funktioniert hatte. (Was mich nicht sehr verwundert hatte)

    Aber danke für den Link, er hat mir sehr geholfen! 😉
    Es klappt jetzt.

    Gruß,
    Pablo



  • Hallo,

    Wie im Titel steht, habe ich jetzt ein Ressourcen Problem. Immer wenn ich mein Programm starte, dann ist die Prozessorauslastung bei 60% und jede sekunde erhöht sich die Speicherauslastung um etwa 10000 K.

    Gibt es irgendeine Funktion oder ähnliches um den Arbeitsspeicher wieder freizugeben? Oder einen Ansatz wie ich das machen könnte?

    Würde mich sehr über jede Antwort freuen, da mich das Problem schon eine ganze Weile lang nervt.

    Gruß,
    Pablo


  • Mod

    aber natuerlich hat man bei c++ fuer jede allokation auch eine deallokationsfunktion.

    wuerdest du alles freigeben was du allokierst, wuerde der speicherverbrauch konstant bleiben.

    wie allokierst du denn den speicher, bzw wofuer benutzt du pro sekunde 10000KB zusaetzlich?



  • Hallo rapso,

    es liegt daran, dass solange das Programm läuft, immer wieder neue Objekte wie Quadrate oder Text auf den Bildschirm ausgegeben werden und die Alten nur mit:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    

    verschwinden lasse. Wenn ich mir jetzt z.B keinen Text mehr ausgeben lasse, dann steigt die Speicherauslastung nur noch so um etwa 100 K. Dies liegt dann an den Quadraten.

    kannst du mir sagen wie man alle, bisher gezeichneten Objekte löscht, sodass die dann auch wirklich weg sind?

    Ich danke schonmal,
    Pablo


  • Mod

    es waere von vorteil wenn du uns zeigen wuerdest welche zeilen speicher allokieren, denn dann koennten wir dir auch sagen wie du den freigeben kannst.



  • Also z.B hiermit:

    glBegin(GL_QUADS);	 glColor3f(0.1f,0.1f,0.1f);								
     glVertex2f(-1.0, 1.0);			
     glVertex2f( 1.0, 1.0);		
     glVertex2f( 1.0, 0.35);		
     glVertex2f(-1.0, 0.35);		 glColor3f(0.1f,0.1f,0.15f);							
     glVertex2f(-0.12, 0.37);
     glVertex2f( 0.12, 0.37);	
     glVertex2f( 0.1, 0.33);
     glVertex2f(-0.1, 0.33);
    glEnd();
    

    erstelle ich 2 Quadrate, die jedoch immer wieder neu gezeichnet werden, solange das Programm läuft. Genauso ist es mit:

    glColor3f(1.0f,0.0f,0.0f);		  	
    glRasterPos2f(-0.03f,0.34f);	
    glPrint("text", -35);
    

    Da kann ich mir schon denken, dass dies Ressourcen zieht.
    Pablo


  • Mod

    und wenn du diese zeilen (und nur diese) auskommentierst, dann steigt der speicherverbrauch nicht mehr um 10000kb/s ?



  • Wenn ich alle Zeilen auskommentiere die mir den Text ausgeben, dann steigt die Speicherauslastung so um 100 K.

    Wenn ich nur die Zeilen von oben auskommentiere, dann steigt die Speicherauslastung so um 200 K.

    Aber eigentlich dürfte die doch so oder so nicht steigen, da ich doch immer den Bildschirm mit:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    

    leere, oder?

    Pablo



  • Dir fehlt eine erhebliche Menge an Grundverstaendnis von OpenGL und C++.
    Ich weiss leider gar nicht wo man da anfangen soll.
    Wie stellst Du Dir denn den Zusammenhang zwischen "uebergebenen Eckpunktpositionen" und "dem Fuellen des Bildschirms mit der Hintergrundfarbe" vor?
    Du kannst davon ausgehen, dass OpenGL in der Lage ist, alle uebergebenen Daten so zu managen, dass keine Speicherlecks entstehen. Wenn Dein Speicherverbrauch steigt liegt das lediglich daran, dass *Du* Speicher allozierst und nicht wieder freigibst.


  • Mod

    FzK_Pablo schrieb:

    Wenn ich alle Zeilen auskommentiere die mir den Text ausgeben, dann steigt die Speicherauslastung so um 100 K.

    Wenn ich nur die Zeilen von oben auskommentiere, dann steigt die Speicherauslastung so um 200 K.

    Aber eigentlich dürfte die doch so oder so nicht steigen, da ich doch immer den Bildschirm mit:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-1.0f);
    

    leere, oder?

    Pablo

    soviel code hast du doch sicher noch nicht, poste doch ein wenig mehr, ich sehe in den 3 zeilen die du jetzt gepostet hast keinen zusammenhang zu dem was du vorher gepostet hast. ich sehe auch nicht wie die zeilen dort ueberhaupt speicher allokieren sollten, vor allem nicht fast 10MB/s, dein program duerfte nach ein paar minuten ja nicht mehr laufen.
    vielleicht generierst du displaylisten ohne sie frei zu geben oder sowas?



  • Hallo,

    Wenn ich alles auskommentiere bis auf:

    int DrawInterface(const char *menucaption)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();									
    glTranslatef(0.0f,0.0f,-1.0f);	
    
    glBegin(GL_QUADS);	 
    glColor3f(0.1f,0.1f,0.1f);								
     glVertex2f(float(-1.0), float(1.0  ));						
     glVertex2f(float( 1.0), float(1.0  ));			
     glVertex2f(float( 1.0), float(0.35 ));					
     glVertex2f(float(-1.0), float(0.35 ));	
    glColor3f(0.1f,0.1f,0.15f);							
     glVertex2f(float(-0.12), float(0.37));
     glVertex2f(float(0.12 ), float(0.37));
     glVertex2f(float( 0.1 ), float(0.33));
     glVertex2f(float(-0.1 ), float(0.33));
    glEnd(); 	 
    
    glColor3f(1.0f,0.0f,0.0f);		  	
    glRasterPos2f(-0.03f,0.34f);	
    glPrint(menucaption, 35);
    return true;
    }
    

    und:

    int checkmsg(void)
    {
      if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
    	if (msg.message==WM_QUIT)
    	{
    		keys[VK_ESCAPE] = true;
    	}
            else									
    	{
    		TranslateMessage(&msg);	
    		DispatchMessage(&msg);	
    	}
      }
      return true;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      if (!CreateGLWindow("ping pong by pablo",1680,1050,32,fullscreen))
      {
    	return 0;
      }	
      while (!keys[VK_ESCAPE])
      {
    	checkmsg();			
    	DrawInterface("Main Menu");
            Sleep(100);	
    	SwapBuffers(hDC);			
      }				
      return true;
    }
    

    dann erhöht sich die Speicherauslastung jede Sekunde um etwa 2000 kb/s.

    Die Zahl bei: glPrint(menucaption, 35); gibt nur die Größe der Schrift an.

    Im kompletten Zustand würde ich einfach nur weitere Boxen und Schriften ausgeben lassen, also denke ich, es ist unnötig die entsprechenden Zeilen auch noch hier hinzuschreiben.

    vielleicht generierst du displaylisten ohne sie frei zu geben oder sowas?

    Was sind displaylisten?

    Gruß, Pablo


Anmelden zum Antworten