Hallo liebe Community,
Da ich mit Autoit(Scriptsprache) und GDI+ ein wenig vorbelastet bin, mach ich mir seeeeehr gründlich Gedanken wie ich am besten und schnellsten Die Sprites auf den Screen bekomme.
Das wird jeddoch erst bei rießigen Maps mit vielen Sprites (meiner Meinung nach) ein Problem.
Ein Beispiel wäre eine 10.000x10.000 Pixel große Map mit vielen unterschiedlich großen Sprites.
Meine Lösungsvorschläge wären:
- Ein Offscreen-Image mit der Größe der Map, auf das vor Spielbeginn alle Sprites gezeichnet werden und später über die Sprite-Methode "SetSubrect(sf::Rect)" immer angepasst und gezeichnet wird. (aber ob das viel Speicher frisst?)
- Die zu zeichnenden Sprites werden alle mit Image erzeugt und danach in einer 3D-Array gespeichert. Diese sieht so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
sf::Sprite Map[9][9][50]
// Die ersten 2 Dimensionen sind für die X u. Y-Position der "Quadranten" da, die die Map in 10x10 Quadrate teilt
// Die letzte Dimmension ist für die Sprites vorgesehen, die in dem "Quadrant" sind
Map[0][0][0].SetImage("sprite1") ; Map[0][0][0].SetPosition(20,500) ;
Map[0][0][1].SetImage("sprite2") ; Map[0][0][0].SetPosition(900,900)
// Das Sprite ist von der Weite außerhalb des ersten Quadranten (1100 > 10.000/10), somit also im 2. Q.
Map[1][0][0].SetImage("sprite3") ; Map[0][0][0].SetPosition(1100,300) ;
Map[1][2][0].SetImage("sprite4") ; Map[0][0][0].SetPosition(1100,3400) ;
|
Das würde mir eine Art "Tile"-Map ermöglichen und immer nur die Sprites zeichnen die sich in dem gerade zu sehenden "Quadranten=Tiles" befinden. - Eine Array mit allen Sprites, die Durchgearbeitet wird und geschaut wird welches Sprite sichtbar ist (ist meiner Meinung nach dümmer als 2.)
- Euere Vorschläge!
Wird eigentlich beim Übergeben eines Images an ein Sprite (SetImage) das Image kopiert oder ist das nur ein Zeiger?
Ist es ratsam die Sprites und Images vor Spielbeginn alle zu laden und zu erzeugen oder ist es besser wärend dem Spiel nachzuladen?
Ich freue mich auf eure Hilfe
Grüße Faweyr