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

24.07.2012, 22:12

Sprite durch Angabe eines Winkels bewegen

Hallo,

ich benutze SFML und würde gern ein Sprite verschieben durch Angabe eines Winkels. Der Winkel (Gradzahl) wird dem Konstruktor beim Erstellen des Sprite mitgegeben.

Bsp.: Der Sprite befindet sich mittig links auf dem Spielfeld (Position wird zufällig bestimmt) und als Gradzahl ist 45° angegeben.



Wie kann ich den Ball in diese Richtung bewegen (die Methoden setPosition() und move() sind mir bekannt) nur mit Angabe des Winkels? Dazu muss ich ja irgendwie durch den Winkel an die X und Y Koordinaten kommen? Ich komm selber gerade nicht auf die mathematische Formel (Abitur in der Tasche, Mathematik verdrängt :D ).

Ein Ansatz würde mir sicher helfen.

Danke!

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

24.07.2012, 22:17

Stichwörter:
Sinus, Kosinus ;)

Ich weiß nicht wofür du es brauchst, aber eigentlich ist es immer wesentlich praktischer die Spielmechanik komplett mit Vektoren zu realisieren.
Daher meine Frage:
Woher kommt die Gradzahl?

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

3

24.07.2012, 22:20

Mit dem Winkel kannst du nur die Richtung bestimmen, nicht jedoch die Distanz...
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

4

24.07.2012, 22:22

Eine Geschwindikeit wird natürlich auch noch mitgeliefert, habe ich vergessen zu erwähnen.
Die Gradzahl wird in meinem Fall eine Zufallszahl zwischen 0-360° sein.

Gruß
.
Edit: Sobald der Sprite (Ball) an der Wand ist, soll er wieder abprallen (also Einfallswinkel = Ausfallswinkel).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Anom21« (24.07.2012, 22:35)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

24.07.2012, 22:35

Hast meinen Beitrag durchgelesen?

Ich zweifle übrigens immer mehr daran, dass Winkel hier sinnvoll sind.

EDIT:

Zitat

Edit: Sobald der Sprite (Ball) an der Wand ist, soll er wieder abprallen (also Einfallswinkel = Ausfallswinkel).

Typischeranwendungsfall für Vektoren.

Wenn der Ball gegen etwas horizontales fliegt, die Y-Koordinate negieren.
Wenn der Ball gegen etwas vertikales fliegt, die X-Koordinate negieren.

Für beliebig ausgerichtete Flächen gibt es folgende einfache Formel:
result = l - 2.0 * dot(N,I) * N;

Ich garantiere dir jedenfalls, dass mit Vektoren langfristig das meiste wesentlich einfacher und performater geht. ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (24.07.2012, 22:44)


eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

6

24.07.2012, 22:43



Hast meinen Beitrag durchgelesen?

Ich zweifle übrigens immer mehr daran, dass Winkel hier sinnvoll sind.

Es ist vielleicht nicht die beste Lösung, dann wiederum weisst du nicht genau für was er es braucht. Ausserdem wurden Polarkoordinaten nicht umsonst eingeführt, irgendwo gibt es schon ein Nutzen dafür.
Du kannst natürlich auch dieses PRoblem mit Vektoren lösen oder ein nicht allzu schöne Matheformel dort einbauen, oder aber du kannst eine PolarVector Klasse verwenden und dann einfach eine rotate Funktion einbauen. Thor, eine Library die SFML erweitert hat solch eine Klasse. Zusätzlich gab es da erst kürzlich eine solche Klasse im SFML Forum.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

24.07.2012, 22:47

Er hat ja jetzt gesagt, weshalb er Winkel nehmen wollte.
Und da sind Vektoren einfach wesentlich im Vorteil.

Die richtig großen Vorteile kommen schon bei so einfachen Sachen wie Reibung und einfache gleichmässige Erdbeschleunigung deutlich raus.
Mit Vektoren wäre das ein Einzeiler.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

8

24.07.2012, 22:50

Er hat ja jetzt gesagt, weshalb er Winkel nehmen wollte.
Und da sind Vektoren einfach wesentlich im Vorteil.

Die richtig großen Vorteile kommen schon bei so einfachen Sachen wie Reibung und einfache gleichmässige Erdbeschleunigung deutlich raus.
Mit Vektoren wäre das ein Einzeiler.

Ja nach dem ich bereits am Schreiben war kam der Edit von ihm und dann von dir... :|
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

9

24.07.2012, 23:05

Und wie übergebe ich den Vektor dann (anstatt eine zufällige Zahl zwiscehn 0-360°)?
Wie wird der Ball dann bewegt? Ich habe dann ja einen Richtungsvektor (x/y) und eine Geschwindigkeit, nur welche Methode benutze ich (move() oder setPosition()) und was muss man alles zusammenrechnen? Vektor * Geschwindikeit * elapsedTime wird ja nicht stimmen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

25.07.2012, 08:03

Dein Vektor kann sowohl die Richtung als auch die Geschwindigkeit enthalten.
Und ja, in jedem Update addierst du den Vektor multipliziert mit der vergangenen Zeit auf die Position drauf.

Zufälliger Richtungsvektor mit der Länge 1:
Winkel = Random(0, 360)
Vektor = (Sin(Winkel), Cos(Winkel))

Multipliziere den Vektor dann mit der gewünschten Geschwindigkeit.

Werbeanzeige