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

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

1

30.10.2012, 22:59

Sfml 2 - Animationsproblem

Hallo,
Ich habe ein kleines Problem mit meiner Animation. Es wird immer zuviel vom eigentlichen Image angezeigt. Hier ein Screenshot:

http://s1.directupload.net/file/d/3059/on7pdkn9_jpg.htm

Ich benutze IntRect, welches mir erlaubt nur einen gewissen Teil der Textur anzuzeigen. So sieht das bei mir im Code aus:

C-/C++-Quelltext

1
2
    spriteImage.setTextureRect(sf::IntRect(currentFrameX, currentFrameY * getFrameHeight(),
                                                                 currentFrameX + getFrameWidth(), currentFrameY * getFrameHeight() + getFrameHeight()));


Das obere sind die Anfangspunkte des Rects, die unteren Parameter die Endpunkte. Und eben bei den Endpunkten geht immer irgendetwas schief...
Angenommen currentFrame ist = 0. Dann müsste der Endpunkt von currentFrameX = currentFrameX + getFrameWidth() sein. getFrameWidth() gibt als Rückgabewert genau die Breite eines Bildes von der Animation aus. Dieser Wert bleibt immer Konstant, weshalb ich schonmal nicht verstehe, wieso die Breite meines Rects, welches angezeigt wird variiert.

Es wäre schonmal hilfreich, wenn ich wenigstens das Problem mit der Breite lösen könnte, denn ich denke auf ganz ähnliche Weise passiert das auch mit der Höhe.
Könnt ihr euch vielleicht denken, woran das liegt?
Bin für jede Hilfe dankbar... ;(

Gruß,
Luca

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

2

31.10.2012, 02:23

Das dritte und vierte Argument eines sf::Rect ist die Breite und die Höhe relative zu den Koordinaten (erster & zweiter Prameter) des sf::Rect.
In deinem Fall bleibt die Breite eines Animationsframes immer gleich (also getFrameWidth()). Das selbe gilt für die Höhe.
Für die Animation solltest du den ganzzahligen Animationsframe Index mit der Framebreite multiplizieren. Das Ganze könnte dann so aussehen:

C-/C++-Quelltext

1
2
sf::Vector2i currentFrame(0, 0);
spriteImage.setTextureRect(sf::IntRect(currentFrame.x*getFrameWidth(), currentFrame.y*getFrameHeight(), getFrameWidth(), getFrameHeight() ));
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/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

31.10.2012, 07:35

Für die Animation solltest du den ganzzahligen Animationsframe Index mit der Framebreite multiplizieren.

Wobei Du davon ausgehst, dass alle Frames horizontal im Image liegen. Das ist sicherlich nicht zwangsweise der Fall.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

4

31.10.2012, 12:04

Wobei Du davon ausgehst, dass alle Frames horizontal im Image liegen. Das ist sicherlich nicht zwangsweise der Fall.
Ja, ich hatte da ursprünglich auch ein Hinweis auf die Annahme, muss den wohl aber ausversehen gelöscht haben, als ich die Antwort noch einmal umgeschrieben habe.
Leider hat der OP nichts über die Anordnung der Bilder gesagt und die Art wie er die Animation ausführt, von daher kann man nur raten und evtl. falsche Annahmen machen. Da das Anordnen der Frames in einer Zeile eine häufig verwendete Methode ist und der Screenshot dieses Argument unterstützt nahm ich das einfach in etwa an. Weiter jedoch limitiert mein gegebener Code dies nicht, denn es kann ganz einfach x und y von currentFrame manipuliert werden.
Ausserdem war das eigentliche Problem, dass versucht wurde die rechte und untere Koordinate zu berechnen, während ein sf::Rect jedoch durch (Top, Left, ) Breite und Höhe definiert ist.
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/

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

31.10.2012, 13:33

Da das Anordnen der Frames in einer Zeile eine häufig verwendete Methode ist und der Screenshot dieses Argument unterstützt nahm ich das einfach in etwa an.

es mag schon sein, dass das eine häufig verwendete Methode ist, aber der Screenshot spricht aus 2 Gründen dagegen:
man sieht unter dem Charakter den Charakter nochmal, allerdings mit einer anderen blickrichtung
es handelt sich dabei um einen Charakter im Stile einer der RPG Maker (wenn ich richtig bin RPG Maker XP), bei denen die Charaktere bisher immer 2-Dimensional gehalten wurden (vertikal die verschiedenen Blickrichtungen, horizontal die Frames der jeweiligen Richtung)
die Animation an sich liegt zwar nur auf einer Ebene, um das richtige Teilbild zu ermitteln, muss jedoch auch der Index für die Blickrichtung (bzw. der Index, der sich aus der Blickrichtung ergibt) verwendet werden

aber wie du schon selbst richtig geschrieben hast: dein Code ist was das angeht schon richtig ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

6

31.10.2012, 13:40

es mag schon sein, dass das eine häufig verwendete Methode ist, aber der Screenshot spricht aus 2 Gründen dagegen:
bei denen die Charaktere bisher immer 2-Dimensional gehalten wurden (vertikal die verschiedenen Blickrichtungen, horizontal die Frames der jeweiligen Richtung)
Hö? Das ist ja genau das was ich sagte und angenommen habe. Die Frames einer Animation liegen alle auf einer Zeile. Über die vertikale Position habe ich nichts gesagt.

aber wie du schon selbst richtig geschrieben hast: dein Code ist was das angeht schon richtig ;)
Ja die ganze "Diskussion" ist völlig überflüssig und ich muss mich wieder mal fragen, ob das nun einfach nur wieder Posts sinds, damit man hier auch noch sein Wort abgegeben hat, egal ob relevant oder nicht. (Siehe 'Umgang im Forum' Diskussion...) :|
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/

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

7

31.10.2012, 15:52

oh, vielen dank! Stimmt, ich hatte noch in der alten Dokumentation geguckt. Von sfml 1.6 geguckt

Werbeanzeige