SDL-Bitte helft mir (Scrolling)



  • hallo.
    bin gerade beim lernen von SDL nun habe ich mit meinem wissen ein code geschrieben mit einem hintergrund.wennn ich nun die z.b. rechte pfeiltaste drücke scrollt es nach rechts geht ja auch alles aber wenn ich die taste gedrückt halte tut es sich blos einmal verschieben und nich mehrmals hintereinander.
    Vielen dank für eure hilfe
    Hier ist der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <SDL.h>
    #define NUM_GALAXIES 50
    
    SDL_Surface *g_pSurfScreen;
    SDL_Surface *g_pSurfGalaxies;
    Uint32 g_Black;
    
    struct galaxy
    {
    	int x,y;
    	int type;
    };
    struct galaxy g_Galaxies[NUM_GALAXIES];
    
    void RandBackground()
    {
    	int i;
    	int num_types;
    	num_types = g_pSurfGalaxies->w / 16;
    	for(i = 0; i<NUM_GALAXIES; i++)
    	{
    		g_Galaxies[i].x = rand()% 1024;
    		g_Galaxies[i].y = rand()% 512;
    		g_Galaxies[i].type = rand()% num_types;
    	}
    }
    void DrawBackground(int scrollx, int scrolly)
    {
    	int i;
    	for(i=0; i<NUM_GALAXIES; i++)
    	{
    		SDL_Rect src;
    		SDL_Rect dest;
    
    		src.x = g_Galaxies[i].type * 16;
    		src.y = 0;
    		src.w = 16;
    		src.h = 16;
    
    		dest.x = ((unsigned int)(g_Galaxies[i].x - scrollx) % 1024) - 16;
    		dest.y = ((unsigned int)(g_Galaxies[i].y - scrolly) % 512) - 16;
    		SDL_BlitSurface(g_pSurfGalaxies, &src, g_pSurfScreen, &dest);
    	}
    }
    
    int main()
    {
    	int running;
    	int scrollx, scrolly;
    	srand(time(0));
    
    	if(SDL_Init(SDL_INIT_VIDEO)<0)
    	{
    		fprintf(stderr,"SDL konnte nicht initalisiert werden: %s\n",
    		                SDL_GetError());
    		exit(1);
    	}
    	atexit(SDL_Quit);
    	g_pSurfScreen = SDL_SetVideoMode(800, 600, 16, SDL_FULLSCREEN);
    	if(!g_pSurfScreen)
    	{
    		fprintf(stderr,"Konnte Bildschirmmodus nicht setzen: %s\n",
    			       SDL_GetError());
    		exit(1);
    	}
    	g_pSurfGalaxies = SDL_LoadBMP("galaxien.bmp");
    	if(!g_pSurfGalaxies)
    	{
    		fprintf(stderr,"Galaxie.bmp konnte nicht geladen werden: %s\n",
    			       SDL_GetError());
    		exit(1);
    	}
    	RandBackground();
    	g_Black = SDL_MapRGB(g_pSurfScreen->format, 0, 0, 0);
    
    	running = 1;
    	scrollx = scrolly = 0;
    	while(running)
    	{
    		SDL_Event event;
    		Uint8 *keystate;
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    				case SDL_KEYDOWN:
    					switch(event.key.keysym.sym)
    					{
    						case SDLK_ESCAPE:
    							running = 0;
    						break;
    
    						default:
    						break;
    					}
    				keystate = SDL_GetKeyState(0);
    				if(keystate[SDLK_LEFT])
    					scrollx -= 10;
    				if(keystate[SDLK_RIGHT])
    					scrollx += 10;
    				if(keystate[SDLK_UP])
    					scrolly -= 10;
    				if(keystate[SDLK_DOWN])
    					scrolly += 10;
    				break;
    				case SDL_QUIT:
    					running = 0;
    				break;
    			}
    		}
    		SDL_FillRect(g_pSurfScreen, 0, g_Black);
    		DrawBackground(scrollx, scrolly);
    		SDL_UpdateRect(g_pSurfScreen, 0, 0, 0, 0);
    	}
    	SDL_FreeSurface(g_pSurfGalaxies);
    	return 0;
    }
    


  • SDL_KEYDOWN kommt beim drücken nur einmal an. Entweder SDL_EnableKeyRepeat aufrufen, oder die GetKeyState()-Abfrage innerhalb der Hauptschleife plazieren und nicht nur da wo das KEYDOWN-Event auftritt.



  • Wenn du Pollevent nutzt, mußt du den aktiven State auch irgendwo speichern, und dann wenn die Taste losgelassen wird, den State löschen.

    Dann über die States updaten.

    Pseudocode Beispiel:

    Events events;
    
    main_loop{
      wenn update even {
        löschen:
          events[state] = false;
        setzen:
          events[state] = true;
      }
    
      wenn events[rechts] {
        move_rechts;
      }
    }
    


  • Hi,
    marcust schrieb:
    ich mit meinem wissen ein code geschrieben

    Das Tutorial ist nicht so ganz unbekannt 😃

    cu max


Log in to reply