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

06.03.2013, 15:15

Sprites geladen, wie "fixieren" ? #SFML C++

Hallo liebe Community,

ich arbeite gerade die Tutorialseite von SFML 2.0 durch. Ich habe ein Sprite und dessen Textur geladen. Dieses hier:
http://spritedatabase.net/file/8664

Ich frage mich jetzt, wie ich nur eine bestimmte Figur "benutzen" kann. In dem Tutorial habe ich etwas von sf::IntRect gelesen. Was sich so verwenden lässt:

C-/C++-Quelltext

1
pTexture.loadFromFile("char.png", sf::IntRect(32,32,0,0))) 



Das funktioniert wohl auch, nur habe ich keine Ahnung welche Werte ich im Parameter übergeben muss, um an die gewünschte Figur zu bekommen. Das ist ja wie Rätselraten^^... Daher meine Frage:

1. Macht man das immer so ?
2. Wie komme ich bequem an die richtigen Werte ohne rumzuprobieren? Gibts da irgendwie ein Programm oder so für?

Ich bedanke mich herzlich :) !

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.03.2013, 15:26

Schau mal in die Dokumentation der Funktion. Da dürfte drinstehen, was der Parameter bedeutet. Ich vermute, es sind Pixelwerte des Bildausschnitts, den Du lesen willst. Die Zahlen bedeuten demzufolge entweder (LinkeKante, ObereKante, Breite, Höhe) oder (LinkeKante, ObereKante, RechteKante, UntereKante) in Pixeln, je nach Geschmack des Erfinders der Funktion.

Die Pixelwerte ermittelst Du dann ganz banal mit einem Malprogramm.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

06.03.2013, 16:14

Hallo Schrompf,

erstmal vielen Dank für deine Antwort. Ich denke mal auch, dass es pixel sind. So ganz geht es aus der Klasse nicht hervor(?). Ich werde auch vom Tutorial von sf::IntRect:: auf sf::Rect verlinkt:
http://www.sfml-dev.org/documentation/1.…ssf_1_1Rect.php

Dort steht nur

Zitat


Rect::Rect
(
T LeftCoord,
T TopCoord,
T RightCoord,
T BottomCoord
)
So ganz ist mir aber noch nicht klar was das jetzt genau bedeutet. Und zwar wollte ich mir die Erste Figur mal anzeigen lassen. Hab die File in GImp geöffnet und dann ermittelt: Oben Links 9px , oben rechts 30px, unten rechts 30px, unten Links 9px. Aber das wird wohl nicht richtig sein (?). Mein Konstruktor sieht dann so aus: sf::IntRect(9,30,30,9). Angezeigt wird mir nur die untere Hälfte der gewünschten Figur.

edit: ok wahrscheinlich habe ich schon einen grundlegenden Denkfehler was die Sprite angeht. wenn ich ans obere linke ende meiner figur komme, steht da 9,9 px das ist ja denke ich mal die x und y koordinate in pixeln? in meinem Parameter habe ich jetzt nur 9 genommen und dann mit dem nächsten Wert weiter gemacht. Das kann ja schon nicht stimmen. Aber ich kann ja auch nicht 4x 2 Werte eintragen mit , getrennt :thinking: ...

Vielleicht hat ja noch jemand einen Tipp :) !

Lg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Casi« (06.03.2013, 16:31)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

06.03.2013, 16:36

Stell dir vor du hast ein Rechteck, welches den oberen linken Punkt bei 10,20 hat und eine Breite von 50 und eine Höhe von 70 Pixeln.
Dann hättest du: (10, 20, 60, 90) als Werte. Du gibst im Prinzip den Punkt oben links und unten rechts an. (x, y, x + breite, y + höhe).

edit: Koordinaten wären dann bei 2.0 (10, 20, 50, 70)
„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.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (06.03.2013, 16:47)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

06.03.2013, 16:36

