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

killmichnich

unregistriert

1

20.06.2009, 00:35

sprite drehen

Hiho,
ich hab ein neues Spiel angefangen, in dem man ein Raumschiff "ist" und damit durch die Gegend fliegt. die Steuerung will ich so machen, dass sich das Schiff immer in Richtung auszeiger zeigt. Ich habs auch schon geschafft, dass das Schiff immer dem Mauszeiger folgt. Jetzt will ichs aber so machen, dass sich das Schiff immer nur mit einer bestimmten Geschwindigkeit in die Richtung des Mauszeigers bewegt.
Dazu will ich mir ne Funktion schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
float ShipRotation = iwas;
float RotationSpeed = 1; //in grad

void RotateTo(float rotation)  // rotation in grad

{

}

Der Hauptteil der Funktion fehlt leider noch, da ich folgendes Problem habe: Das Schiff soll sich immer den kürzesten Weg suchen, in welche Richtung es sich drehen soll, und ich weiß nicht, wie ich das hinkriegen soll, da es ja immer wieder über 0 grad geht. Beispiel dafür wäre:
Rotation des Schiffes ShipRotation = 5° und die Rotation rotation wos hin soll 350°. Der kürzeste Weg wäre jetzt ja sich um 15° rückwärts zu drehen, da ich aber nicht weiß wie das geht, würde sich mein Schiff um 345° vorwärts drehen :/
Gibts dafür denn irgend was allgemeines, wie ich das machen kann, mir fällt iwie nix ein =(

Freue mich wie immer über jede Hilfe =)

MfG Killmichnich

2

20.06.2009, 00:59

So hab ich es damals gemacht. Ich habe aufgehört zu optimieren, als es gut funktioniert hat, vielleicht kann mans ja noch n bissle optimieren:

C-/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
    /*
    Test, ob die gewünschte Richtung erreicht wurde:
    Hier ist wichtig, das die Richtung erst nach dem Test auf evtl. über 0-360 gehen
    angepasst wird, da getestet wird, ob die gewünschte Drehung überschritten würde
    */
    if((m_Character.GetDirection()+Dir*m_TurnSpeed*Time-m_DestinatedDirection)*Dir>0)
    {
        m_Character.SetDirection(m_DestinatedDirection);
        return true;
    }
    else
    {
        //gucken ob es kürzer wäre wenn man über 0-360 geht:

        if(abs(m_Character.GetDirection()-m_DestinatedDirection)>180.f)
            Dir*=-1;


        m_Character.SetDirection(m_Character.GetDirection()+Dir*m_TurnSpeed*Time);
        while(m_Character.GetDirection()>360.f)
            m_Character.SetDirection(m_Character.GetDirection()-360.f);
        while(m_Character.GetDirection()<0.f)
            m_Character.SetDirection(m_Character.GetDirection()+360.f);
    }
Lieber dumm fragen, als dumm bleiben!

3

20.06.2009, 01:01

jenachdem, welche lib verwendet wird, kann man auch um -15° drehen

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.06.2009, 01:12

Wenn ich es richtig verstanden hab besteht dein Problem darin die Drehung zu berechnen die notwendig ist um auf kürzestem Weg in Richtung Mauszeiger zu drehen!?

Auf Vektoren/Matritzen zu setzen wäre sicherlich vernünftig, ich geh aber mal davon aus dass du es es lieber über einen "einfachen" Rotationswinkel machen willst...

Angenommen dein Sprite befindet sich im Moment an der Position (x, y) und ist um den Winkel alpha gedreht, der Mauszeiger befindet sich an Position (mx, my), Winkel zählen positiv entgegen dem Uhrzeigersinn.

Rechnen wir uns einfach mal die Richtung zum Mauszeiger aus:

dx = mx - x
dy = my - y

Den Drehwinkel Richtung Maus bekommst du daraus über den arctan, am besten mit der Funktion atan2:

phi = atan2(dy, dx)

Das liefert dir die absolute Drehung von der x-Achse aus gemessen zwischen 180° und -180° (aufpassen der Wert der da rauskommt ist nicht in Grad sondern in Radiant).

Da dein Sprite ja schon etwas gedreht ist willst du jetzt die relative Drehung haben, also jenen Winkel den du zu deinem aktuellen dazuzählen musst um dich auf kürzestem Weg zur Kamera zu drehen, nennen wir ihn beta:

beta = phi - alpha

Schauen wir uns ein paar Beispiele an:

1) Die Kamera sei von dir aus gesehen auf 80°, du selbst bist 20° gedreht, du musst dich also um einen Winkel von 80° - 20° = 60° drehen um zur Kamera zu schauen.

2) Die Kamera sei von dir aus gesehen auf 240° = -120°, du selbst bist 20° gedreht, du musst dich also um einen Winkel von -120° - 20° = -140° drehen um zur Kamera zu schauen.

...


Alternativ kannst du aber auch einfach hergehen und von deinen Winkel 360° abziehen wenn der Winkel größer als 180° war um so den "richtigen" zu bekommen. Nehmen wir z.B. 345° wie in deinem Posting von dir geschildert:

345° ist größer als 180, daher Winkel nicht 345° sondern 345° - 360° = -15°

;)

Werbeanzeige