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

23.01.2010, 09:01

Rotation eines Sprites...

Hallo,

Bevor ihr das Thema schließt und schreiend aus dem Zimmer
rennt, versichere ich euch diesmal das ich den Code selber
machen werde falls es nötig ist und sich das Problem
nicht leichter lösen lässt.

So, jetzt zu meinem Problem, also diesmal geht es um
eine ganz simple rotation, beim drücken der rechten Taste
soll der Sprite sich rotieren (der Sprite ist rund) (immer noch das
Jump and run Spiel) und beim drücken der linken Taste
soll er sich halt andersrum rotieren, das brauche ich da ich
nicht mit animation arbeite, hört sich simpel
an, bereitet aber leider Probleme.

Hab auch schon in der FAQ gesucht aber leider nichts
passendes gefunden auch google spuckt nicht wirklich was
aus, meistens auch nur für 3D oder einer anderen API wo
die Rotate methoden schon da sind.

Das problem bei der Methode von SFML zum rotieren, ist
das wenn ich die Rotation auf höher als 3 einstelle
der Sprite irgendwie hoch geht sich rotiert und wieder runter
geht. Was ich aber will ist das die rotation sich auf der X Achse
bewegt Also so, * = Sprite - = X Position

*----- --* mal 10°--

etc. der Sprite soll halt nicht hoch gehen sonder im stand
die Rotation und Bewegung nach rechts durchführen, gleichzeitig.

Tja, und das ist halt das Problem, bei der Methode von SFML
geht der Sprite immer hoch und runter.

So, falls ich das jetzt nicht mit der Methode von SFML
lösen kann und selber eine Funktion dazu machen soll,
wäre meine Frage wie ich es hinbekomme den Sprite vom
Prinzip her zu rotieren, also wie kann ich die XPosition des eigenes
Sprites ändern.

Falls ne funktion gemacht werden soll, bitte keine CodeBeispiele
geben wills langsam selber hinbekommen, auch wenn keine
neue funktion benötigt wird und mann das mit der Methode von
SFML hinbekommt kein Code geben sondern nur das Prinzip geben.

Wäre nett und danke schonmal! :D

2

23.01.2010, 10:09

Du kannst in DX und bestimmt auch in der SFML einen Punkt angeben, um den rotiert werden soll. Ist dieser nicht in der Mitte des Sprites bewegt es soch logischer weise.

In DX war dieser Punkt immer bei 0,0 als Standardwert und damit hat sich das Sprite um die linke obere Kante gedreht.

Du musst also den Mittelpunkt des Sprites berechnen und diesen als Rotationspunkt angeben. Danach kannst du einfach die Werte um die rotiert werden soll angeben und es dreht sich wie gewünscht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

23.01.2010, 10:59

Wie chriss schon sagt. Die Methode "SetCenter()" vom SFML Sprite klingt verdächtig ;)

4

23.01.2010, 11:26

Ok, hab mir jetzt echt mühe geben logisch zu denken, aber ich
brauch glaub ich einen weiteren denk anstoß.

So siehts jetzt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
        float ElapsedTime = App.GetFrameTime();
        if (App.GetInput().IsKeyDown(sf::Key::Left))  
        {   
            SpRotat.SetPosition(Sprites[0].GetPosition()); //Der Punkt ist unter dem Sprite Bild

            //vom Charakter

            SpRotat.Rotate(100 * ElapsedTime);
            //Er Rotiert sich wenn IsKeyDown == true

            Sprites[0].SetPosition(SpRotat.GetPosition().x);
            //Sprites Position == SpRotat (RotationsPunkt) X Pos

            Sprites[0].Move(-CharSpeed * ElapsedTime, 0);
            CharSpeed--;
        }


Zitat

1>.\....cpp(52) : error C2664: 'void sf::Drawable::SetPosition(const sf::Vector2f &)': Konvertierung des Parameters 1 von 'const float' in 'const sf::Vector2f &' nicht möglich
1> Ursache: Konvertierung von 'const float' in 'const sf::Vector2f' nicht möglich
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig


