SDL2 : Rectangles not moving

Hi everyone,

I’m trying to make a pong game with SDL2 in C.

I’m actually having an issue while trying to move rectangles during the game loop :

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL2/SDL.h>

    #define DEBUG 1

    int main(int argc, char **argv)
    {
    	// Starting game
    	if(SDL_Init(SDL_INIT_VIDEO) != 0)
    	{
    		fprintf(stderr,"ERROR : Failed to initialize SDL2\n");
    		exit(EXIT_FAILURE);
    	}

    	SDL_Window *game_window = NULL;
    	SDL_Renderer *game_renderer = NULL;

    	game_window = SDL_CreateWindow("Pong",
    					SDL_WINDOWPOS_CENTERED,
    					SDL_WINDOWPOS_CENTERED,
    					800,
    					600,
    					SDL_WINDOW_SHOWN);
    	
    	if(game_window == NULL)
    	{
    		fprintf(stderr,"ERROR : Failed to create game window \n");
    		exit(EXIT_FAILURE);
    	}

    	game_renderer = SDL_CreateRenderer(game_window,-1,SDL_RENDERER_ACCELERATED);
    	if(game_renderer == NULL)
    	{
    		fprintf(stderr,"ERROR : Failed to create game renderer\n");
    		exit(EXIT_FAILURE);
    	}

    	#if DEBUG
    	printf("============\n");
    	printf("GAME STARTED\n");
    	printf("============\n");
    	#endif

    	// Creating entities
    	SDL_Rect player = {x:0,y:0,h:200,w:50};
    	SDL_Rect computer = {x:750,y:0,h:200,w:50};

    	SDL_Rect players[] = {player, computer};

    	//Game loop
    	int isRunning = 1;

    	while(isRunning == 1)
    	{

    		// Event handling
    		SDL_Event event;

    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    				case SDL_QUIT:
    					isRunning = 0;
    					break;

    				case SDL_KEYDOWN:
    					switch(event.key.keysym.sym)
    					{
    						case SDLK_ESCAPE:
    							isRunning = 0;
    							break;

    						case SDLK_UP:
    							player.y -= 50;
    							#if DEBUG
    							printf("PLAYER Y = %d\n", player.y);
    							#endif						
    							break;

    						case SDLK_DOWN:
    							player.y += 50;
    							#if DEBUG
    							printf("PLAYER Y = %d\n", player.y);
    							#endif
    							break;
    						default:
    							break;
    					}
    					break;
    				
    				default:
    					break;
    			}
    		}
    			

    		SDL_Delay(500);

    		#if DEBUG
    		printf("UPDATING...\n");
    		#endif

    		SDL_SetRenderDrawColor(game_renderer,0,0,0,1);
    		SDL_RenderClear(game_renderer);

    		SDL_SetRenderDrawColor(game_renderer,255,255,255,1);
    		SDL_RenderFillRects(game_renderer,players,2);
    			
    		SDL_RenderPresent(game_renderer);
    	}

    	#if DEBUG
    	printf("==========\n");
    	printf("GAME ENDED\n");
    	printf("==========\n");
    	#endif

    	// End
    	SDL_DestroyWindow(game_window);
    	SDL_DestroyRenderer(game_renderer);
    	SDL_Quit();

    	return EXIT_SUCCESS;
    }

I do get the “UPDATING…” text but the screen stays the same.

Does someone have an idea ?

Thanks in advance for your help

In your event loop, whenever a key down/up event is occuring, you’re changing the SDL_Rect player's y-position by calling player.y += 50 / -=50.
Later on, when it’s time to render the player(s), you’re instead rendering the SDL_Rect array players.

So in the event loop, where you’re checking for key presses, change player.y into players[0].y.

1 Like

Thanks a lot @Daniel1985 !

Indeed I thought that my “players” array would work through adresses but it did a copy of the two SDL_Rect instead. Which is why it wasn’t moving.