Fahrradspiel - einem Straßenweg folgen

7

Ich schreibe ein Spiel in Java, bei dem ein Fahrrad eine Straße entlang fährt. Ich beabsichtige, einige Hindernisse auf der Straße hinzuzufügen, die Strukturen mit einer Neigung sind, die der Biker überwinden muss. Mit anderen Worten, das Fahrrad muss klettern und den Hang entlang laufen, wenn es auf eines trifft, so dass es offensichtlich genau auf den Hangweg ausgerichtet sein muss. Ich mache dies derzeit mithilfe von Triggerfunktionen, um den Drehwinkel, die xy-Koordinaten für das Fahrrad beim Steigen, Sinken usw. zu ermitteln. Kann jemand bitte einen besseren Algorithmus vorschlagen, um dies zu erreichen?

Kerl
quelle
Ist das von oben nach unten oder von der Seite?
Anko
Danke Anko - das Spiel hat eine permanente gerade Seitenansicht
Bloke

Antworten:

1

Ich glaube nicht, dass Sie den Trigger wirklich vermeiden können, aber Sie können nur verbessern, wie Sie den Winkel berechnen.

In Ihrer Frage werden die "xy-Koordinaten für das Fahrrad" erwähnt, aber tatsächlich hat das Fahrrad keine einzige Koordinate. Es hat zwei Koordinaten - die zwei Räder.

Insbesondere sollten Sie sich nicht auf die Position des Fahrrads und einen einzelnen Punkt stützen. Wenn Sie nur einen einzigen festen Punkt verwenden (wie in der Mitte des Fahrrads), funktioniert dies nicht, wenn das Fahrrad zum ersten Mal in eine Steigung fährt. Das Vorderrad des Fahrrads kippt erst, wenn der Mittelpunkt die Steigung erreicht.

Hier ist ein Bild davon, wie es aussehen wird, wenn Sie von der Mitte aus rechnen und einfach eine Steigung eingeben ...

Geben Sie hier die Bildbeschreibung ein

Berechnen Sie stattdessen die Drehung basierend darauf, wo die Vorder- und Hinterräder den Boden berühren. Berechnen Sie Y am Hinterrad, dann Y am Vorderrad und dann den Winkel zwischen den beiden Punkten. Dann können Sie dafür sorgen, dass es auf unebenem Boden funktioniert, und die Bewegung wird viel glaubwürdiger und sieht so aus ...

Geben Sie hier die Bildbeschreibung ein

Auf diese Weise können Sie auch kleinere Unebenheiten gut handhaben. Basierend auf der Neigung von Rad zu Rad muss das Vorderrad Ihres Fahrrads tatsächlich über die Unebenheit fahren, auf der anderen Seite herunterkommen und das Hinterrad darüber fahren. Wenn Sie anhand eines Punktes (Mitte des Fahrrads) rechnen, erhalten Sie Folgendes ...

Geben Sie hier die Bildbeschreibung ein

Wenn Sie jedoch anhand der Fahrradräder rechnen, erhalten Sie Folgendes ...

Geben Sie hier die Bildbeschreibung ein

Tim Holt
quelle
0

So würde ich es auch mehr oder weniger machen. Eine Sache, die Sie versuchen können, ist, dass die Bodenstücke einen normalen Vektor enthalten, den Sie schnell abfragen können, um das Fahrrad am Hang auszurichten.


Die Vektornormalisierung wird meistens verwendet, wenn der Vektor eine Länge von 1 haben soll. Eine andere Verwendung ist, wenn der Vektor eine bestimmte Länge haben soll, den Vektor zu normalisieren, der garantiert, dass der Vektor eine Länge von 1 hat, und dann mit dem zu multiplizieren Nummer, die Sie möchten, ist die Länge.

Steven Srun
quelle
Danke - ich bin eigentlich neu in der Programmierung, die Triggerberechnungen beinhaltet, also kämpfe ich mit den Transformationen. Nach einigem Üben und Befolgen verschiedener Web-Tutorials gelang es mir jedoch, meine eigenen Funktionen für Rotations- und Geschwindigkeitsmanipulationen in meinen Code zu schreiben. Eines verwirrt mich immer noch. Ich habe viel über den Begriff Vektornormalisierung gelesen und verstehe das Konzept, aber können Sie mir zeigen, wie es im Code verwendet werden kann?
Kerl
für zB. In einem anderen Spiel, das ich mache, habe ich einen Hubschrauber, der herumfliegt und beim Drücken der Benutzertaste Kugeln abschießt. Jetzt könnten einige feindliche Objekte auf dem Bildschirm sein, wenn die Kugel abgefeuert wird. Offensichtlich wird die Kugel nicht auf einen bestimmten Feind gerichtet sein, da die Kugel beim Abfeuern der Position und Richtung des Hubschraubers folgen muss. Wenn die Kugel auf ihrem Weg mit einem Feind kollidiert, verschwinden sowohl die Kugel als auch der Feind und der Benutzer erhält einen Punkt.
Kerl
Jetzt mache ich das alles einfach, indem ich überprüfe, ob die feindlichen Koordinaten mit der Kugel kollidieren. Es wäre also ungefähr so ​​etwas wie ... wenn bull.X == feind.X UND kugel.Y == feind.Y. Natürlich berücksichtige ich auch ihre Größen. Dadurch kann ich das gewünschte Ergebnis erzielen, aber ich verwende hier keine Vektoren. Kann das Konzept der Vektornormalisierung in diesem Zusammenhang für einen optimierten oder saubereren Code verwendet werden?
Kerl