Kleines (??) Problem mit SDL
-
Ich bin grad an den ersten Gehversuchen mit VC++ und SDL. Ich will erstmal einfach nur ein Programm schreiben, bei dem ich ein Hintergrundbild (hintergrund.png) hab und eine Figur bzw. ein anderes Bild (figur.png) hoch, runter, links und rechts bewegen kann.
Allerdings sobald ich eine Taste drücke schließt sich das Programm. Woran liegt das, das funktioniert aber schon mit#include "SDL/SDL.h" #include "SDL_image.h" #include <string> const int fenster_hoehe = 480; const int fenster_breite = 640; const int fenster_tiefe = 32; SDL_Surface *hintergrund = NULL; SDL_Surface *figur = NULL; SDL_Surface *fenster = NULL; SDL_Event event; SDL_Surface *lade_Bild(std::string datei) { SDL_Surface* bild = IMG_Load(datei.c_str()); if(bild != NULL) { bild = SDL_DisplayFormat(bild); Uint32 colorkey = SDL_MapRGB(bild->format, 0, 0xFF, 0xFF); SDL_SetColorKey(bild, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey); } return bild; } void apply_surface(int x, int y, SDL_Surface* quelle, SDL_Surface* ziel) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface(quelle, NULL, ziel, &offset); } void clean_up() { SDL_FreeSurface(figur); SDL_FreeSurface(hintergrund); SDL_Quit(); } int main(int argc, char* args[]) { int left = 200; int top = 300; bool quit = false; if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) { return 1; } fenster = SDL_SetVideoMode(fenster_breite, fenster_hoehe, fenster_tiefe, SDL_SWSURFACE); if(fenster == NULL) { return 1; } SDL_WM_SetCaption("Programm und so",NULL); figur = lade_Bild("figur.png"); hintergrund = lade_Bild("hintergrund.png"); apply_surface(0,0,hintergrund,fenster); apply_surface(left,top,figur,fenster); SDL_Flip(fenster); SDL_FreeSurface(figur); SDL_FreeSurface(hintergrund); while(quit == false) { while(SDL_PollEvent(&event)) { if(event.type == SDL_KEYDOWN) { switch(event.key.keysym.sym) { case SDLK_UP: top = top - 20; break; case SDLK_DOWN: top = top + 20; break; case SDLK_LEFT: left = left - 20; break; case SDLK_RIGHT: left = left + 20; break; } apply_surface(left,top,figur,fenster); SDL_Flip(fenster); } if(event.type == SDL_QUIT) { quit = true; } } } }
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
du machst
SDL_FreeSurface(figur);
SDL_FreeSurface(hintergrund);
und verwendest die dann noch
gehoehrt nach der while schleife
-
hmm, wie kam denn das da hin?? ^^
ok, ich habs jetzt soweit, dass ich das männchen bewegen kann. aber ich will das so machen, das wenn man auf der taste bleibt, soll sich das männchen so lange bewegen, bis man die taste loslässt. bis jetzt macht er einen schritt und bleibt dann stehn.#include "SDL/SDL.h" #include "SDL_image.h" #include <string> const int fenster_hoehe = 480; const int fenster_breite = 640; const int fenster_tiefe = 32; const int frames = 20; SDL_Surface *hintergrund = NULL; SDL_Surface *figur = NULL; SDL_Surface *fenster = NULL; SDL_Event event; SDL_Surface *lade_Bild(std::string datei) { SDL_Surface* bild = IMG_Load(datei.c_str()); if(bild != NULL) { bild = SDL_DisplayFormat(bild); Uint32 colorkey = SDL_MapRGB(bild->format, 0, 0xFF, 0xFF); SDL_SetColorKey(bild, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey); } return bild; } void apply_surface(int x, int y, SDL_Surface* quelle, SDL_Surface* ziel) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface(quelle, NULL, ziel, &offset); } void clean_up() { SDL_FreeSurface(figur); SDL_FreeSurface(hintergrund); SDL_Quit(); } int main(int argc, char* args[]) { int left = 200; int top = 300; bool quit = false; if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { return 1; } fenster = SDL_SetVideoMode(fenster_breite,fenster_hoehe,fenster_tiefe,SDL_SWSURFACE); if(fenster == NULL) { return 1; } SDL_WM_SetCaption("Programm und so",NULL); figur = lade_Bild("figur.png"); hintergrund = lade_Bild("hintergrund.png"); apply_surface(0,0,hintergrund,fenster); apply_surface(left,top,figur,fenster); SDL_Flip(fenster); while(quit == false) { while(SDL_PollEvent(&event)) { if(event.type == SDL_KEYDOWN) { switch(event.key.keysym.sym) { case SDLK_UP: top = top - 20; break; case SDLK_DOWN: top = top + 20; break; case SDLK_LEFT: left = left - 20; break; case SDLK_RIGHT: left = left + 20; break; } } if(event.type == SDL_QUIT) { quit = true; } } apply_surface(0,0,hintergrund,fenster); apply_surface(left,top,figur,fenster); SDL_Flip(fenster); } clean_up(); return 0; }
-
da fehlt dann ein bissl programm logik
du brauchst irgendwie einen marker der bei keydown gesetzt wird und bei keyup zurueckgesetzt wird.
beim loopen: wenn marker dann ....
oder einen von zig anderen moeglichen wegen gehen
-
SDL_EnableKeyRepeat (50,5);//ab 50 millisekunden alle 5 Sekunden Tastendruck wiederholen.