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

13.05.2016, 12:22

C++ Rotation + Movement

Guten Tag.
Ich wollte mal fragen wie man ein rotiertes Objekt in die Richtung bewegen kann in die es rotiert wurde und nicht nur auf/ab.
Kann mir da jemand helfen?


Bewegung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
float x1 = SpielerSprite1.getPosition().x;
float y1 = SpielerSprite1.getPosition().y;
float r1 = SpielerSprite1.getRotation();

if (Keyboard::isKeyPressed(Keyboard::W)) {
    y1 = y1 - (SpielerSpeed1 * ElapsedTime);
}
if (Keyboard::isKeyPressed(Keyboard::S)) {
    y1 = y1 + (SpielerSpeed1 * ElapsedTime);
}
if (Keyboard::isKeyPressed(Keyboard::A)) {
    x1 = x1 - (SpielerSpeed1 * ElapsedTime);
}
if (Keyboard::isKeyPressed(Keyboard::D)) {
    x1 = x1 + (SpielerSpeed1 * ElapsedTime);
}

SpielerSprite1.setPosition(x1, y1);


Rotieren:

C-/C++-Quelltext

1
2
3
4
5
6
if (Keyboard::isKeyPressed(Keyboard::Q)) {
    SpielerSprite1.rotate(10 * ElapsedTime);
}
if (Keyboard::isKeyPressed(Keyboard::E)) {
    SpielerSprite1.rotate(-10 * ElapsedTime);
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.05.2016, 12:35

Kennst du Vektoren? Falls ja, stell dir vor die X- und Y-Koordinaten ergeben zusammen einen Vektor. Das macht allgemein viele Dinge etwas leichter. Ansonsten wäre es vielleicht Zeit dich in Vektoren einzulesen. In der Oberstufe kommen die im Mathematik-Unterricht, für die Spieleentwicklung ist es aber allgemein wichtig ein Verständnis davon zu haben. Und so schwer ist das ganze Thema eigentlich nicht als dass du davor groß Angst haben solltest.
Alternativ kennst du aber sicherlich Trigonometrie. Gegenkathete und Ankathete bilden deine Bewegung auf den beiden Achsen und die Hypotenuse die Linie auf welcher du dich gern logisch gesehen nach vorne bewegen möchtest. Mit Hilfe von Sinus und Cosinus kannst du dir jetzt die benötigten Werte für X und Y ausrechnen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

13.05.2016, 12:39

Okay, danke schon mal.
Ich werde mich mal in die Vektoren einlesen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

13.05.2016, 13:35

Okay, danke schon mal.
Ich werde mich mal in die Vektoren einlesen.

Falls Fragen aufkommen kannst du die gern hier stellen. Ich finds schon mal super dass du anscheinend nicht lernfaul bist. Dafür gibts von mir schon mal nen Daumen hoch.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

13.05.2016, 16:44

Hi, ich bin`s nochmal.
Ich habe es geschafft das Objekt schräg zu bewegen, weiß aber noch nicht ganz wie ich die festgelegte Richtung durch die
Rotation ersetzten soll, kannst du mir vielleicht auf die Sprünge helfen? :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
float playerx = SpielerSprite1.getPosition().x;
float playery = SpielerSprite1.getPosition().y;
float zielx= SpielerSprite1.getPosition().x + 1;
float ziely= SpielerSprite1.getPosition().y - 1;
float x = (zielx- playerx);
float y = (ziely- playery);
float v = ((x * x) + (y * y));
float unitx = (x / v);
float unity = (y / v);

if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
    SpielerSprite1.move(unitx, unity);
}

6

13.05.2016, 16:50

Du kannst dir aus dem Winkel einen Vektor besorgen:

Quellcode

1
2
vector_x = cos(a)
vector_y = sin(a)


Beachte, dass Trigonometrische Funktionen wie sin und cos aus C++' Standardbibliothek nicht Winkel im Gradmaß, sondern in Radiant haben möchte. Grad in Radiant kannst du so umrechnen:

Quellcode

1
rad = degree*6.283185307179/360

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

14.05.2016, 12:10

Ich würde dir vorschlagen dir für die Vektoren eine Klasse zu schreiben die dann möglichst auch die Methoden dafür anbietet. Noch besser wäre es eine fertige Klasse zu nutzen. Wenn ich das richtig sehe benutzt du SFML. Da gibt es fertige Klassen für Vektoren.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige