SFML-Objekt Array initialisieren.
-
Hallo Com,
ich habe vorhin versucht mein erstes SFML-Spiel selbst zu programmieren. Jetzt möchte ich gerne einen Array erzeugen, in dem 8 Gegner erstellt werden, die dann jeweils von links bzw. von oben auf meinen Spieler zukommen. Soweit zur Theorie. Dieser Quelltext wäre die Initialisierung, die ich vorgenommen hätte. Aber sie erscheint mir doch irgendwie komisch und enemie[a].texture() gibt es nicht.
1. Wie initialisiert man so einen Array richtig?
2. Wie lautet die Funktion, dass ich eine Grafik einbinden kann?for( int a = 1; a <= 8; a++ ) { sf::Vertex enemie[8]; if( a <= 4 ) { enemie[a].position = sf::Vector2f( 0, 80 * a ); } else if( a <= 8 ) { enemie[a].position = sf::Vector2f( 160 * a - 4, 0 ); } enemie[a].texture( &tex_enemie ); //Fail }
Liebe Grüße
-
Lies die offiziellen SFML-Tutorials, du scheinst nicht ganz verstanden zu haben, was
sf::Vertex
macht. Normalerweise brauchst du diese Klasse gar nicht, sondern kannst direktsf::Sprite
undsf::Texture
verwenden. Eine Funktiontexture()
gibts nirgends, keine Ahnung wie du darauf kommst.sf::Vertex::texture
ist jedenfalls eine Membervariable.Im Weiteren scheint dir auch Grundlagenwissen über C++ zu fehlen. Array-Indizes beginnen zum Beispiel immer bei 0. Am besten verwendest du sowieso
std::array
statt normalen Arrays, die sind sicherer und komfortabler. Oder gleichstd::vector
, wenn du eine dynamische Anzahl Gegner haben möchtest.Ich würde dir raten, nochmals ein bisschen in einem guten C++-Buch (z.B. C++-Primer) zu lesen. Spieleprogrammierung ist ein komplexes Gebiet, ohne fundiertes Wissen über die Programmiersprache wirst du immer wieder Probleme haben und mit deren Behebung viel mehr Zeit verschwenden, als du für die Sprache selbst benötigt hättest. Anschliessend solltest du dich gründlich in SFML einlesen (mittels Tutorials und Dokumentation), nicht einfach willkürlich Code zusammenbasteln.
-
Deswegen frage ich danach. Das texture() sollte nur nochmal verdeutlichen, nach was ich suche. Normalerweise sollte ich das beim Array wissen, dass er bei 0 anfängt. Keine Ahnung was da mit mir durchging. Von der Syntax her hab ich keine Probleme mehr mit C++..
sf::Vertex war eben erstmal das, was keinen Syntaxfehler rausgehauen hat.
Ich steh aber gerade auf der Leitung. Welchen Typ nehme ich beim vector?
-
Soo. Für die, die das noch lesen und Interesse an der Lösung haben.
Ich hab jetzt hin und her überlegt und hab gleich nach OOP-Konzept eine Klasse Enemie erstellt und dahinter 8 Member hinzugefügt. Danach werden die dann in einer Funktion der Klasse nach den gegeben Parametern erstellt, die ich vor der Gameloop eingebe.
Ist getestet, hat funktioniert. Obs die beste Lösung ist weiß ich aber nicht.
Das mit den Vectoren wollte nicht so. Aber trotzdem danke Nexus für deine Antwort.
-
AnnoyingApfelmus schrieb:
Ich hab jetzt hin und her überlegt und hab gleich nach OOP-Konzept eine Klasse Enemie erstellt und dahinter 8 Member hinzugefügt.
Besonders objektorientiert ist das nicht, auch wenn Klassen im Spiel sind. Du würdest besser deine Sammlung von 8 Gegnern ebenfalls als Objekt (Container) anschauen und entsprechend modellieren.
AnnoyingApfelmus schrieb:
Das mit den Vectoren wollte nicht so.
Du solltest dem lieber nachgehen, statt eine superkomplizierte Lösung selbst zu basteln.
std::vector
gehört zu den wichtigsten Teilen in der Standardbibliothek, das solltest du als C++-Programmierer schon kennenAnnoyingApfelmus schrieb:
Enemie
Nebenbei: "Enemy" ist das richtige Wort für Gegner. "Enemies" ist die Mehrzahl.
-
Besser oop ist: 8 klassen "enemy" erstellen und nicht eine enemies klasse mit 8 enemies.
Bsp (ungetesteter code):
std::vector<Enemy> enemies; for(int i = 0; i < 8; ++i){ Enemy tempEnemy; //tempEnemy einstellen enemis.push_back(tempEnemy); } while(wnd.isOpen()){ wnd.clear(); // Zeichne Szene ... //Zeichne enemies for(size_t i = 0; i != enemies.size(); ++i){ wnd.draw(enemies[i].getSprite()); } wnd.display(); }
Gruß :xmas1: