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
C'est au pied du mur que l'on voit le mieux le mur.
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.
× 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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html