Partage
  • Partager sur Facebook
  • Partager sur Twitter

Space invader (like) SDL2

Problème déplacement image

Sujet résolu
    6 décembre 2019 à 11:28:32

     Bonjour, j'essaye de créer un genre de space invaders avec SDL2, j'arrive à afficher le fond et le vaisseau, mais quand je déplace le vaisseau, il reste l'image du vaisseau à sa position précédente ( voir image), le code se situe en dessous. Si il y a d'autres problèmes aussi n'hésitez à me le dire, merci d'avance

    Edit: Problème résolu, il faller rajouter un SDL_RenderClear(renderer); avant 

    SDL_RenderCopy(Renderer, BackTx, NULL, NULL); //ligne ajouté après pour garder le fond
    SDL_RenderCopy(Renderer, SpaceShipTx, NULL, &ShipRect);
    			SDL_RenderPresent(Renderer);


    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    
    #define LONGUEURFENETRE 360
    #define LARGEURFENETRE 640
    
    
    void pause();
    int InitJeu();
    
    int main (int argc, char *argv[])
    {
    	int game = 1;
    	SDL_Window *Window = NULL; // Pointeur fenêtre
    	SDL_Renderer *Renderer = NULL; // Pointeur renderer
    	SDL_Texture *BackTx = NULL; // Pointeur Texture fond
    	SDL_Texture *SpaceShipTx = NULL; // Pointeur texture vaisseau
    	SDL_Surface *SurfaceLoad = NULL; // Pointeur chargement image
    	SDL_Surface *SurfaceScreen= NULL;
    	SDL_Init(SDL_INIT_VIDEO); //Initialisation de la SDL
    	
    	SDL_Rect WindowRect;
    	SDL_Rect ShipRect;
    	SDL_Event event;
    
    
    	Window = SDL_CreateWindow("Shoot em up", SDL_WINDOWPOS_UNDEFINED,	SDL_WINDOWPOS_UNDEFINED, LARGEURFENETRE, LONGUEURFENETRE, SDL_WINDOW_OPENGL); // création d'une fenêtre nommé shoot emp up, de taille 640*360,
    	if (Window == NULL) 
    	{
    		printf("Echec création fenêtre: %s \n",SDL_GetError());
    		return 1;
    	}
    	SurfaceScreen = SDL_GetWindowSurface(Window);
    	Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
    	
    	SurfaceLoad = IMG_Load("background.bmp"); // chargement fond 
    	if(!SurfaceLoad)
    	{
    		printf("Erreur de chargement de l'image : %s \n", SDL_GetError());
    	return -1;
    	}
    	BackTx = SDL_CreateTextureFromSurface(Renderer, SurfaceLoad); 
    	SDL_FreeSurface(SurfaceLoad); // libérer le chargement
    	
    	SurfaceLoad = IMG_Load("SpaceShip.bmp"); // chargement vaisseau
    	if(!SurfaceLoad)
    	{
    		printf("Erreur de chargement de l'image : %s \n", SDL_GetError());
    	return -1;
    	}
    	SpaceShipTx = SDL_CreateTextureFromSurface(Renderer, SurfaceLoad);
    		
    	//SDL_SetColorKey(SpaceShipTx, SDL_SRCCOLORKEY, SDL_MapRGB(SpaceShipTx -> format, 0, 255, 255));
    	
    	WindowRect.x = 0; // The x location of the rectangle's upper left corner
    	WindowRect.y = 0; // The y location of the rectangle's upper left corner
    	WindowRect.w = 640; // The width of the rectangle
    	WindowRect.h = 360; // The height of the rectangle
    	ShipRect.x = (WindowRect.w / 2) - (ShipRect.w / 2); 
    	ShipRect.y = (LONGUEURFENETRE / 2) + 120; 
    	ShipRect.w = 40;
    	ShipRect.h = 64;
    		
    	
    
    	SDL_RenderCopy(Renderer, BackTx, NULL, NULL);
    	SDL_RenderCopy(Renderer, SpaceShipTx, NULL, &ShipRect);
    	SDL_RenderPresent(Renderer);
    	
    	
    	while (game) // gestion des événements
    	{
    		SDL_WaitEvent(&event);
    		switch(event.type)
    		{
    			case SDL_QUIT: // Croix fermeture fenêtre
    			game = 0;
    			break;
    			case SDL_KEYDOWN:
    			switch(event.key.keysym.sym)
    			{
    				case SDLK_RIGHT: // Fléche droite déplacement
    				ShipRect.x = ShipRect.x + 20;
    				break;
    				case SDLK_LEFT: // Fléche gauche
    				ShipRect.x = ShipRect.x - 20;
    				break;
    				case SDLK_ESCAPE: // echap = arret
    				game = 0;
    				break;
    			}
    			break;
    		}			
    				
    			SDL_RenderCopy(Renderer, SpaceShipTx, NULL, &ShipRect);
    			SDL_RenderPresent(Renderer);
    	}
    	SDL_FreeSurface(SurfaceLoad); // libérer le chargement	
    	SDL_DestroyTexture(BackTx);
    	SDL_DestroyTexture(SpaceShipTx);
    	SDL_DestroyRenderer(Renderer);
    	SDL_DestroyWindow(Window);
    	
    
    	SDL_Quit(); // Arrêt de la SDL	
    	
    	return 0;	
    }
    

    -
    Edité par PierreBeaujean2 6 décembre 2019 à 13:18:42

    • Partager sur Facebook
    • Partager sur Twitter
    C'est au pied du mur que l'on voit le mieux le mur.
      6 décembre 2019 à 12:19:48

      Salut !

      J'ai pas eu l'occasion de toucher à la lib SDL mais je dirais que c'est parceque tu ne refresh pas la window ?

      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2019 à 13:09:19

        Salut

        Normalement si avec la fonction SDL_RenderPresent(Renderer);

        (doc. de la fonction) SDL_RenderPresent: Use this function to update the screen with any rendering performed since the previous call.

        void SDL_RenderPresent(SDL_Renderer* renderer)
        • Partager sur Facebook
        • Partager sur Twitter
        C'est au pied du mur que l'on voit le mieux le mur.
          7 décembre 2019 à 18:45:37

          Salut,

          Le fait que tu vois ainsi ton vaisseau plusieurs fois, c'est que tu ne reblit pas ton fond dans ta boucle !

          Ligne 94, tu mets la même chose que ta ligne 66.

          D'ailleurs, tu n'as pas besoin des tes lignes 66,67,68.

          Garde bien en tête que SDL est un jeu de gomettes : ça COLLE. On n'enlève pas et on ne déplace pas une gomette, donc si ton vaisseau est déjà placé, la seule manière de l'effacer ou de le déplacer est de coller un bout de fond par dessous. Ou tout le fond. 

          Et comme en général on affiche plein de choses, colle tout ton fond. C'est plus simple, et ça marche bien.

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          Space invader (like) SDL2

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown