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

15.05.2011, 11:34

SDL Grafik löschen

Guten Tag,

ich habe ein Problem und zwar lade ich ein Bild mit SDL_LoadBMP und steuere es mit den Pfeiltasten (Variablen x und y werden im event geschrieben) nur jetzt ist mein problem, dass mein char.bmp nicht gelöscht wird, sondern er wird einfach immer wieder neu angezeigt, was zur folge hat, dass ich ganz viele char.bmp auf dem screen hab.
Somit benötige ich nur eine Funktion, das bild char.bmp wieder löscht.


Mein Quellcode sieht für diesen Abschnitt wie folgt aus:

C-/C++-Quelltext

1
      charactere = SDL_LoadBMP("img/char.bmp");      if (charactere == NULL) {          printf("Can't load image: %s\n", SDL_GetError());          exit(1);      }        SDL_Rect charSrc, charDst;      charSrc.x = 0;      charSrc.y = 0;      charSrc.w = charactere->w;      charSrc.h = charactere->h;      charDst.x = x;      charDst.y = y;      charDst.w = charactere->w;      charDst.h = charactere->h;       SDL_BlitSurface(charactere, &charSrc, screen, &charDst);      SDL_FreeSurface(charactere);      SDL_UpdateRect(screen, 0, 0, 0, 0);   


Ich hoffe, dass mir jemand helfen kann.

LG.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

15.05.2011, 11:37

Du lädst nicht zufällig dein Bild _in_ der GameLoop oder? ;)
Dann ists kein Wunder das du 1000 Stück hast und deine Löschidee ist blödsinn. Lad die Grafik einmal _vor_ der Game Loop dann hast du auch nur ein Bild auf deinem Screen.

Ahja und freigeben würd ich dann natürlich Äquivalent dazu _nach_ der Game Loop
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

15.05.2011, 11:39

Ja, aber wie soll ich es dann steuern? Meine idee war, es immer wieder neu zu laden, danach zu löschen, damit ich es mit den pfeiltasten nach oben, unten, links und rechts navigieren kann.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

15.05.2011, 11:40

Du kannst das Ding doch trotzdem steuern, auch wenn du es nur einmal vor der GameLoop lädst.
Deine Surface ist ja trotzdem innerhalb der GameLoop solange vorhanden, bis du es wieder freigibst. Solange kannst du auch auf das interne Surface SDL_Rect Einfluss nehmen und es hinblitten wo auch immer du magst.

edit: Ansonsten zeig einfach mal deinen Code, vllt. miss versteh ich dich auch, was ich aber allein aus Ego Gründen bezweifle :P
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

15.05.2011, 11:52

Ich habe es jetz so gemacht, wie ich es verstanden hab:

Vor der Hauptschleife:

Quellcode

1
  charactere = SDL_LoadBMP("img/char.bmp");  if (charactere == NULL) {      printf("Can't load image: %s\n", SDL_GetError());      exit(1);  }    SDL_Rect charSrc, charDst;  charSrc.x = 0;  charSrc.y = 0;  charSrc.w = charactere->w;  charSrc.h = charactere->h;  charDst.x = 0;  charDst.y = 0;  charDst.w = charactere->w;  charDst.h = charactere->h;     SDL_UpdateRect(screen, 0, 0, 0, 0); 



In der Hauptschleife:

Quellcode

1
case SDL_KEYDOWN:          if (event.key.keysym.sym == SDLK_ESCAPE) {                SDL_Quit();             exit(0);          }                    if(event.key.keysym.sym == SDLK_s){            y = y + 32;            charDst.y = y;          }                    if(event.key.keysym.sym == SDLK_w){            y = y - 32;            charDst.y = y;          }                             if(event.key.keysym.sym == SDLK_a){            x = x - 32;            charDst.x = x;          }                      if(event.key.keysym.sym == SDLK_d){            x = x + 32;            charDst.x = x;          }                          if(event.key.keysym.sym == SDLK_DOWN){            y = y + 32;            charDst.y = y;          }                    if(event.key.keysym.sym == SDLK_UP){            y = y - 32;            charDst.y = y;          }                             if(event.key.keysym.sym == SDLK_LEFT){            x = x - 32;            charDst.x = x;          }                      if(event.key.keysym.sym == SDLK_RIGHT){            x = x + 32;            charDst.x = x;          }                                                                        break;



und

Quellcode

1
 SDL_BlitSurface(charactere, &charSrc, screen, &charDst);



Nach der Hauptschleife:

Quellcode

1
 SDL_FreeSurface(charactere);



Jedoch gleiches Ergebnis...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

15.05.2011, 12:00

Irgendwie zerreisst es hier den Code jedesmal...und ich seh nur Code Ausschnitte, keinen zusammenhängenden.
Pack mal deinen ganzen Code hier rein und poste den Link.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

7

15.05.2011, 12:09

Wollte ich eingentlich vermeiden, aber naja was solls, hier ist der code:
http://www.rswhite.de/code/index.php?q=5…f7b676953abe77d

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

15.05.2011, 12:12

Ah alles klar.
War schon richtig, dass du das Laden _vor_ der Game Loop machst, jetzt fehlt nur noch das clearen des Screen.
Pack mal

C-/C++-Quelltext

1
SDL_FillRect(screen, NULL, 0x000000);
vor SDL_Flip.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

9

15.05.2011, 12:17

Thanks, genau sowas hab ich gesucht! Allerdings geht es vor SDL_Flip nicht, dann kommt nur ein schwarzer screen und wenn ich es dahinter pack werden die andern beiden grafiken nicht geladen, sprich bg und menu.

Edit: jetzt gehts musste die andern BlitSurface auch in die Hauptschleife packen, danke!!!

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

15.05.2011, 12:19

Mein Fehler. Pack es am besten vor oder direkt nach dem Event switch.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige