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

10.12.2013, 22:56

SFML Objekt in Rotationsrichtung bewegen

Hallo ich habe da mal ne Frage.

Ich Steuere mein Raumschiff über W,A,S,D. A und D sind für die Rotation zuständig, d.h. rechts links. nun möchte ich das es

in die Richtung fliegt, in die es zeigt. Kriege das irgendwie nicht realisiert.

Ich bekomme immer nur eine normale Achsen Bewegung hin.

vielleicht könnt ihr mir da helfen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.12.2013, 23:06

Bin mir nicht ganz sicher, was genau das Problem ist, aber ich rate einfach mal: Die Richtung, in die es zeigt, kannst du über sin und cos aus dem Rotationswinkel berechnen...

Alternativ kannst du auch einfach den entsprechenden Einheitsvektor – z.B. §\begin{pmatrix}1 & 0\end{pmatrix}^T§ – durch die Transform des Sprite schicken oder direkt das a00 und a10 Element der Matrix nehmen (wenn das irgendwie geht, hab noch nie selbst mit SFML gearbeitet).

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

3

11.12.2013, 20:29

Wenn du dein Raumschiff über eine "zweidimensionale Geschwindigkeit" steuerst kannst du ja ganz einfach den Winkel berechnen, in den du dein Schiff drehen musst.

Mein Ansatz ist folgender:
"Center of origin" auf den tatsächlichen Mittelpunkt des Sprites setzen. Normalerweise ist der in der Ecke, sodass das Sprite sich nicht korrekt dreht. Siehe dazu setOrigin().
Die Bewegung eines Sprites erfolgt über einen offset Vector. Also quasi vector2 newPosition = vector2 oldPosition + vector2 Offset.
Der Offset ist in diesem Fall meine Geschwindigkeit, also veränderbar.
Mit Hilfe dieses Offsets (und der Umrechnung von Radiant<->Grad) kannst du dann eine neue Rotation berechnen und das Sprite drehen. Die std-Lib hat hierzu einige schöne Helperfunktionen. (sin cos tan etc).
Beispiel:
Rotation = einheitsvektor von atan2(offset.x, offsety) -> radiant in grad umrechnen und mittels setRotation() sprite drehen

Ist sicherlich kein perfekter Weg, aber ich denke er tut seinen Job.
WIP Website: kevinheese.de

4

11.12.2013, 21:08

Es könnte ungefähr darauf hinauslaufen,

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(Key == D)
    w += av*t
if(Key == A)
    w -= av*t
  
if(Key == W) {
    vx = v * cos(w);  
    vy = v * sin(w);  
}
else {
    vx = vy = 0;
}

x += vx*t;
y += vy*t;


Winkelgeschwindigkeit av und Geschwindigkeit v kannst du jetzt entsprechend variieren.

Werbeanzeige