z-koar. bei sdl
-
Ich glaube er meint welches bild ganz unten und welches ganz oben ist, also die reihenfolge der grafiken.
Du musst sie einfach in der Reihenfolge zeichnen wie du sie haben willst.schirrmie
-
@schirrmie ja genau das meine ich
aber was ist wenn ich das änder will
-
Hallo
nach TGGC: Wenn du es ändern willst, dann solltest du es ändern.
Du kannst die Reihenfolge ja beispielsweise mittels if ändern.
chrische
-
Wenn du auch unbedingt eine ZKoordinate brauchst kannst du dir auch notfalls n struct machen.
struct SDL_Surface_extended { SDL_Surface surface; int ZKoordinate; };Mal so als weitere lösungsidee :>
-
struct SDL_Surface_extended {
SDL_Surface surface;
int ZKoordinate;
};hab ne idee weiß aber nich wie ich die einsetzen soll:
array[20]; //z.b. ein array wo die SDL_Surface_extended drin ist for(){ if(){ // niedrigste z-koar. im array ,dann das 2 niedrigste usw SDL_BlitSurface(); // bild würd im scrren angezeigt } }und bei neuen z-koar angeben soll der bildschirm geleert werden
und die bilder neu angezeigt werden
-
Du suchst dir die größte Z-Koordinate (am hintersten auf dem Schirm) raus und zeichnest sie. Danach suchst du die nächst-niedrigere und zeichnest sie. Usw.
Wenn du mit C++ arbeitest wird sicher ein passender Container zu finden sein.
Eine map<int, SDL_Surface> könnte passend sein, wobei der erste Parameter des templates dann die Z-Koordinate ist.
Dies ermöglicht dann ein ganz angenehmes iterieren durch die map:std::map<int, SDL_Surface> surfaces; //füllen for(int i = 0; i < surfaces.size(); i++) draw(surfaces[i]);Oder so ähnlich

-
hat vll noch ne andere idee

-
Die Idee von The-Kenny passt doch eh schon so weit.
Allerdings sollte man beachten dass es mehrere Surfaces mit der selben Z-Koordinate geben kann. Man sollte dass also ein wenig anders implementieren. ^^lg, bloodycross
-
Also ich bin mir nicht sicher was du jetzt genau brauchst, aber ich versuch trotzdem ne Antwort.
Nehmen wir mal an, ich hab meine ganzen structs ganz simpel in einem vector gespeichert (wenn du weißt wieviele es werden sollen geht natürlich auch ein array)Dazu hab ich eine Funktion die mir meinen vector (oder mein array) nach der größe der Z-Koorinate ordnet (zu sortierfunktionen und deren implemntierungen unter c/c++ gibts einiges an infos). Vllt mit Pointern arbeiten zum sortieren, siehe z.b. auch bubblesort oder straight insertion sort.
Dann nur noch das array nach Reihenfolge mit BlitSurface ausgeben, also ein ganze einfaches (ich nehm mal an die SDL_Surface wurde als Pointer gespeichert):
for(int i = 0; i < surfaceVector.size(); ++i) { SDL_BlitSurface(surfaceVector[i].surface, 0, screen, 0); } SDL_Flip(); //bzw SDL_UpdateRect(0,0,0,0);Sobald du was änderst, einfach von vorne Anfangen: Erst neu sortieren, dann der Reihe nach ausgeben.
Btw, wär vorallem hilfreich zu wissen in welchem Kontext du es brauchst.
-
hab da was gefunden weiß aber nciht so genau wie ich das einsetzt soll
http://www.zfx.info/Tutorials.php?ID=79ich würde gern das Quicksort verwenden
da es am schnellsten geht ,da ich vieles anzeigen muss(d.h SDL_BlitSurface öffters aufrufen) wie z.b. die map
(http://lazyfoo.net/SDL_tutorials/lesson29/index.php)die z-koar sind daher wichtig da z.b. objekte in der map über den helden stehen müssen
class Blt{ bool set; //ob die src,rect schon einmal gesetzt wurde int z; //die z-koar. nach dem es sortiert werden soll SDL_Surface *src; //die bild src SDL_Rect srcrect; //die src-rect (wichtig bei der map anzeige,und animationen) SDL_Rect dstrect; //das ziel-rect (wichtig bei der map anzeige,und animationen) Blt(); }; Blt::Blt():set(false),z(0),src(NULL){} std::vector<Blt> surfaces;//hier die sortiers-funktion for(int i = 0; i < surfaces.size(); ++i) { if (surfaces[i].set){ SDL_BlitSurface(surfaces[i].src, &surfaces[i].srcrect, screen, &surfaces[i].dstrect); } } SDL_Flip(); //bzw SDL_UpdateRect(0,0,0,0);
-
hab das problem mit den sotiren jetzt gelöst
und habe noch ne kleine frage
muss man nicht irgent wie den bildschirm leeren bevor man alles neu anzeigtCSort::SortZ(surfaces,&CSort::Compare, SORT_QUICKZ); //das sorieren nach den der z.koar for(unsigned int i = 0;i <= surfaces.size();i++){ if (surfaces[i].set){ //set true = surface ist nicht leer SDL_BlitSurface(surfaces[i].src, &surfaces[i].srcrect,screen,&surfaces[i].dstrect); } } if( fps.get_ticks() < 1000 / rate ){ //get_ticks is eine funktion die die zeit zurück liefert, wie lange schon das spiel schon läuft (SDL_GetTicks()-startzeit) SDL_Delay( ( 1000 / rate ) - fps.get_ticks() ); SDL_Flip(screen); }