supprimer des sprite sdl

Le tutoriel en ligne vous pose quelques problèmes ? C'est ici pour en parler !

supprimer des sprite sdl

Messagede fab101 le 21 Avr 2006 13:58

bonjour a tous

voila j'ai repris le code du site pour le deplacement des sprite


je voudrai aussi lors de la gestion d'evenement lorsque j'appuie sur la touche espace supprimer un sprite de l'ecran et en faire apparaitre un nouveau


voici le code

Code: Tout sélectionner



#include <SDL.h>
#include<stdio.h>
#include<stdlib.h>
#include<SDL_audio.h>
#include<SDL_mixer.h>
#include<SDL_TTF.h>
#include<SDL_image.h>
#include <string>
#include "test.h"


#define HAUT   0
#define DROITE   1
#define BAS   2
#define GAUCHE   3

#define AUCUNE_DIRECTION   0
#define DIRECTION_HAUT      1
#define DIRECTION_DROITE   2
#define DIRECTION_BAS      4
#define DIRECTION_GAUCHE   8



// declaration
SDL_Event Event_jeu2;

SDL_Rect rect2, dst2,dstblue2;
Uint8 *keys2;

SDL_Surface  *image2,*terrain2 = NULL, *panier2=NULL, *screen_jeu2 =NULL, *sprite2= NULL, *sponsor2, *ballon=NULL;
   



void jeu1()
{

   
   
   int bFin = 0;
   Uint32 temps_courant, prochain_rendu = 0;
   
   /*declaration des sprites*/
   Sprite spjoueur3, spjoueur4,spjoueur5;

   
   
   
   /* initialisation de SDL_Video */
   if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
   {
      fprintf(stderr, "Echec d'initialisation de SDL.\n");
      
   }
   printf("Bonjour le monde, SDL est initialisé avec succès.\n");
   
   
   /* On fixe le mode d'affichage à 640*480*16 plein ecran.*/
   screen_jeu2 = SDL_SetVideoMode(1024, 655, 16, SDL_HWSURFACE |SDL_DOUBLEBUF);
   if ( screen_jeu2 == NULL )
   {
      fprintf(stderr, "Echec de changement du mode video : %s.\n", SDL_GetError());
   
   }
   
   
   /* On charge le sprite controlable avec l'image pecheur.bmp */
   if ( !chargerSprite( &spjoueur3, "./image/sprite/joueur2.bmp" ) )
   {
      SDL_Quit();
   
   }
    if(!chargerSprite(&spjoueur4, "./image/sprite/joueur1.bmp"))
   
       {
            SDL_Quit();
       }
          if ( !chargerSprite( &spjoueur5, "./image/sprite/test1.bmp" ) )
   {
      SDL_Quit();
   
   }
       
           

            /*chargement des images*/
   
      terrain2 = SDL_LoadBMP("./image/terrain2.bmp");
      panier2 = SDL_LoadBMP("./image/panier2.bmp");
      sponsor2=SDL_LoadBMP("./image/sponsor.bmp");


   
   // on place le sprite que l'on controle au milieu
   spjoueur3.dest.x = 246;
   spjoueur3.dest.y = 500;
   spjoueur4.dest.x=100;
   spjoueur4.dest.y=500;
   fixerDirectionSprite( &spjoueur3, DIRECTION_BAS );
   fixerDirectionSprite( &spjoueur3, AUCUNE_DIRECTION );
   fixerDirectionSprite( &spjoueur4, DIRECTION_BAS );
   fixerDirectionSprite( &spjoueur4, AUCUNE_DIRECTION );
      spjoueur5.dest.x=100;
   spjoueur5.dest.y=100;
   fixerDirectionSprite( &spjoueur5, DIRECTION_BAS );
   fixerDirectionSprite( &spjoueur5, AUCUNE_DIRECTION );
   while (!bFin)
   {
      while (SDL_PollEvent(&Event_jeu2))
      {
         switch (Event_jeu2.type)
         {
         case SDL_KEYDOWN:
            switch (Event_jeu2.key.keysym.sym)
            {
            case SDLK_ESCAPE:
               bFin = 1;
               
                     sortie();
                   
             break;
               
            // on deplace le sprite au clavier
         
            case SDLK_RIGHT:
               fixerDirectionSprite( &spjoueur3, DIRECTION_DROITE );
               
               break;
               
            case SDLK_d:
                     fixerDirectionSprite (&spjoueur4,DIRECTION_DROITE);
                break;
         
            
            
            
            
            case SDLK_LEFT:
               fixerDirectionSprite( &spjoueur3, DIRECTION_GAUCHE );
               break;
               
            case SDLK_q:
                     fixerDirectionSprite (&spjoueur4,DIRECTION_GAUCHE);
         
               break;
            
                       case SDLK_SPACE:
                          /*ici je voudrai  supprimer un sprite et en rechargerun */
                            supprimerSprite(&spjoueur3);
                               miseAJourSprite( &spjoueur5);
                                  dessinerSprite (&spjoueur4, screen_jeu2);
                                     SDL_UpdateRect(screen_jeu2, 0, 0, 0, 0);
                                     break;
                           
                              
                       
                                                break;
                         
            
            default:
            printf("Une touche à été pressée.\n");
            }
            break;
         
          case SDL_KEYUP:
            switch (Event_jeu2.key.keysym.sym)
            {
            // on deplace le sprite au clavier
            
         
            
            case SDLK_RIGHT:
               if (spjoueur3.direction == DIRECTION_DROITE)
                  fixerDirectionSprite( &spjoueur3, AUCUNE_DIRECTION );
                     
               break;
               
               case SDLK_d:
                         if (spjoueur4.direction == DIRECTION_DROITE)
                  fixerDirectionSprite( &spjoueur4, AUCUNE_DIRECTION ); 
                        break;
            
         
            
            case SDLK_LEFT:
               if (spjoueur3.direction == DIRECTION_GAUCHE)
                  fixerDirectionSprite( &spjoueur3, AUCUNE_DIRECTION );
               
               break;
                case SDLK_q:
                        if (spjoueur4.direction == DIRECTION_GAUCHE)
                  fixerDirectionSprite( &spjoueur4, AUCUNE_DIRECTION );
                  break;
                   
                                    
            default:
               ;
            }
            break;

         case SDL_QUIT:
            bFin = 1;
            break;
         
         default:
            ;
         }
      }
      
      /* On recupère le temps écoulé en mili-secondes */
      temps_courant = SDL_GetTicks();
   
         
         // puis les positions des sprites
         miseAJourSprite( &spjoueur3 );
         miseAJourSprite (&spjoueur4);
            
   
         
      
         /* On dessine la scene */
         
         /* On efface l'écran */
         SDL_FillRect(screen_jeu2, NULL, 0);
         apply_surface (0,0,terrain2,screen_jeu2);
           apply_surface (190,200,panier2,screen_jeu2);
           apply_surface(10,500,sponsor2,screen_jeu2);
                   
         /* On dessine les sprites à l'écran */
         dessinerSprite( &spjoueur3, screen_jeu2 );
         dessinerSprite (&spjoueur4, screen_jeu2);
      
      
      
                  
         /* On met à jour de la zone d'affichage de la fenetre */
         SDL_UpdateRect(screen_jeu2, 0, 0, 0, 0);
      
      
   
   
    }

   supprimerSprite( &spjoueur3);
   supprimerSprite (&spjoueur4);
   SDL_FreeSurface(terrain2);
   SDL_FreeSurface(panier2);
   
   SDL_Quit();
   
}



