![]() |
Wieder einmal 2 Bälle...
Hallo, ich versuche ein Minigolfspiel zu programieren.
Ich hab mir dazu eine Klasse TBall gebaut. als Vorlage hab ich eine Klasse benutz die ebenfalls TBall hiess(wurde voreiniger zeit mal hier gepostet). Ich versteh die Zusammenstoss abfrage zwar(ok sagen wir halb)... Das problme ist, das man minigolf nach einander spielt. Trotzdem liegt in meinem Spiel ein ball auf dem Feld -> Vorbild ![]() der zusammenstoss funtioniert wenn alle bälle eine Geschwindigkeit haben, da sich aber nur ein ball bewegen soll trotzdem aber von "liegenden" bällen abprallen sollen. Nur wenn der 2. Ball eine geschwigkeit von 0 hat, bleibst auch der erste Ball einfach liegen.... Vll kann mir ja einer sagen woran das liegt... Mir gehen echt die ideen aus Hier die procedure
Delphi-Quellcode:
Thorben
procedure Tball.CollideWithOther(Const Ball2: TBall);
Var dx, dy, dxs, dys, L, // Die Variablen für den Abstand der beiden Kugeln M11, M21, M12, M22, // Die Variablen der Transformationsmatrix Vp1, Vp2, Vs1, Vs2, MTot, Vp1_, Vp2_: Single; tmpv: TFpoint; Begin tmpv := ball2.Position; // Hohlen der position der anderen Kugel DX := tmpv.x - fx; // Delta x DY := tmpv.y - fy; // Delta y dxs := dx * dx; // Da wir ein wenig Zeitoptimiert arbeiten wollen speichern wir und die Quadrate zwischen dys := dy * dy; // Da wir ein wenig Zeitoptimiert arbeiten wollen speichern wir und die Quadrate zwischen l := fr + ball2.Radius; // die Strecke der beiden Radien Addiert // da l * l bestimmt schneller ist wie Wurzel ziehen machen wir das so, unter der Annahme das es möglichst selten eine Kollision gibt. // Im anderen Fall wäre die Berechnung von L vor dem If und dem Vergleich auf tr schneller. If dxs + dys <= l * l Then Begin L := sqrt(dxs + dys); // Abstand // Berechnen der Transformationsmatrix M11 := DX / L; M12 := -DY / L; M21 := DY / L; M22 := DX / L; // Koordinatentransformation teil 1 tmpv := ball2.SpeedVektor; Vp1 := fVx * M11 + fVy * -M12; Vp2 := tmpv.x * M11 + tmpv.y * -M12; If Vp1 - Vp2 < 0 Then exit; // Bälle gehen bereits auseinander, dann Exit // Koordinatentransformation teil 2 , aus Optimierungsgründen hinter dem Exit. Vs1 := fVx * -M21 + fVy * M22; Vs2 := tmpv.x * -M21 + tmpv.y * M22; // das Verwurschteln der Massen MTot := fM + ball2.Mass; Vp1_ := (fM - ball2.Mass) / MTot * Vp1 + 2 * ball2.Mass / MTot * Vp2; Vp2_ := (ball2.Mass - fM) / MTot * Vp2 + 2 * fM / MTot * Vp1; // Rücktransformation fVx := Vp1_ * M11 + Vs1 * M12; fVy := Vp1_ * M21 + Vs1 * M22; tmpv := FPoint(Vp2_ * M11 + Vs2 * M12, Vp2_ * M21 + Vs2 * M22); ball2.SpeedVektor := tmpv; End; End; EDIT: OK funktion ist absolut korekt, ich war nur zu doof zum anwenden... Mods oder Admin bitte löschen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz