Como retirar rastro da imagem do tiro SDL/C?

Pessoal, como faço para apagar os rastros dos tiros? No código abaixo toda vez que o usuário aperta a tecla “space” um tiro é acionado. Coloquei a imagem de fundo p/ ser blitada antes do tiro para tentar apagar os rastros dos blitis da imagem do tiro mas não esta funcionando. Usando sem imagem de fundo e com a função fill rect pra pintar a tela preto, o código abaixo funciona sem rastro. Gostaria de uma ideia pra resolver o problema. Desde de já agradeço a atenção!

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
#include <time.h>
#include <math.h>
#define MAX 100

// para compilar: gcc rot.c -o rot `sdl-config --cflags --libs` -lSDL_gfx -lSDL_image -lm
// ou gcc rot.c -o rot -lSDL -lSDL_image -lSDL_gfx -lm
SDL_Surface* window;
SDL_Surface* torre;
SDL_Surface* fundo;
SDL_Surface* tiro;
SDL_Rect rectTorre;  // faz a figura nascer no meio da tela
SDL_Rect rectTiro;

int loop = 1, tiroAtivo = 0;
float angulo = 0;


int main(void)
{
	SDL_Init(SDL_INIT_VIDEO);
	window = SDL_SetVideoMode(760, 600, 0, 0);
	torre = IMG_Load("soldado.png");
	fundo = IMG_Load("fundo.png");
	tiro = IMG_Load("tiro.png");
	//rectTorre = {window->w/2, window->h/2};  // faz a figura nascer no meio da tela
	rectTorre.x = window->w/2;
	rectTorre.y = window->h/2;

	SDL_Event event;
	
	while(loop)
	{
		if(SDL_PollEvent(&event))
		{
			if(event.type == SDL_QUIT)
				loop = 0;

			if(event.type == SDL_KEYDOWN)
			{
				switch(event.key.keysym.sym)
				{
					case SDLK_UP:    rectTorre.y -= 10; break;
					case SDLK_DOWN:  rectTorre.y += 10; break;
					case SDLK_LEFT:  rectTorre.x -= 10; break;
					case SDLK_RIGHT: rectTorre.x += 10; break;

					case SDLK_SPACE: 

						rectTiro.x = rectTorre.x;
	 					rectTiro.y = rectTorre.y;
						tiroAtivo = 1;
					break;
					case SDLK_r: angulo += 5; break;
					case SDLK_t: angulo -= 5; break;

					default: break;
				}
			}
		}

		SDL_Surface* transformedSurface = rotozoomSurface(torre,angulo,1.0,SMOOTHING_ON);

		if(rectTiro.y > 0 && tiroAtivo)
		{
        	rectTiro.y -= 10;

        	SDL_BlitSurface(fundo, NULL, window, NULL);
        	SDL_BlitSurface(tiro, NULL, fundo, &rectTiro);
        	

    	}else
    	{
        	tiroAtivo = 0;
        	//SDL_BlitSurface(fundo, NULL, window, NULL);
    	}

    	SDL_BlitSurface(fundo, NULL, window, NULL);
		SDL_BlitSurface(transformedSurface, NULL, window, &rectTorre);
		//SDL_UpdateRect(window,0,0,0,0); // Atualiza todo o screen
		//SDL_FillRect(window, NULL, 0);
		
		SDL_FreeSurface(transformedSurface);
		SDL_Flip(window);
		
	}

	IMG_Quit();
	SDL_Quit(); // Fecha o SDL
  	return 0;
  
}

Não sei que tutoriais você está seguindo, mas tente usar SDL_RenderClear() no seu loop, antes de desenhar os elementos na tela.

Abraço.

1 curtida

Pessoal, consegui resolver eu estava blitando a imagem da torre no fundo em vez de blitar a imagem na tela somente! Outra mudança que fiz é blitar o fundo antes de todas as outra imagens.

Sendo assim estou postando o código correto para que possa ajudar outras pessoas que passarem pelo mesmo problema.

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
#include <time.h>
#include <math.h>
#define MAX 100

// para compilar: gcc rot.c -o rot sdl-config --cflags --libs -lSDL_gfx -lSDL_image -lm
// ou gcc rot.c -o rot -lSDL -lSDL_image -lSDL_gfx -lm
SDL_Surface* window;
SDL_Surface* torre;
SDL_Surface* fundo;
//SDL_Surface* tiro;
SDL_Rect rectTorre; // faz a figura nascer no meio da tela
SDL_Rect rectTiro;

int loop = 1, tiroAtivo = 0;
float angulo = 0;

int main(void)
{
SDL_Init(SDL_INIT_VIDEO);
window = SDL_SetVideoMode(760, 600, 0, 0);
torre = IMG_Load(“soldado.png”);
fundo = IMG_Load(“fundo.png”);
SDL_Surface* tiro = IMG_Load(“tiro.png”);

//rectTorre = {window->w/2, window->h/2};  // faz a figura nascer no meio da tela
rectTorre.x = window->w/2;
rectTorre.y = window->h/2;

SDL_Event event;

while(loop)
{
	if(SDL_PollEvent(&event))
	{
		if(event.type == SDL_QUIT)
			loop = 0;

		if(event.type == SDL_KEYDOWN)
		{
			switch(event.key.keysym.sym)
			{
				case SDLK_UP:    rectTorre.y -= 10; break;
				case SDLK_DOWN:  rectTorre.y += 10; break;
				case SDLK_LEFT:  rectTorre.x -= 10; break;
				case SDLK_RIGHT: rectTorre.x += 10; break;

				case SDLK_SPACE: 

					rectTiro.x = rectTorre.x;
 					rectTiro.y = rectTorre.y;
					tiroAtivo = 1;
				break;
				case SDLK_r: angulo += 5; break;
				case SDLK_t: angulo -= 5; break;

				default: break;
			}
		}
	}

	SDL_BlitSurface(fundo, NULL, window, NULL);

	SDL_Surface* transformedSurface = rotozoomSurface(torre,angulo,1.0,SMOOTHING_ON);
	
	
	if(rectTiro.y > 0 && tiroAtivo)
	{
    	rectTiro.y -= 5;

    	//SDL_BlitSurface(fundo, NULL, window, NULL); // esse blit agora fica antes desse if 
    	SDL_BlitSurface(tiro, NULL, window, &rectTiro);
    	

	}else
	{
    	tiroAtivo = 0;
    	
	}

	
	SDL_BlitSurface(transformedSurface, NULL, window, &rectTorre);
	//SDL_UpdateRect(window,0,0,0,0); // Atualiza todo o screen
	//SDL_FillRect(window, NULL, 0);
	
	SDL_FreeSurface(transformedSurface);
	SDL_Flip(window);
	
}

IMG_Quit();
SDL_Quit(); // Fecha o SDL
return 0;

}