wie kann ich ein image surface wieder löschen??
-
ich habe folgendes problem.
ich habe ein .bmp in ein sdl projekt eingefügt. ich verwende 2 surfaces:
SDL_Surface *screen;
SDL_Surface *image;folgenden code habe ich mir zusammengefutzelt:
SDL_Surface *image; SDL_Rect dest; image = SDL_LoadBMP("Bild.bmp"); dest.x = 200; dest.y = 250; dest.w = image->w; dest.h = image->h; SDL_BlitSurface(image, NULL, screen, &dest); SDL_UpdateRects(screen, 1, &dest);
jetzt wird der screen surface angezeigt und auch das image surface.
jetzt warte ich auf ein startkommando (F2 Taste), danach soll nur noch das screen surface angezeigt werden. ich zeichne das screen surface alle 2 sec. neu und jetzt ist es so das das image einmal erscheint und beim 2. zeichnen nicht mahr, dann wieder, dann wieder nicht....wie kann ich das image surface endgültig löschen? habs mit "SDL_FreeSurface(image);" versucht, klappt aber nicht?!?
danke für die hilfe schonmal..
-
du willst das bild nur einmal anzeigen?
dann benutz doch ne if anweisung mit ner bool variablen... wenn das bild nicht mehr angezeigt werden soll, dann setzt du die variable auf false undd das image wird nicht mehr drauf geblittet....
P.S.: eigentlich sollte SDL_FreeSurface(SDL_Surface* image); funktionieren...
-
danke leech, leider kann ich mir nicht denken wie du das meinst??!
Kann ich das bild nicht gleich auf das screen surface printen? oder kannst du mir ein beispiel geben?danke
-
du willst doch das image nur einmal am anfagn anzeigen, solange noch keine taste(F2) gedrückt wurde, oder?
also prüfst du irgendwo, ne variable showImage;
bool showImage = true; if(showImage) SDL_BlitSurface(image, 0, screen, 0); //deine parameter halt...
und wenn dann die taste(F2) gedrückt wurde, dann setzt du die variable showImage auf false und das bild wird nichtmerh angezeigt...
oder habe ich dich falsch verstanden?
-
...ja das funktioniert auch, wenn ich "SDL_BlitSurface(image, NULL, screen, &dest);" aufrufe wird das bild gezeichnet bis ich screen neu zeichne, aber das komische ist das ich den screen alle 2 sec. neu zeichnen muß und das das Bild dann einmal erscheint, die nächsten 2 sec. dann wieder nicht und dann wieder für die 2 sec. Also es erscheint jedes 2. mal wenn ich den screen neu zeichne?!?!?
-
mh.... dann muss irgendwo im programm der fehler sein...
wenn es nicht allzu lang ist, dann kannst du es ja mal posten...
-
..ist leider sehr lang. ist ein vc++ dialogprojekt, der sdl teil ist eingebunden.
Was ich nicht verstehe: Also wenn ich ein neues surface erstelle, in diesem fall "image" Dann kann ich darauf zeichnen, das ist so wie ein eigener screen und die einzelnen screens kann man überlagern wie overheadfolien - ist das so?
wenn ja dann will ich das eine surface halt einfach zerstören, dann kann es auch nicht mehr angezeigt werden oder?
-
ja das ist richtig.... du kannst was auch image "zeichnen" und dann einfach image auf den screen blitten...
also wenn ich eine surface mittels SDL_FreeSurface(image) freigebe und dann später das bild auf den screen blitten möchte, dann wird das programm sofort beendet, da es die freigegebene Surface nichtmehr gibt... ich verstehe nicht, dass es bei dir nicht geht... vielleicht gibst du die surface frei, aber hast du dich dann vergewissert, dass sie nicht in der schleife wieder neu zugewiesen wird? es scheint nämlich so, dass es in dem einen schleifendurchgang angezeigt wird und in dem darauffolgendem nicht... musste da nochmal nachschauen... ansonsten kann ich dir auch nicht weiter helfen... sorry
-
.. danke auf jeden fall!
ich zeichne das bitmap ausserhalb der schleife auf das image surface und dann innerhalb der schleife rufe ich immer wieder das screen surface auf. mit drücken der f2 taste gebe ich das image surface allerdings schon frei...
-
Haste vieleicht vergessen den Bildschirm mal zwischen durch schwarz zu machen ?
SDL_FillRect(surface, 0, farbe);Ich weiß nicht ob das möglich ist vieleicht ist das bild ja noch im Speicher nachdem der Speicher bereich frei gegeben ist und es wird deswegen noch angezeigt ...
Aber ansonsten sollte das Bild sowieso nur immer dann angezeigt werden wenn es auch geblitet wird
-
ja... das ist es... die surface wurde freigegeben, aber man verändert die screen surface ja gar nicht... dort ist das image ja noch drauf... also wenn man dann alle anderen sachen bis auf das image auf den screen blittet und denn dann anzeigt, dann sollte es funktionieren...
Bsp.:
#include <iostream> #include <SDL.h> using namespace std; int main( int, char**) { SDL_Surface *screen, *flame; if(SDL_Init(SDL_INIT_VIDEO) < 0) { cout << "Konnte SDL nicht initialisieren!" << SDL_GetError(); exit(1); } atexit(SDL_Quit); screen = SDL_SetVideoMode(640, 480, 16, SDL_DOUBLEBUF); if(screen == NULL) { cout << "Konnte den Videomode nicht setzen!" << SDL_GetError(); exit(1); } flame = SDL_LoadBMP("Flammen.bmp"); if(flame == NULL) { cout << "Konnte Flamme.bmp nicht laden!" << SDL_GetError(); exit(1); } SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 255, 255)); SDL_BlitSurface(flame, 0, screen, 0); SDL_Event event; bool done = false; while(!done) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = true; break; case SDL_KEYDOWN: if ( event.key.keysym.sym == SDLK_F2 ) { SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 255, 255)); } break; } } SDL_Flip(screen); } return 0; }