Zitat von
Antigo:
Naja es ist ja schon dadurch das ich eine WIndkomponente eingebaut habe, kein standard schräger Wurf wie man ihn aus dem Mathe Unterricht kennt
Den Windfaktor kann man natuerlich miteinbeziehen: Ich schaetze mal, dass der Wind-Vektor ca. so aussieht: (x, y, 0), sprich der Wind die Kugel nicht nach unten drueckt. Das vereinfacht das insofern, dass nur die Funktion x(t) veraendert werden muss. xy(t) ist dann nicht mehr nur
sondern es muss auch der Wind noch miteinbezogen werden:
Code:
xy(t) = v0 * t * cos(b) + vw * t * c
= t * (v0 * cos(b) + vw * c)
wobei vw der Vektor des Windes ist und c ein Faktor, mit dem die Kraft des Windes an dem Objekt wirkt. (Siehe dazu
Luftwiderstand)
Zitat von
Antigo:
Ausserdem möchte ich den Ball später auch noch gegen andere Gegenstände prallen lassen. Trotzdem könnte ich natürlich im ersten Schritt alles Berechnen und dann mit zweiten Schritt ausgeben, aber ich weiss nicht ob das so sinnvoll wäre.
Wenn die Flugbahnen konstant bleiben, d.h. nicht zwischendurch durch aeussere Einwirkungen (benutzer ect.) veraendert werden, dann rentiert sich das vorberechnen von Kollisionspunkten. Dann musst du naemlich nur bei Flugbahnveraenderungen (Kollisionen) die Kollisionen neu berechnen. Wenn du dies bei jedem Frame machst, bremst das normalerweise ziemlich, vor allem da eine Kollisionserkennung bei sich bewegenden Objekten nicht sonderlich schnell ist. Bei einer Einfachen Implementierung bringt das eine Laufzeit von
O(n * n). Zwar kann man das ganze beschleunigen (Quad-/Octrees ect.), das bringt aber einen weitaus hoeheren Implementierungsaufwand mit sich.
Zitat von
Antigo:
Zitat:
Nehmen wir an, du willst dein Objekt mit 5Pixel/Sekunde bewegen. Du hast eine Framerate von 20FpS. Dann bewegst du dein Objekt pro Frame um 0.25 Pixel. In Integern ausgedrueckt: um 0 Pixel. Wenn du also Integer verwendest, steht dein Objekt bei dieser Geschwindigkeit nach 1 Sekunde immernoch am selben Fleck wie davor, obwohl es sich eigentlich um 5 Pixel bewegen haette sollen.
Bei der Verwendung von Floats wuerde es nach 1 Sekunde an der richtigen Stelle befinden, naemlich 5 Pixel weiter
Hmm dann müsste ich aber auch die X / Y Koordinaten des Balles in float ausdrücken. Sonst kann ich schlecht um 0.25 Pixel weitergehen. Ich werd das mal versuchen und berichten obs klappt.
Nein, die Pixel koennen Ints bleiben. Hier ein vergleich:
Code:
Schritt Position/Pixel (float) Position/Pixel (int)
1 0 / 0 0 / 0 (+0.25)
2 0.25 / 0 0 / 0 (+0.25)
3 0.50 / 0 0 / 0 (+0.25)
....
6 1.25 / 1 0 / 0 (+0.25)
7 1.50 / 1 0 / 0 (+0.25)
....
9 2.00 / 2 0 / 0 (+0.25)
10 2.25 / 2 0 / 0 (+0.25)
ect.
So sieht das aus im Vergleich, wenn du einmal Position und Pixel als Integer speicherst, und einmal, wenn du Position als floats und Pixel als integers speicherst.
Zitat von
Antigo:
ok es kann gar nicht funktionieren mit diesem Time Based Movement :/
Hier mal ein kleines Beispiel:
Delphi-Quellcode:
var
LastTick: Integer;
//...
procedure TForm1.OnTimer(Sender: TObject);
var
CurrentTick, dt: Integer;
begin
CurrentTick := GetTickCount();
dt := CurrentTick - LastTick; //dt = Delta T, die Zeitdifferenz zwischen dem letzten Tick und dem derzeitigen
//hier dann dein Verarbeitungscode
LastTick := CurrentTick;
end;
dt ist die wichtige Variable. Diese gibt dir in Millisekunden an, wieviel Zeit seit dem letzten Tick vergangen ist. Wie du sie anwendest: hier mal ein kleines Beispiel:
Delphi-Quellcode:
procedure PhysicTick(dt: real); //dt, aber in Sekunden! (angenehmer fuer physische Berechnungen)
var
Speed, Position: TVektor; //Geschwindigkeits- und Positionsvektoren
begin
Position := Position + (Speed * dt);
end;
procedure OnTimer(...)
begin
//hier dann dein Verarbeitungscode
PhysicTick(dt / 1000); //division durch tausend, um von Millisekunden auf Sekunden umzurechnen.
end;
Damit sollte das Timebased Movement korrekt implementiert sein.
Code is allerdings im Kopf entstanden, also koennten kleinere Fehlerchen dabeisein
greetz
Mike