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
www.playray.de
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:
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;
Thorben
EDIT: OK funktion ist absolut korekt, ich war nur zu doof zum anwenden... Mods oder Admin bitte löschen