Simulieren Sie die Bewegung zum Bildschirm in einer 2D-Welt

7

Ich muss die Illusion erzeugen, dass jemand einen Ball auf den Bildschirm tritt. Dafür habe ich eine Anfangsposition des Balls (ungefähr in der Mitte des Bildschirms) und ich habe das Sprite des Balls auf 0,2 seiner ursprünglichen Größe skaliert. Dann generiere ich eine zufällige Position auf dem Bildschirm und bewege das Ball-Sprite dorthin. Gleichzeitig erhöhe ich die Skala des Balls, bis ich 1, die tatsächliche Größe, erreiche.

Zu diesem Zeitpunkt "traf" der Ball den Bildschirm. All dies funktioniert gut, aber die Skala des Balls ist nicht auf die Bewegung des Balls abgestimmt, und deshalb muss ich immer warten, bis die Skala Null erreicht, nachdem der Ball an seinem Ziel angekommen ist, oder ich muss Warten Sie, bis der Ball sein Ziel erreicht hat, nachdem der Ball bereits auf 1 skaliert wurde.

Die Frage ist, wie muss ich den Größenänderungsfaktor des Balls berechnen, damit er gleichzeitig zu 1 wird, wenn der Ball die gewünschten Koordinaten auf dem Bildschirm erreicht? Die Geschwindigkeit des Balls ist eine Zufallszahl zwischen einem bestimmten Bereich, und natürlich verwende ich nur 2D-Sprites.

pablopp83
quelle

Antworten:

9

Der Ball muss eine bestimmte Strecke zurücklegen, um die Koordinaten zu erreichen, bei denen er auf den Bildschirm "trifft". Finden Sie diese Entfernung und berechnen Sie, wie lange der Ball bei seiner zufällig gewählten Geschwindigkeit braucht, um ihn zu erreichen. Jetzt hast du eine Zeit. Verwenden Sie diese Zeit, um die Skala / Sekundenänderung zu berechnen, die Sie auf den Ball anwenden werden.

Grob:

Ball = (BallOnScreenX, BallOnScreenY, BallDepthIntoScreen);
Target = (TargetX, TargetY, 0);
a = Ball.x - Target.x;
b = Ball.y - Target.y;
c = Ball.z - Target.z;
Distance = sqrt((a*a)+(b*b)+(c*c));
DeltaPerMS = GetBallSpeed();
BallMoveTimeMS =  Distance/DeltaPerMS;
ScaleDelta = 1.0 - 0.2;
ScalePerMS = ScaleDelta/BallMoveTimeMS;

Im Wesentlichen bewegen Sie den Ball in xund yauf dem Bildschirm und simulieren die Bewegung in die zRichtung, indem Sie die Skala ändern.

MichaelHouse
quelle
es funktioniert super! Ich habe in so etwas nachgedacht, aber ich konnte nicht herausfinden, wie ich alles zusammenbringen kann. Vielen Dank.
Pablopp83
3

Dies geschieht wahrscheinlich am besten durch Emulieren von 3D. Das Folgende ist 3D-Mathematik, die auf das für Ihren Fall erforderliche Minimum reduziert ist. Im Folgenden gehe ich davon aus, dass Sie ein [initial scale]und ein [final scale]für den Ball definieren, je nachdem, wie groß / nah er erscheinen soll, zusammen mit den Start- und Endkoordinaten und der [time]Dauer. Sie sollten auch eine [gravity]Konstante definieren .

Rahmen

Das [ball scale]sollte proportional zu sein 1/[distance to screen], wo [distance to screen]es linear mit der Zeit abnehmen sollte, es darf nicht 0 erreichen, sondern sollte bis zu dem Punkt abnehmen, an dem der Ball die gewünschte Größe hat.

Es spielt keine Rolle, in welcher Einheit die Entfernung gemessen wird. Am einfachsten ist es also, einfach zu deklarieren [initial distance], dass sie gleich 1/[initial scale]und ist[final distance] = 1/[final scale]

Position

Der Ball sollte sich auch auf dieselbe nichtlineare Weise über den Bildschirm bewegen, auf der er skaliert. Wenn Sie also berechnet haben [ball scale], können Sie dies auch verwenden, um die Position zu ermitteln

[position] = [start position] + ([end position] - [start position]) *
             ([ball scale]-[initial scale]) / ([final scale]-[initial scale])

Schwere

Dadurch scheint sich der Ball in einer geraden Linie durch die Luft zu bewegen. Echte Bälle neigen dazu, dies aufgrund der Schwerkraft nicht zu tun. Abgesehen von sehr schnellen Schlägen würde es seltsam aussehen, wenn sich der Weg des Balls nicht nach unten biegt. Zuerst brauchen wir eine Parabel, die im Anfangs- und Endabstand zum Bildschirm durch 0 geht:

[height] = ([distance to screen]-[initial distance]) *
           ([final distance]-[distance to screen])

Dann sollte diese Parabel auf die gewünschte Schwerkraft skaliert werden, um langsamen Bällen eine größere Höhe zu verleihen:

[height] = [height] * [gravity] * [time]^2

Schließlich sollte die visuelle Darstellung dieser Höhe wie der Ball skaliert werden:

[visual height] = [height] * [ball scale]

Die [visuelle Höhe] sollte dann zum vertikalen Teil der Bildschirmposition hinzugefügt werden. Abhängig von der Zeit und der Schwerkraftskala kann dies dazu führen, dass der Ball für einen Teil des Schusses vom Bildschirm verschwindet.

Zögern Sie nicht zu fragen, ob etwas nicht klar ist.

aaaaaaaaaaaa
quelle
Jetzt, wo es funktioniert, muss ich die Bewegung sicherlich ein wenig polieren, also wird all dies nützlich sein. Vielen Dank!
Pablopp83