Eigentlich ist die Verwendung sogar verkehrt.
Man lädt eigentlich eine gesamte Textur und setzt im Sprite dann "setTextureRect". Aber auch da übergibt man natürlich ein Rectangle mit den Koordinaten links oben und rechts unten, bzw. Breite und Höhe.
Vor allem aber solltest Du aufhören Teile aus der 2.0-Dokumentation zu lesen und Teile aus der 1.4! Die beiden sind nicht kompatibel.
http://www.sfml-dev.org/documentation/2.…ssf_1_1Rect.php
Da steht nun auch ganz klar, dass es links, oben, Breite und Höhe ist, was man übergibt, nicht links oben und rechts unten. Für 2.0 ist der Code von Schorsch also verkehrt.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (06.03.2013, 16:44)


6

06.03.2013, 16:53

Zitat

Du gibst im Prinzip den Punkt oben
links und unten rechts an. (x, y, x + breite, y + höhe).
Jetzt hab ich es vertanden und es funktioniert. super :) !

Zitat

Vor
allem aber solltest Du aufhören Teile aus der 2.0-Dokumentation zu
lesen und Teile aus der 1.4! Die beiden sind nicht kompatibel.
http://www.sfml-dev.org/documentation/2.…ssf_1_1Rect.php
Da
steht nun auch ganz klar, dass es links, oben, Breite und Höhe ist, was
man übergibt, nicht rechts links oben und rechts unten. Für 2.0 ist der
Code von Schorsch also verkehrt.
Also das von Schorch
hat aber jetzt funktionert? Ich habe den oberen linken px Wert
ermittelt. In meinem Fall 9, 7 und dann die breite 21 und Höhe 38
sf::IntRect( 9,7,21,38 ). Aber ja, ich sollte nicht die alte Doc. lesen.
Ich habe über Google nach der Rect Klasse gesucht um sie hier zu
verlinken und bin dann wohl bei v.1.4 gelandet - entschuldigt ^^ ...
Eigentlich ist die Verwendung sogar verkehrt.
Man lädt eigentlich eine gesamte Textur und setzt im Sprite dann "setTextureRect". Aber auch da übergibt man natürlich ein
Also ich hab es jetzt so gemacht:

C-/C++-Quelltext

1
2
3
4
5
sf::Texture pTexture;
sf::Sprite pImage;

pTexture.loadFromFile("char.png", sf::IntRect(9,7,21,38));
pImage.setTexture(pTexture);


d.h ich sollte es eigentlich eher so machen?

C-/C++-Quelltext

1
2
3
 pTexture.loadFromFile("char.png");
 pImage.setTexture(pTexture);
 pImage.setTextureRect(sf::IntRect(9,7,21,38));


Aber warum?^^

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

06.03.2013, 16:58

Höhe und Breite, als 21 und 38 ist aber nicht das, was Schorsch gezeigt hat. Das wäre nämlich 9+21, 7+38 gewesen ;)
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]

8

06.03.2013, 17:04

Ups hast recht :D ... Danke !

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

06.03.2013, 17:40

Und ja die zweite Variante von dir ist besser. Wenn du jetzt ein anderes Rechteck von deiner Textur anzeigen willst musst du nur das Rechteck ändern und keine neue Textur laden.
„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.“

10

06.03.2013, 20:18

Vielen Dank nochmal ! Jetzt funktioniert alles. Meine Sprite wandert inzwischen über den Bildschirm :D ...

Jetzt habe ich aber noch eine generelle Frage. Viele Sprites decken nicht alle Bewegungen ab. z. B. die da oben hat nur Animationen für "nach rechts laufen". Eigentlich reicht das ja auch, denn das ist ja die selbe Animation wie für die andere Richtung. Jetztr frage ich mich nur, wie ich das in meinem Programm mache. Ich dachte da an spiegeln der Sprite bzw der Textur. Allerdings finde ich keine Funktion dafür.

Lg :) !

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Casi« (06.03.2013, 20:32)


Werbeanzeige