Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.06.2014, 14:34

Flugbahn einer "Rakete" programmieren!

Hallo zusammen,

Ich programmiere gerade einen kleinen Weltraumshooter in C#/XNA und bin wirklich am Ende!
Der Spieler (im Bild die linke große Rakete) soll kleine Raketen abfeuern können die automtisch zum Gegner (rechte große Rakete) fliegen und diesem folgen können.
Die Raketen sollen aus der Rakete seitlich starten und einen Bogen fliegen, was bereits duch einfache Wurzel- und Parabelfunktionen gelöst ist.
Nun steh ich aber komplett auf dem "Schlauch", wie ich danach vorgehe.
Die Raketen an sich haben einen Positionsvektor, einen Geschwindigkeitsvektor und eine "Orientierung", also der Winkel zu dem die Textur gedreht wird..

Nun berechne ich bei jedem Durchlauf die Distanz zwischen Rakete und Ziel, das Ergebnis wird dann mit einem Faktor kleiner gemacht und auf den Geschwindigkeitsvektor addiert, welche dann letztlich auf den Positionsvektor addiert wird.
Das alles hat aber zur Folge, dass die Rakete sehr träge reagiert und sich dem Ziel natürlich immer nur annähert, nie aber genau trifft.
Hat an dieser Stelle jemand eine Idee, wie dies gelöst werden kann, evtl. hab ich nur einen Tunnelblick im mom und das ist ganz einfach :D

Danke im voraus :)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        IEnumerable<int> FollowPlayer()
        {
            if (trackingBulletsBeneath.Contains(this))
            {
                while (true)
                {
                    if (x < 20) // Wurzelfunktion von 0 - 20 ablaufen
                    {
                        Velocity.X += (float)x;
                        Velocity.Y += (float)(Math.Sqrt(x) * 3);

                        x++;
                        Velocity *= 0.3f;   // Das ganze etwas langsamer gestalten
                    }
                    else if (x == 20)   // Beim 21ten Durchlauf etwas abbremsen
                    {
                        Velocity /= 3;
                        x++;
                    }
                    else   // Anschließend den Gegner verfolgen (Problemstelle)
                    {
                        Vector2 distance = Position - GameRoot.player2.Position;

                        Velocity.X -= (distance.X * 0.001f);
                        Velocity.Y -= (distance.Y * 0.001f);
                    }


                    if (Velocity != Vector2.Zero)             // Orientierung durch atan2
                        Orientation = Velocity.ToAngle();
                }
            }
            yield return 0;
        }


C#-Quelltext

1
2
3
4
5
6
7
8
public override void Update()
        {
           [...]

            Position += Velocity;

           [...]
        }




(Link)

2

19.06.2014, 15:20

Ziele nicht direkt auf die Rakete, sondern auf den Punkt an dem sich die Kollision wahrscheinlich ereignet (target prediction)
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

19.06.2014, 15:34

Für den Anfang geht es auch einfacher:
Versetz dich in die Sicht der Rakete. Befindet sich das Ziel "über" mir? Wenn ja, drehe ich mich entsprechend nach oben. Befindet sich das Ziel "unter" mir? Wenn ja, drehe ich mich entsprechend nach unten.

Werbeanzeige