Wenn ich SpRotat.GetPosition() mache ohne .x dann gehts
zu Compilieren, aber der Char bewegt sich ganz normal ohne
Rotation. Ein weiterer Denkanstoß oder ein in die richtige
Richung schubs wäre nett.
Hab auch schon Sprites[0].SetRotation(SpRotat.GetRotation()); versucht, nur
rotiert er dann halt so wie davor. Und bewegt sich also auch
auf der Y Achse.

EDIT: Achja, und wenn ich es so mache:

C-/C++-Quelltext

1
2
3
4
5
            SpRotat.SetCenter(Sprites[0].GetCenter()); //Der Punkt ist in der Mitte

            //vom Charakter

            SpRotat.Rotate(100 * ElapsedTime);
            Sprites[0].SetPosition(SpRotat.GetPosition());
            Sprites[0].Move(-CharSpeed * ElapsedTime, 0);


Geht der zu rotierende Char immer nach oben, ich denke das
heißt, das der RotationsPunkt nicht in der Mitte des Chars ist sondern
oben ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

23.01.2010, 11:31

C-/C++-Quelltext

1
Sprites[0].SetPosition(SpRotat.GetPosition().x); 


Dass das nicht geht ist wohl klar wenn die Funktion einen Vektor als Parameter erwartet, was genau sollte denn da auch rauskommen^^

Hast du unsere beiden Antworten eigentlich gelesen? Pack den Rotationsmittelpunkt mit SpRotat.SetCenter(/*hier deine Koordinaten*/) in den Mittelpunkt des Sprite, dann sollte es "richtig" rotieren.

6

23.01.2010, 11:34

Schau mal oben habs Editiert, so wie du es mit SetCenter()
gesagt hast hatte ich es auch versucht. Was für
Koordinaten soll ich denn sonst nehmen?

Edit: Naklar lese ich was ihr schreibt. Sonst würde ich
ja garnicht zur Lösung bzw. in die Code Richtung kommen. :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

23.01.2010, 11:39

C-/C++-Quelltext

1
SpRotat.SetCenter(Sprites[0].GetCenter());


Dir ist schon klar was du da tust, oder? Du setzt den Mittelpunkt des Sprite auf den aktuellen Mittelpunkt des Sprite. Das ist also effektiv das selbe als würdest du einfach nix hinschreiben...

Ich muss gestehen noch nie mit der SFML gearbeitet zu haben. Aber ich würde mal sagen dass du da einfach die Koordinaten in Pixeln angibst.
Wenn das Sprite 100x200 Pixel groß ist dann gib ihm den Punkt (50, 100).

8

23.01.2010, 12:06

Hmm.. kriegs nicht hin.

C-/C++-Quelltext

1
2
            Sprites[0].SetCenter(10, 10);
            SpRotat.SetPosition(Sprites[0].GetCenter());


Oder

C-/C++-Quelltext

1
2
            Sprites[0].SetCenter(10, 10);
            SpRotat.SetCenter(Sprites[0].GetCenter());


Oder

C-/C++-Quelltext

1
2
                        SpRotat.SetPosition(Sprites[0].GetPixel(10,10));
// bzw.  SetCenter(...)... 


Das letze geht geht garnicht dann kommt das:

Zitat

1>.\...cpp(48) : error C2664: 'void sf::Drawable::SetPosition(const sf::Vector2f &)': Konvertierung des Parameters 1 von 'sf::Color' in 'const sf::Vector2f &' nicht möglich
1> Ursache: Konvertierung von 'sf::Color' in 'const sf::Vector2f' nicht möglich
1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden


Und bei den anderen geht er dann wieder einfach hoch weil
der rotationspunkt warscheinlich nicht dort hingeht wo er hingehen
soll..

Oder hab ich dich falsch verstanden?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

23.01.2010, 12:08

dot hats doch schon erklärt. du musst die position der mitte selbst herausfinden indem du die größe des sprites halbierst. die größere findest du mit getSize() heraus glaub ich.

grundlagen! >.<
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

23.01.2010, 12:16

*hust* hab ich doch versucht...?

C-/C++-Quelltext

1
  Sprites[0].SetCenter(10, 10); 

Werbeanzeige