Mausgeschwindigkeit berechnen
-
Bestimme doch einfach ein (delta_x, delta_y) zur Vorgängerposition. Dieses gibt einen Richtungsvektor an, den du nur noch normieren musst (bzw. vielleicht auch nicht, je nach Anwendung).
-
öhm also "Bestimme doch einfach ein (delta_x, delta_y) zur Vorgängerposition" keine Ahnung wie man das machen sollte bzw. noch nie was davon gehört wie man das macht.
Wüsstest du wie?
-
Damit sich das Objekt weiter bewegt, würde ich in der Drag-Funktion nicht die Position gleichsetzen, sondern mittels der Entfernung das Objekt an die Maus anähern. Dazu speicherst du eine X- und eine Y-Geschwindigkeit die immer in Richtung Mauszeiger gesetzt werden sobald man die Maus drückt. Wenn du nun los lässt bewegt sich dein Objekt automatisch weiter.
Wenn du noch willst, dass es langsam aufhört, sich zu bewegen, muss du nur pro Frame einen gewissen Prozentsatz abziehen, dann sieht das schon ganz gut aus.
Hier mal ein Beispielprogramm: http://watteimdocht.de/jan-nik/throw.zip
-
also so ganz blicke ich da noch nicht durch wie das Funktionieren soll.
Und das doofe ist der Quelltext von dem Beispielprogramm ist nicht vollständig also keine Ahnung was er da genah tut etc.
-
Lenni schrieb:
also so ganz blicke ich da noch nicht durch wie das Funktionieren soll.
Und das doofe ist der Quelltext von dem Beispielprogramm ist nicht vollständig also keine Ahnung was er da genah tut etc.Doch der ist vollständig, verwendet halt nur zum Zeichnen meine Library, aber das sollte auf jede anderere Bilbiothek übertragbar sein.
-
â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 umschreibenAlle 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.rares 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.rarDein 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.0bool 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.