Mausgeschwindigkeit berechnen



  • âchso okay also ist in der main der gesamte code drinne und in dieser jngl.hpp sowie in den anderen klassen ist nur die Library.
    also befindet sich in den nichts, was für das Programm selber ist. nur z.b die Funktionen, die die Mauskoordinaten bekommen?



  • Lenni schrieb:

    âchso okay also ist in der main der gesamte code drinne und in dieser jngl.hpp sowie in den anderen klassen ist nur die Library.
    also befindet sich in den nichts, was für das Programm selber ist. nur z.b die Funktionen, die die Mauskoordinaten bekommen?

    Genau. Alle Funktion im Namensraum jngl:: sind das.



  • Also ich habe hier mal alle Funktionen die nicht drinne stehen.
    Also so verstehe ich die vll kannst du das nochmal ergänzen wenn ich die aufgabe falsch interpretieren.

    jngl::ShowWindow("Throw Example", screenWidth, screenHeight)
    --> Hier wird wahrscheinlich das generelle Fenster erstellt?

    jngl::Running()
    --> Ist das die Renderfunktion?

    jngl::Time()
    --> wüsste ich gar nichts was er in der berechnet?

    jngl::MouseX()
    --> hier bestimmt er die aktuelle X-Koordinate der Maus?

    jngl::MouseY()
    --> hier bestimmt er die aktuelle Y-Koordinate der Maus?

    jngl::BeginDraw()
    --> Hier fängt er an alles zu zeichnen?

    jngl::EndDraw()
    --> wüsste ich auch nicht?

    jngl::Width(filename)
    --> hier berechnet er wohl die Breite des Bildes?

    jngl::Height(filename)
    --> hier berechnet er wohl die Höhe des Bilder?

    jngl::Draw("ball.png", static_cast<int>(x_), static_cast<int>(y_));
    --> Hier zeichnet er wahrscheinlich Objekt mit der X und Y-Position?

    jngl::MouseDown()
    --> Hier testet er wohl ob die Maus gedrückt und bewegt wird?;

    Also kann ich dafür die Glut-Funktionen benutzen wie
    glutMotionFunc(mousemove);
    glutPassiveMotionFunc(mousestop);
    glutMouseFunc(mouse);
    glutDisplayFunc(rendern);

    Also mein Projekt ist eine Mischung aus Opengl, C++ natürlich und Glut
    ich hoffe mal das ist alles kompatibel und ich kann das umschreiben

    Alle Sachen die in der Datei main.cpp stehen sprich die Ball-Klasse dienen dazu,
    die Richtung, Geschwindigkeit etc. zu berechnen und die Jngl-Dient echt nur der Darstellung?



  • Lenni schrieb:

    jngl::Running()
    --> Ist das die Renderfunktion?

    Gibt false zurück sobald das Fenster geschlossen wird

    jngl::Time()

    Diese Funktion gibt die Zeit zurück in Sekunden die seit Programmstart vergangen sind. Das ist dazu da, damit das Programm auch auf jedem Rechner gleich schnell läuft.

    jngl::EndDraw()

    Hier wird das zeichnen beendet, also BackBuffer swappen und son zeugs.

    Alle Sachen die in der Datei main.cpp stehen sprich die Ball-Klasse dienen dazu,
    die Richtung, Geschwindigkeit etc. zu berechnen und die Jngl-Dient echt nur der Darstellung?

    Genau. Kannst zur Not auch hier nachgucken, da sind alle FUnktionen beschrieben: http://watteimdocht.de/index_jngl functions.php



  • Danke 🙂

    Eine Frage habe ich da aber noch. Die Funktion CheckMouse(const int x, const int y)
    bekommt die richtige Koordinaten wie zum Beispiel die Position der Elemente oder ist das die Ursprungsform, die erst noch umgerechnet werden müssen?

    Außerdem komme ich irgendwie generell nicht mit dem Code kla, also mit der Übertragung der Mauskoordinaten etc.
    Mein Problem ist außerdem das ich ein Koordinatensystem habe von +1 bis -1 und das muss auch so beibehalten werden..

    Also ich habe hier mal einmal das Programm und einmal nur die Quelltexte. Vll kannst du dir das mal angucken wenn es geht. Aber mach dir keine Müge ich will deine Zeit nicht ausnutzen.

    http://lennartbublies.le.funpic.de/Programm.rar
    http://lennartbublies.le.funpic.de/Quellcode.rar

    es wäre auch schon super, wenn du mir mal einen quellcode geben kannst, der bewirk, dass das Objekt der Maus folgt und wie das dann ist mit dem schleudern
    funktioniert.



  • Lenni schrieb:

    Danke 🙂

    Eine Frage habe ich da aber noch. Die Funktion CheckMouse(const int x, const int y)
    bekommt die richtige Koordinaten wie zum Beispiel die Position der Elemente oder ist das die Ursprungsform, die erst noch umgerechnet werden müssen?

    Sie bekommt absolute Koordinaten der Maus. In meinem Fall den Abstand der maus von oben links in Pixeln. Bei dir müsstest wahrscheinlich noch umrechnen in dein Koordinatensystem.

    Mein Problem ist außerdem das ich ein Koordinatensystem habe von +1 bis -1 und das muss auch so beibehalten werden..

    Dann ist ein xSpeed von 200 natürlich zu groß, setzt ihn am Anfang zum Beispiel auf 0,2.

    Also ich habe hier mal einmal das Programm und einmal nur die Quelltexte. Vll kannst du dir das mal angucken wenn es geht. Aber mach dir keine Müge ich will deine Zeit nicht ausnutzen.

    http://lennartbublies.le.funpic.de/Programm.rar
    http://lennartbublies.le.funpic.de/Quellcode.rar

    Dein Programm sieht ziemlich gut aus. Du musst nur noch die Variablen screenHeight und screenWidth (benutz ich damit der "Ball" von der Wand abprallt) und xSpeed und ySpeed am Anfang auf einen niedrigeren Wert setzen (siehe oben).



  • Ich muss mir dein Programm nochmal in Ruhe angucken.
    Erstmal habe ich eine andere Möglichkeit gefunden.
    Nur jetzt habe ich auch schon das nächste Problem. Wie kann ich ihm mitteilen, das er am Rand angekommen ist und von den Wänden logisch aprallt?
    Also so wie bei dir?
    Meine Außenwände sehen wie folgt aus:
    Links (x): 1.0
    Oben (y): 1.0
    Rechts (x): -1.0
    Unten (y): -1.0

    bool CContainer::spin(GLuint objID)
    {
            //Speed ist die Differenz der aktuellen Mausposition zu der alten (speed = maus - oldmaus). 
    	Objects[objID]->pos.X += speed.X;
    	Objects[objID]->pos.Y += speed.Y;
    
            //Im Hintergrund läuft eine Lebenszeit des Objekts.
    	lifetime -= ltime;
    
    	if(Objects[objID]->pos.X + Objects[objID]->size.X > 1.0)
    	{
    
    	}
    	if(Objects[objID]->pos.X + Objects[objID]->size.X < -1.0)
    	{
    
    	}
    	if(Objects[objID]->pos.Y + Objects[objID]->size.Y > 1.0)
    	{
    
    	}
    	if(Objects[objID]->pos.Y + Objects[objID]->size.Y > 1.0)
    	{
    
    	}
    	if(Objects[objID]->pos.X < 0)
    	{
    
    	}
    	if(Objects[objID]->pos.Y < 0)
    	{
    
    	}
    
    	if(lifetime <= 0.5)
    	{
    		return true;
    	}
    	return false;
    }
    

    Nur keine Ahnung was ich jetzt wie und wo abziehen muss etc. damit er das Objekt in eine andere Richtung schießt sobald er die Seite berührt.



  • Keiner eine Ahnung wie ich die Funktion gestalten muss, damit er die Objekt an den Wänden logisch aprallen lässt?



  • Lenni schrieb:

    Keiner eine Ahnung wie ich die Funktion gestalten muss, damit er die Objekt an den Wänden logisch aprallen lässt?

    Ist auch in meinem Beispiel in der Funktion Move, die ganzen if-Abfragen.

    Du musst zum Beispiel testen ob die X-Position kleiner als 0 ist. Dann setzt du die X-Position auf 0 und musst xSpeed um drehen, also xSpeed = -xSpeed. Folglich bewegt sich das Objekt ja dann in die andere RIchtung, es ist abgeprallt. Das ganz musst jetzt noch für die anderen 3 Seiten machen(z.B. also y größer als screenWidth -> y = screenHeight und ySpeed = -ySpeed).
    Wenn du nicht willst das er immer mit voller geschwindigkeit abprallt, was ja etwas realistischer ist, machst du: xSpeed = -xSpeed * 0.7. Dann verliert er z.B. immer 30 % beim abprallen.



  • jau ich habe das jetzt hinbekommen.
    Nur ein weiterer Fehler bleibt^^.
    Und zwar wenn ich das Objekt bewege mit der Maus und mit der Maus außerhalb meiner Fenster komme, aber das Objekt noch geklickt ist, dann bleiben die Objekt in den Wänden stecken und zittern.

    *EDIT*
    So ich habe jetzt alles Probleme gelöst und es funktioniert alles wunderbar.


Anmelden zum Antworten