![]() |
AW: Andorra 2d Billardspiel in 2d
Okay, verstanden, das sind ja ganz einfache Ortskoordinaten, wie man sie aus Klasse 5 und 6 kennt. Und was genau heißt das jetzt auf mein Spiel angewendet? Kann mir einer ein Beispiel mit verschiedenen Winkeln, aber gleichem Laufweg der Weißen geben? Gebt mit bitte als Beispiel dann jeweils auch die Positionen von Weiß und Geisterball. Danke schonmal.
|
AW: Andorra 2d Billardspiel in 2d
Gut, also nehmen wir mal an, A bezeichnet die weiße Kugel und B die Geisterkugel. (Beides sind also Vektoren mit je einer X und einer Y Komponente)
Die weiße soll nun in Richtung der Geisterkugel laufen. Dann nehmen wir einfach C = B-A (das ist die Differenz der beiden Vektoren) Und wenn du möchtest dass der Vektor eine Länge von 50 hat: D = C/|C| * 50 = C/sqrt(Cx^2+Cy^2) * 50 |C| soll hier die Norm darstellen. Danach ist D ein Vektor, der genau 50 Einheiten lang ist und von der weißen Kugel in Richtung Geisterkugel zeigt. |
Vektor D
Muss ich dann also nur noch schreiben, dass der Vektor A + den Vektor D gerechnet wird und dann bewegt sich die Weiße in die richtige Richtung(Das Ergebnis werde ich aufgrund der Wurzel wohl natürlich runden müssen).
Habe ich das so richtig verstanden? |
AW: Andorra 2d Billardspiel in 2d
A + k*D, k ist die Entfernung zwischen A und dem Endpunkt der Bewegung.
|
AW: Andorra 2d Billardspiel in 2d
Ja, aber wenn ich doch jetzt Ax + Dx und Ay + Dy rechne,dann bewegt sich doch die Weiße entlang des Vektors D, oder?
|
AW: Andorra 2d Billardspiel in 2d
Ja, grundsätzlich schon.
Ich weis jetzt nicht genau wie Andorra2D Bewegungen darstellt (ich vermute mal mit einem Geschwindigkeitsvektor, oder du bekommst einfach nur einen Taktschritt mit einem deltaT parameter und musst das dann selber machen) Um es nochmal zu präzisieren: Wenn du die weiße Kugel an die Position A+D setzt, dann ist sie von ihrer Ausgangsposition 50 (Pixel?) näher an der Geisterkugel dran. Es kann natürlich auch sein dass die Geisterkugel nur 20 Einheiten weg ist, dann ist die weiße jetzt hinter der Geisterkugel. Suie hat sich halt 50 Einheiten in diese Richtung bewegt. |
AW: Andorra 2d Billardspiel in 2d
Danke, ich glaube, ich krieg das jetzt auf die Reihe. Ich werde es demnächst mal ausprobieren und sollte ich Probleme kriegen, dann melde ich mich wieder.
|
AW: Andorra 2d Billardspiel in 2d
Es hat wunderbar funktioniert, danke!
|
Neues Problem
Delphi-Quellcode:
Energie ist die Laugenergie der Kugel, die anschließend verringert wird. Die Kugel soll ja nicht ruckartig 100Pixel nach rechts springen, sondern es soll ja eine flüssige Bewegung generiert werden. XSpeed und YSpeed rechne ich über die Vektorenrechnung aus. Irgendwie muss ich aber einen Fehler in dem geposteten Text haben. Ist XSPeed*YSpeed<>0, dann ist der Laufweg soweit ich das beurteilen kann, immer derselbe (oder täusche ich mich?). Ist jedoch YSpeed oder XSpeed = 0, dann läuft die Kugel sehr sehr weit, woraus ich schließe, dass ich entweder im ersten Fall zu viel Energie abziehe oder im zweiten Fall zu wenig. FÜr mich sind beide Rechnungen jedoch schlüssig, schließlich wird im ersten Teil eine Diagonale durchschritten, die ich mit Pythagoras ausrechne und im zweiten Fall kann ich ja den direkten Weg abziehen.
if Energie > 0 then begin
X := X + (XSpeed * TimeGap * Energie * 10); Y := Y + (YSpeed * TimeGap * Energie * 10); //Energie neu berechnen, ACHTUNG bei der Wurzel (wurzel aus -X) if XSpeed * YSpeed <> 0 then Energie := Energie - sqrt(abs(((Xspeed*TimeGap)*(XSpeed*TimeGap)))+abs(((YSpeed*TimeGap)+(YSpeed*TimeGap)))) else if (XSpeed=0) and (YSpeed <> 0)then Energie := Energie - abs(YSpeed*TimeGap) else if (YSpeed=0) and (XSpeed <> 0)then Energie := Energie - abs(XSpeed*TimeGap); Oder liege ich falsch? |
AW: Neues Problem
Zitat:
E := E - Norm(Speed) * TimeGap Norm(Speed) ist die Norm des Geschwindigkeitsvektors. Was du wirklich tust: ich habe die lange Formel mal etwas auseinander gefriemelt:
Code:
Fällt dir was auf? Beim YSpeed*TimeGap steht ein Plus. Das gehört da nicht hin. (Zumindest wären deine Formeln konsistenter wenn dort ein * stehen würde)
sqrt(
abs( ( (Xspeed*TimeGap) * (XSpeed*TimeGap) ) ) + abs( ( (YSpeed*TimeGap) + (YSpeed*TimeGap) ) ) ) Den Betrag kannst du übrigens weglassen. Die Fallunterscheidung auch. Sieht dann so aus:
Delphi-Quellcode:
;)
if Energie > 0 then begin
X := X + (XSpeed * TimeGap * Energie * 10); Y := Y + (YSpeed * TimeGap * Energie * 10); //Energie neu berechnen Energie := Energie - sqrt(Xspeed*XSpeed + YSpeed*YSpeed) * TimeGap; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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