lorsque j'execute ce code en supprimant avec la touche espace

il me met l'erreur suivant

Fatal signal: Segmentation Fault (SDL Parachute Deployed)
je ne sais pas du tout ce que c'est cette erreur

merci pour vos reponses[/code]
fab101
 

Messagede fab101 le 22 Avr 2006 19:16

bonjour cayes j'ai resolu mon probleme

par contre ce que je voulais savoir c'est lorsque je bouge mon sprite il change de coordonne et je voudrai savoir si il est possible de recuperer ces coordonée.

Admettons que je bouge un sprite a je voudrai pouvoir afficher un sprite b a la meme place du sprite a

si vous savez comment faire

merci de vos reponses
fab101
 

Messagede moi1392 le 24 Avr 2006 08:50

Désolé de répondre aussi tard, j'avais pas vu ton post...


Pour la position des sprites, tu peux la récuperer facilement grace aux membres x et y de la structure de sprite :

Code: Tout sélectionner
spjoueurXXX.dest.x
spjoueurXXX.dest.y


Si tu veux afficher un sprite b à la même place qu'un sprite a, la solution est alors simple :

Code: Tout sélectionner
b.dest.x = a.dest.x
b.dest.y = a.dest.y


après cela, tes deux sprites (a et b) se retrouverons à la même position (celle de a)

tu peux me montrer le code que tu as mis pour l'appius sur la barre espace si tu veux que je le commente ;)
dans le code que tu as déjà posté, il manquait le chargement du spite après l'avoir detruit, mais comme tu as dit que c'était résolu, je pense que tu as corrigé cela tout seul.
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam


Retourner vers Besoin d'aide en SDL ?

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron