AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wieder einmal 2 Bälle...
Thema durchsuchen
Ansicht
Themen-Optionen

Wieder einmal 2 Bälle...

Ein Thema von Thorben_Ko · begonnen am 13. Jun 2007
Antwort Antwort
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#1

Wieder einmal 2 Bälle...

  Alt 13. Jun 2007, 17:52
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz