IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Comment envoyer un missile


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut Comment envoyer un missile
    Bonjour

    je me heurte à un probleme depuis un bon moment,
    en gros je cherche une methode pour faire tirer plusieurs missiles d'affilée à mon petit avion
    le missile est une simple image qui doit aller droit devant ...

    lol ca a l'air tt bete, mais je bug complet, mon missile soit il s'efface quand je lache le clic de la souris, soit il s'efface jamais et se coinse en haut de mon ecran ...soit quand je reclic il efface le premier et en lance un autre ...


    please help me ! );

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans un code concis et bien commenté qui montre où se trouve le problème, on ne va pas pouvoir dire grand chose sauf :

    Utilise un debugger
    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    en gros je cherche juste une methode,

    ou placer quoi ...

    j'ai une fonction qui affiche une image,
    comment faire pour que cette fonction soit affichée à l'ecran pendant un temps donné au moment de mon clic sur la souris

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Funraill.net
    soit quand je reclic il efface le premier et en lance un autre ...
    Ca, ca doit surement être du fait que tu créé le nouveau missile à partir du même pointeur de surface (faudrais voir pour utiliser une liste ou un tableau dynamique et créer un lecteur spécial qui se charge de l'affichage et des coordonnées des missiles) et pour le reste il faudra ton code qui se charge de lancer le missile, l'affichage et les évennements !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Bonjour !

    merci de ton aide, jsuis encor plutot novice en prog, et les maloc et tt sont assez abtrait pour moi

    je me premet de mettre mon code afin d'avoir un tit support pour t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
     
    #include <SDL.h>
    #include <SDL_image.h>
    #include <stdio.h>
     
    #include "defines.h"
     
     
     
    /********
     * Variables Globales
     ****/
    char windowName[128] = "sdlShoot Beta 0.1 | SDL";
    //----Evenement----
    SDL_Event e;
    //----Surfaces----
    SDL_Surface		*screen;												// represente l'ecran entier
    SDL_Surface		*player;												// represente le perso de la scene
    SDL_Surface		*etoile;
    SDL_Surface		*fondScene[_NB_BLOCK_WIDTH][_NB_BLOCK_HEIGHT] = {0};	// cree un fond pour la scene
    SDL_Surface		*armePlayer[5];
    //----Position----
    SDL_Rect 	positionEtoile;
    SDL_Rect		pPlayer;
    SDL_Rect		pArmePlayer;
    SDL_Rect		pArmePlayerSrc;
    SDL_Rect		armeSprite;
    //-----Timer----
    SDL_TimerID		timerArme;
     
    //----Utils----
    int tmpA, tmpB = 0;
     
    /********
     * Déclaration des Fonctions
     ****/
    bool initDisplayRender();
    bool freeMemRessources();
    void initEtoiles();
    void initPlayer();
    void initArmes(int arme);
     
    /********
     * int main() - Fonction Principale
     ****/
    int main(int argc, char **argv){
    	/*
    	** Variables Locales
    	*/
    	bool msg = false;
    	bool play = false;
     
    	/*
    	** Initialisation de SDL
    	*/
    	if(SDL_Init(SDL_INIT_VIDEO) == -1){
    		printf("Erreur: Impossible d'initialiser SDL, SDL_INIT_VIDEO %c", SDL_GetError());
    		//exit(0);
    	}
    	SDL_WM_SetCaption(windowName, NULL);
    	SDL_WM_SetIcon(SDL_LoadBMP("images/icone.bmp"), NULL);
     
    	screen = SDL_SetVideoMode(_WIDTH, _HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_INIT_TIMER);
    	if(screen == NULL){
    		msg = true;
    	}
     
    	/*
    	** Boucle d'attente des messages
    	*/
    	while(!msg){
    		while(SDL_PollEvent(&e)){
    			switch(e.type){
    				case SDL_QUIT: // si on cherche a quitter le pgm
    					msg = true;
    				break;
    				case SDL_KEYUP: // si on pousse une touche
    					switch(e.key.keysym.sym){
    						case SDLK_ESCAPE:
    							msg = true;
    						break;
    						case SDLK_F2:
    							play = true;
    							SDL_ShowCursor(SDL_DISABLE);
    					}
    				case SDL_MOUSEMOTION:
    					if(play){
    						pPlayer.x = e.button.x - 20;
                		pPlayer.y = e.button.y;
    					}					
    				break;
    				case SDL_MOUSEBUTTONDOWN:
    					if(play){
    						pArmePlayerSrc.y = pPlayer.y;
    					}
    				break;
    				case SDL_MOUSEBUTTONUP:
    					if(play){		
    						switch(e.button.button){
    							case SDL_BUTTON_LEFT:
    								tmpA = SDL_GetTicks();
    							break;						
    						}
    					}
    				break;
    			}
    		}
     
    		/*
    		** Fonctions applicatives
    		*/
    		if(!initDisplayRender()){
    			printf("Erreur: Impossible d'initialiser la fonction d'affichage', initDisplayMode() %c", SDL_GetError());
    			//exit(0);
    		}
    		SDL_Flip(screen);
    	}
    	/*
    	** On libere les ressources avant de quitter le pgm
    	*/
    	freeMemRessources();
     
    	SDL_Quit();
    	return 0;
    }
     
    /********
     * bool initDisplayRender() - Fonction Principale d'affichage
     ****/
    bool initDisplayRender(){
    	//----------------
    	initEtoiles();
    	//-----------------
    	initPlayer();
    	//-----------------
    	initArme();
     
    	return true;
    }
     
    /********
     * bool freeMemRessources() - Fonction pour liberer les ressource avec de quitter
     ****/
    bool freeMemRessources(){
     
    	SDL_FreeSurface(screen);
     
    	return true;
    }
     
    /********
     *  void initEtoile() - Creation d'un fond d'etoile a partir d'une image 64*64
     ****/
    void initEtoiles(){
    	SDL_Rect pEtoile;
    	SDL_Rect pFondScene;
     
    	etoile = SDL_LoadBMP("images/etoile.bmp");
    	//SDL_SetColorKey(etoile, SDL_SRCCOLORKEY, SDL_MapRGB(etoile->format, 0, 0, 0));
     
    	/*
    	** Remplit le tableau avec la surface etoile
    	*/
    	int i, j; // indices
    	for(i=0; i<=_NB_BLOCK_HEIGHT; i++)
    		for(j=0; j<=_NB_BLOCK_WIDTH; j++){
    			fondScene[i][j] = etoile;
    		}
     
    	/*
    	** Deplacement du fond
    	*/
     
    		/*
    		** Affiche les elements du tableau
    		*/
    		int u, v;
    		for(u=0; u<=_NB_BLOCK_HEIGHT; u++)
    			for(v=0; v<=_NB_BLOCK_WIDTH; v++){
    				pEtoile.x = v * _BLOCK;
    				pEtoile.y = u * _BLOCK;				
     
    			SDL_BlitSurface(fondScene[u][v], NULL, screen, &pEtoile);
    			}	
    }
     
    /********
     *
     ****/
    void initPlayer(){
     
     
    	player = IMG_Load("images/player.png");
    	SDL_BlitSurface(player, NULL, screen, &pPlayer);
     
    	/*
    	armeSprite.w = 32;
    	armeSprite.h = 32;
    	armeSprite.y = 0;
     
    	armePlayer[0] = IMG_Load("images/missile_1.png");
    	armePlayer[1] = IMG_Load("images/icone.bmp");
    	armePlayer[2] = IMG_Load("images/img.png");
     
    	if(e.type){
    		armeSprite.x = armeSpriteIndex * 32;
    		pArmePlayer.x = e.button.x - 16;
    		pArmePlayer.y = e.button.y;
    		SDL_BlitSurface(armePlayer[arme], &armeSprite, screen, &pArmePlayer);	
    		tmpA = SDL_GetTicks();
    		if(tmpA > tmpB ) {
    			armeSpriteIndex = armeSpriteIndex + 1;
    			if(armeSpriteIndex > 9){
    				armeSpriteIndex = 0;
    			}
    			tmpB = tmpA + 500;
    		}
    	}
    	*/	
    }
     
    /********
     *
     ****/
    void initArmes(int arme){
    		int tmpA, tmpB = 0;
     
    			armePlayer[0] = IMG_Load("images/sapin.png");
    			pArmePlayer.y = pArmePlayerSrc.y + 5;
    			SDL_BlitSurface(armePlayer[arme], NULL, screen, &pArmePlayer);
    			//SDL_UpdateRect(pFond,0,0,0,0);
     
    }
    ca serait la fonction initArmes qui me pose probleme
    dison qu'elle charge une image, et je vois pas comment fair pour que au moment ou je clic, la fonction s'initialise pedant un temps T (la duree de vie du missile), ensuite ya le deplacement de celui ci

  6. #6
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    j'ai pas tout regardé ton code ( ), mais y'a pas mal de trucs qui me paraissent bizarre.


    Dans un algo simplifié, moi j'aurai fait quelques chose du style

    tu déclare un tableau, un vecteur, une liste chainée (tu va voir dans les faqs, tu trouvera surement comment les implémenter / utiliser) qui contiendra tes missiles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vecteur tabMissiles;
    dans ta boucle principale, à chaque fois que l'utilisateur fait l'action qui déclenche un lancement de missile, tu fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabMissiles.ajouter(mon nouveau missiles);
    "mon nouveau missiles" peut représenter ce que tu veux, un couple de coordonnée, une instance d'objet si tu fait la programmation objet, ...

    Ensuite, toujours dans la boucle principale, tu parcours ton objet qui contient les missiles, et tu les fait avancer (donc tu change les coordonnées)

    Et enfin, toujours la la boucle principale, tu fait appelle , directement ou indirectement, une fonction qui dessine les missiles contenus dans ton tableau (ou vecteur, ou liste, ou..)

    il te restera juste à gérer quand est ce qu'un missile ne doit plus être dessiné (et donc enlever de la liste), c'est à dire surement quand il sort de l'écran ou qu'il touche quelques choses.

    Enfin voila l'idée de base, après pour la programmation je pense que tu trouvera tout ce qu'il te faut sur les différents forums / faq associés à ton langage.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Funraill.net
    jsuis encor plutot novice en prog, et les maloc et tt sont assez abtrait pour moi
    J'estime que c'est un minimum de maîtriser les concepts d'allocation (toute les gestion mémoire nécessaire quoi), les liste, tableau dynamique (pas obligé ca), enfin tout ce qui touche de près ou de loin aux vecteurs etc... surtout pour créer un jeu ... quelqu'il soit, tu sera à un moment donné obligé de passer par là donc autant s'y mettre tout de suite !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    je vous remerci pour c reponses !


    Franck.H: oki j'vais voir comment tout cela fonctionne, merci

    MrDuChnok: lol, deja que tu est lu une petite partie c sympa !, sinon merci pour ce mini tuto, j'vais men servire !

    edit A:
    j'ai un probleme avec "exit();", ca me retourne tjrs une erreur, je suis sous linux suse 10.1, j'ai une bibliotheque à ajouter ???

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Tiens tiens ça tombe bien c'est justement la partie sur laquelle je bosse actuellement

    Citation Envoyé par MrDuChnok
    Ensuite, toujours dans la boucle principale, tu parcours ton objet qui contient les missiles, et tu les fait avancer (donc tu change les coordonnées)

    Et enfin, toujours la la boucle principale, tu fait appelle , directement ou indirectement, une fonction qui dessine les missiles contenus dans ton tableau (ou vecteur, ou liste, ou..)
    Très bien vu mr Duschnok mais il faut préciser que les missiles doivent progresser selon un laps de temps défini

    Si le missile rencontre une entité ( véhicule etc...) alors enlever les points de vie de l'entité , dessiner une explosion et retirer le missile du vecteur ( std::vector)

  10. #10
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Citation Envoyé par mat.M
    Très bien vu mr Duschnok mais il faut préciser que les missiles doivent progresser selon un laps de temps défini

    Si le missile rencontre une entité ( véhicule etc...) alors enlever les points de vie de l'entité , dessiner une explosion et retirer le missile du vecteur ( std::vector)

    Citation Envoyé par MrDuChnok
    il te restera juste à gérer quand est ce qu'un missile ne doit plus être dessiné (et donc enlever de la liste), c'est à dire surement quand il sort de l'écran ou qu'il touche quelques choses.
    C'est vrai que j'ai pas précisé qu'il fallait enlever des points de vie, faire l'explosion et tout, mais pour l'instant Funraill.net ne voyait pas le système en global... alors ces cas là, ils sont déjà plus particulier et peuvent être plusse sujet à confusion qu'autre chose dans un algo simpliste ;-)

    enfin c'est mon humble avis ^^
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    bon j'ai essayé de suivre un petit peu vos conseils et tt, mais j'ai quelques complications

    donc, j'ai créé une liste chainée "buffers", elle recoit mes structures "stMissile"
    bon...
    a chaque clic de l'utilisateur, j'enregistre dans la chaine un nouveau missile, ensuite j' affiche grace a une ptite fonction dans ma boucle principale

    le souci c que, quand je clic plusieur fois d'affilé, bah ca s'enregistre dans "buffers" mais a chaque nouveau clic l'ancien est effacé, le nouveau affiché et une fois le nouveau tué, le second est affiché ...( je sais pas si vous avez compris ...) en gros si je fais plein de clic le dernier clic est affiché en entier, et ceux qui suivent sont affichés chacun leur tour

    (le code sera peut etre plus parlant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
     
    #include <SDL.h>
    #include <SDL_image.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "defines.h"
     
     
     
    /********
     * Variables Globales
     ****/
    char windowName[128] = "sdlShoot Beta 0.1 | SDL";
     
    //----Evenement----
    SDL_Event e;
     
    //----Surfaces----
    SDL_Surface		*screen;																// represente l'ecran entier
    SDL_Surface		*etoile;																// represente les etoiles
    SDL_Surface		*fondScene[_NB_BLOCK_WIDTH][_NB_BLOCK_HEIGHT] = {0};	// cree un fond pour la scene
     
     
    //----Rect----
    SDL_Rect 	positionEtoile;														// position des etoiles
     
    //-----Timer----
    int currentTimeRender, nextTimeRender = 0;
    int currentTimeMove, nextTimeMove = 0;
     
    //----Utils----
     
     
    /********
     * Structures
     ****/
    typedef struct sprites {
    	SDL_Surface	*spriteSrc;
    	SDL_Rect		spriteRect;
    	SDL_Rect		spritePos;
    	int			spriteNb;
    	int			spriteIndex;
    	int			spriteSpeed;
    };
     
    typedef struct buffers {
    	sprites			monSprite;
    	struct buffers	*prevBuffers;
    };
     
     
    /********
     * Déclaration des Fonctions
     ****/
    bool freeMemRessources();
    void initEtoiles();
    sprites createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed);
    void renderSprites(sprites *sp);
    bool moveSpritesAxeY(sprites *sp, int speed);
    void pushBuffers(buffers **bp, sprites sp);
    void viewBuffers(buffers *bp);
     
    /********
     * int main() - Fonction Principale
     ****/
    int main(int argc, char **argv){
    	/*
    	** Variables Locales
    	*/
    	bool msg = false;
    	bool play = false;
     
    	/*
    	** Initialisation de SDL
    	*/
    	if(SDL_Init(SDL_INIT_VIDEO) == -1){
    		printf("Erreur: Impossible d'initialiser SDL, SDL_INIT_VIDEO %c", SDL_GetError());
    		//exit(0);
    	}
    	SDL_WM_SetCaption(windowName, NULL);
    	SDL_WM_SetIcon(SDL_LoadBMP("images/icone.bmp"), NULL);
     
    	screen = SDL_SetVideoMode(_WIDTH, _HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
    	if(screen == NULL){
    		msg = true;
    	}
     
    	/*
    	** Déclaration applicatives
    	*/
    	//- vaisseau
    	sprites stVaisseau;
    	stVaisseau = createSprites(IMG_Load("images/player.png"), 300, 300, 40, 64, 0, 0);
    	//- missile
    	sprites stMissile;
    	buffers *bufMissile = NULL;
    	stMissile = createSprites(IMG_Load("images/img.png"), 0, 0, 32, 32, 9, 30);
     
     
    	/*
    	** Boucle d'attenrenderSprites(&stVaisseau);te des messages
    	*/
    	while(!msg){
    		while(SDL_PollEvent(&e)){
    			switch(e.type){
    				case SDL_QUIT: // si on cherche a quitter le pgm
    					msg = true;
    				break;
    				case SDL_KEYUP: // si on pousse une touche
    					switch(e.key.keysym.sym){
    						case SDLK_ESCAPE:
    							msg = true;
    						break;
    						case SDLK_F2:
    							play = true;
    							SDL_ShowCursor(SDL_DISABLE);
    					}
    				case SDL_MOUSEMOTION:
    					if(play){
    						stVaisseau.spritePos.x = e.button.x - 20;
                		stVaisseau.spritePos.y = e.button.y;
    					}					
    				break;
    				case SDL_MOUSEBUTTONDOWN:
    					if(play){
     
    					}
    				break;
    				case SDL_MOUSEBUTTONUP:
    					if(play){		
    						switch(e.button.button){
    							case SDL_BUTTON_LEFT:
    								stMissile.spritePos.x = stVaisseau.spritePos.x;
                				stMissile.spritePos.y = stVaisseau.spritePos.y;
                				pushBuffers(&bufMissile, stMissile); 
                			break;						
    						}
    					}
    				break;
    			}
    		}
     
    		/*
    		** Fonctions applicatives
    		*/
    		initEtoiles();
    		renderSprites(&stVaisseau);
    		viewBuffers(bufMissile);
     
     
    		/*
    		** Echange du buffer;
    		*/
    		SDL_Flip(screen);
    	}
    	/*
    	** On libere les ressources avant de quitter le pgm
    	*/
    	freeMemRessources();
     
    	SDL_Quit();
    	return 0;
    }
     
    /********
     * bool freeMemRessources() - Fonction pour liberer les ressource avec de quitter
     ****/
    bool freeMemRessources(){
     
    	SDL_FreeSurface(screen);
     
    	return true;
    }
     
    /********
     *  void initEtoile() - Creation d'un fond d'etoile a partir d'une image 64*64
     ****/
    void initEtoiles(){
    	SDL_Rect pEtoile;
    	SDL_Rect pFondScene;
     
    	etoile = SDL_LoadBMP("images/etoile.bmp");
    	//SDL_SetColorKey(etoile, SDL_SRCCOLORKEY, SDL_MapRGB(etoile->format, 0, 0, 0));
     
    	/*
    	** Remplit le tableau avec la surface etoile
    	*/
    	int i, j; // indices
    	for(i=0; i<=_NB_BLOCK_HEIGHT; i++)
    		for(j=0; j<=_NB_BLOCK_WIDTH; j++){
    			fondScene[i][j] = etoile;
    		}
     
    	/*
    	** Deplacement du fond
    	*/
     
    		/*
    		** Affiche les elements du tableau
    		*/
    		int u, v;
    		for(u=0; u<=_NB_BLOCK_HEIGHT; u++)
    			for(v=0; v<=_NB_BLOCK_WIDTH; v++){
    				pEtoile.x = v * _BLOCK;
    				pEtoile.y = u * _BLOCK;				
     
    			SDL_BlitSurface(fondScene[u][v], NULL, screen, &pEtoile);
    			}	
    }
     
    /*********
     * createSprites() - Cree un sprite animé ou non
     ****/
    sprites createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed){
    	sprites sprite;
    		sprite.spriteSrc 		= src;
    		sprite.spriteRect.y 	= 0;
    		sprite.spriteRect.x 	= 0;
    		sprite.spriteRect.w 	= spriteW;
    		sprite.spriteRect.h 	= spriteH;
    		sprite.spritePos.x 	= posX;
    		sprite.spritePos.y 	= posY;
    		sprite.spriteNb 		= Nb;
    		sprite.spriteIndex	= 0;
    		sprite.spriteSpeed	= speed;
     
    		return sprite;
    }
     
    /********
     * renderSprites() - Affiche le sprite animé
     ****/
    void renderSprites(sprites *sp){
     
    	// si spriteSpeed = 0 c que le sprite n'est pas annimé, pas la peine de fair la boucle...
    	if(sp->spriteSpeed == 0){
    		SDL_BlitSurface(sp->spriteSrc, &sp->spriteRect, screen, &sp->spritePos);
    	}else{
    		sp->spriteRect.x = sp->spriteIndex * sp->spriteRect.w;
    		SDL_BlitSurface(sp->spriteSrc, &sp->spriteRect, screen, &sp->spritePos);
     
    		currentTimeRender = SDL_GetTicks(); // on recupere le temps en cours
    		if(currentTimeRender > nextTimeRender){ // si le temps en cous est + que le temps de "changement"
    			sp->spriteIndex ++;
    			if(sp->spriteIndex > sp->spriteNb){ // si on est arriver au bout, on reboucle
    				sp->spriteIndex = 0;
    			}
    			nextTimeRender = currentTimeRender + sp->spriteSpeed;
    		}
    	}
    }
     
    /********
     * moveSpritesAxeY - Deplace un sprite sur l'axe Y, avec une vitesse donné en ms
     ****/
    bool moveSpritesAxeY(sprites *sp, int speed){
     
    	currentTimeMove = SDL_GetTicks(); // on recupere le temps en cours
    	if(currentTimeMove > nextTimeMove){ // si le temps en cous est + que le temps de "changement"
    		sp->spritePos.y = sp->spritePos.y - 20;
    		if(sp->spritePos.y < -5){ // si on est arriver au bout de la scene
    			/* faire mourrir le sprite */
    			return false;
    		}else{
    			nextTimeMove = currentTimeMove + speed;
    			return true;
    		}
    	}
    }
     
    /********
     * pushBuffers() - Ajout un element dans le buffer
     ****/
    void pushBuffers(buffers **bp, sprites sp){
    	buffers *element;
    	element = (buffers*) malloc(sizeof(buffers));
    		if(!element) return;
    		element->monSprite = sp;
    		element->prevBuffers = *bp;
    		*bp = element;
    }
     
    /********
     * viewBuffers() - Affiche les elements du buffers
     ****/
    void viewBuffers(buffers *bp){
    	while(bp){
    		if(moveSpritesAxeY(&bp->monSprite, 20)){
    			renderSprites(&bp->monSprite);
    		}
    		bp = bp->prevBuffers;
    	}		
    }
    deux petites question en annexe:
    - pourquoi mon "exit();" n'est pas reconnu ?, (je suis sous linux, si c une histoire de lib à ajouter)

    - comment tuer mes missiles ?

  12. #12
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    j'ai regardé vite fait ton code, et j'ai remarqué quelques petits trucs,

    déjà la liste chainée, c'est marrant tu l'as fais dans le sens inhabituel (enfin je ne l'avais jamais vu de cette façon). Tu garde un pointeur sur l'élement précédent, généralement on a un pointeur sur l'élement suivant, ou null lorsqu'il sagit du dernier élément. Mais bon ta technique devrait fonctionner aussi


    par contre j'ai pas très bien compris ton problème. Je me suis un peu emmélé dans tes explications.
    Quand tu tire un seul missile, ça se passe bien ?
    Quand tu tire plusieurs missiles, ils sont tous affichés ? il y a que le dernier qui bouge ?


    Concernant ton problème pour supprimer les missiles, lorsque tu fait appelle à ta fonction pour déplacer un missile, tu n'a qu'à la faire renvoyer un booléen qui renvoi si le déplacement est valide (pas explosé, pas en dehors de l'écran) : ça tu a fait. Maintenant, lorsque tu récupère un false après un appel à cette fonction, il te reste à supprimer cet élement de la liste chainée, et de traiter le suivant (enfin le précédent dans ton cas ^^).

    j'espère que ça pourra t'aider
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Quelques remarques :

    [EDIT avant l'envoi] Long comme message, j'ai fait cela vite, donc j'espere avoir été clair et pas méchant, ce n'était pas mon intention, voir note en bas si y a un doute...[/EDIT]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    /********
     * Variables Globales
     ****/
    char windowName[128] = "sdlShoot Beta 0.1 | SDL";
     
    //----Evenement----
    SDL_Event e;
     
    //----Surfaces----
    SDL_Surface		*screen;											
    SDL_Surface		*etoile;											
    SDL_Surface		*fondScene[_NB_BLOCK_WIDTH][_NB_BLOCK_HEIGHT] = {0};	
     
     
    //----Rect----
    SDL_Rect 	positionEtoile;														// position des etoiles
     
    //-----Timer----
    int currentTimeRender, nextTimeRender = 0;
    int currentTimeMove, nextTimeMove = 0;
     
    //----Utils----
    C'est quoi ce nombre important de variables globales???? Tu verras que ces variables globales nuisent à la lisibilité de ton code et rendent ton code faux...
    Une ou deux variables globales, pourquoi pas (et encore) mais pas autant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /********
     * Structures
     ****/
    typedef struct sprites {
    	SDL_Surface	*spriteSrc;
    	SDL_Rect		spriteRect;
    	SDL_Rect		spritePos;
    	int			spriteNb;
    	int			spriteIndex;
    	int			spriteSpeed;
    };
     
    typedef struct buffers {
    	sprites			monSprite;
    	struct buffers	*prevBuffers;
    };
    Pas du C et j'ai vu des malloc ci-dessous, donc c'est du C... Ou alors un mixte que je refuse de voir... Faut se décider entre les langages, c'est soit du C soit du C++ et c'est pas parce que le compilateur ne dit rien que c'est bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /********
     * Déclaration des Fonctions
     ****/
    bool freeMemRessources();
    void initEtoiles();
    sprites createSprites(SDL_Surface *src, int posX, int posY, int spriteW,
     int spriteH, int Nb, int speed);
    void renderSprites(sprites *sp);
    bool moveSpritesAxeY(sprites *sp, int speed);
    void pushBuffers(buffers **bp, sprites sp);
    void viewBuffers(buffers *bp);
    Je vois des bool donc on va dire que c'est du C++... Alors en C++ on fait plutôt des classes que des structures... Faut se décider...

    Ensuite, ces déclarations devraient être dans un fichier d'en-tête ou alors c'est des fonctions statiques, dans ce cas, il faut l'expliciter avec le mot clé static

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /********
     * int main() - Fonction Principale
     ****/
    int main(int argc, char **argv){
    	/*
    	** Variables Locales
    	*/
    	bool msg = false;
    	bool play = false;
    Définitivement du C++ alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	/*
    	** Initialisation de SDL
    	*/
    	if(SDL_Init(SDL_INIT_VIDEO) == -1){
    		printf("Erreur: Impossible d'initialiser SDL, SDL_INIT_VIDEO %c", SDL_GetError());
    		//exit(0);
    	}
    Pas besoin de exit, un return EXIT_FAILURE suffit vu qu'on est dans le main. Pour savoir quelle en-tête utilisé pour exit, il faudrait faire man exit bien qu'en C++, on capture l'erreur avec un try/catch et on ne fait pas d'exit...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	SDL_WM_SetCaption(windowName, NULL);
    	SDL_WM_SetIcon(SDL_LoadBMP("images/icone.bmp"), NULL);
     
    	screen = SDL_SetVideoMode(_WIDTH, _HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
    	if(screen == NULL){
    		msg = true;
    	}
    Si screen==NULL, pourquoi continuer?? On peut juste retourner EXIT_FAILURE...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	/*
    	** Déclaration applicatives
    	*/
    	//- vaisseau
    	sprites stVaisseau;
    	stVaisseau = createSprites(IMG_Load("images/player.png"), 
             300, 300, 40, 64, 0, 0);
    On ne retourne pas de structure en C/C++ mais un pointeur. Si on veut que la fonction compléte une structure on passe cette structure en paramétre.

    Donc on ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	sprites stVaisseau;
    	createSprites(IMG_Load("images/player.png"), 
                 300, 300, 40, 64, 0, 0, &stVaisseau);
    En changeant bien sûr la fonction createSprites...

    Continuons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	//- missile
    	sprites stMissile;
    	buffers *bufMissile = NULL;
    	stMissile = createSprites(IMG_Load("images/img.png"), 
                 0, 0, 32, 32, 9, 30);
    Même remarque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	/*
    	** Boucle d'attenrenderSprites(&stVaisseau);te des messages
    	*/
    	while(!msg){
    		while(SDL_PollEvent(&e)){
                    ....               
                   }
          }
    Trop long... Découpe cette boucle et appelle une fonction pour gérer la souris, une fonction pour le clavier, etc...

    Le main doit rester assez petit... A la limite, déclare les fonctions de gestion inline si tu as peur que les performances vont chuter...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		/*
    		** Fonctions applicatives
    		*/
    		initEtoiles();
    		renderSprites(&stVaisseau);
    		viewBuffers(bufMissile);
    Quoi, tu initialises quelque chose dans la boucle infinie? On va voir cette fonction par la suite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		/*
    		** Echange du buffer;
    		*/
    		SDL_Flip(screen);
    	}
    	/*
    	** On libere les ressources avant de quitter le pgm
    	*/
    	freeMemRessources();
     
    	SDL_Quit();
    	return 0;
    }
    Ok pour cette fin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /********
     * bool freeMemRessources() - Fonction pour liberer les ressource avec de quitter
     ****/
    bool freeMemRessources(){
     
    	SDL_FreeSurface(screen);
     
    	return true;
    }
    Quoi c'est tout? Et les sprites? Et les étoiles? Et tous les mallocs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /********
     *  void initEtoile() - Creation d'un fond d'etoile a partir d'une image 64*64
     ****/
    void initEtoiles(){
    Ah voici la fonction qui est dans la boucle infinie...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	SDL_Rect pEtoile;
    	SDL_Rect pFondScene;
     
    	etoile = SDL_LoadBMP("images/etoile.bmp");
    Ca commence mal... Tu charges un bmp dans une boucle infinie? En plus, tu ne désalloue même pas ta surface... Bonjour la consommation mémoire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	//SDL_SetColorKey(etoile, SDL_SRCCOLORKEY, SDL_MapRGB(etoile->format,
               0, 0, 0));
     
    	/*
    	** Remplit le tableau avec la surface etoile
    	*/
    	int i, j; // indices
    	for(i=0; i<=_NB_BLOCK_HEIGHT; i++)
    		for(j=0; j<=_NB_BLOCK_WIDTH; j++){
    			fondScene[i][j] = etoile;
    		}
    On remplit un tableau dans une boucle infinie et toujours avec la même chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	/*
    	** Deplacement du fond
    	*/
     
    		/*
    		** Affiche les elements du tableau
    		*/
    		int u, v;
    		for(u=0; u<=_NB_BLOCK_HEIGHT; u++)
    			for(v=0; v<=_NB_BLOCK_WIDTH; v++){
    				pEtoile.x = v * _BLOCK;
    				pEtoile.y = u * _BLOCK;				
     
    			SDL_BlitSurface(fondScene[u][v], NULL, screen, &pEtoile);
    			}	
    }
    Alors la fonction blit pouvait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface(etoile, NULL, screen, &pEtoile);
    Donc le tableau est inutile (pour le moment)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    /*********
     * createSprites() - Cree un sprite animé ou non
     ****/
    sprites createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed){
    	sprites sprite;
    		sprite.spriteSrc 	 = src;
    		sprite.spriteRect.y 	= 0;
    		sprite.spriteRect.x 	= 0;
    		sprite.spriteRect.w 	= spriteW;
    		sprite.spriteRect.h 	= spriteH;
    		sprite.spritePos.x 	= posX;
    		sprite.spritePos.y 	= posY;
    		sprite.spriteNb 		= Nb;
    		sprite.spriteIndex	= 0;
    		sprite.spriteSpeed	= speed;
     
    		return sprite;
    }
    Ok pourquoi pas mais il faut changer par rapport à la remarque précédente...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /********
     * renderSprites() - Affiche le sprite animé
     ****/
    void renderSprites(sprites *sp){
     
    	// si spriteSpeed = 0 c que le sprite n'est pas annimé, pas la peine de fair la boucle...
    	if(sp->spriteSpeed == 0){
    		SDL_BlitSurface(sp->spriteSrc, &sp->spriteRect, screen, &sp->spritePos);
    	}else{
    		sp->spriteRect.x = sp->spriteIndex * sp->spriteRect.w;
    		SDL_BlitSurface(sp->spriteSrc, &sp->spriteRect, screen, &sp->spritePos);
     
    		currentTimeRender = SDL_GetTicks(); // on recupere le temps en cours
    		if(currentTimeRender > nextTimeRender){ // si le temps en cous est + 
    que le temps de "changement"
    Donc toutes les animations se passent au même moment vu que nextTimeRender est une variable globale. Si c'était un champ de ta structure sprite, chaque sprite pourrait évoluer et s'animer indépendemment...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			sp->spriteIndex ++;
    			if(sp->spriteIndex > sp->spriteNb){ // si on est arriver au bout, on reboucle
    				sp->spriteIndex = 0;
    			}
    			nextTimeRender = currentTimeRender + sp->spriteSpeed;
    		}
    ET BAM!!!! Variable globale modifié, les autres ne seront plus animés... Puisque pour le prochain sprite nextTimeRender est déjà dans le futur... 1ère erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	}
    }
     
    /********
     * moveSpritesAxeY - Deplace un sprite sur l'axe Y, avec une vitesse donné en ms
     ****/
    bool moveSpritesAxeY(sprites *sp, int speed){
     
    	currentTimeMove = SDL_GetTicks(); // on recupere le temps en cours
    	if(currentTimeMove > nextTimeMove){
    Ah lala... Une deuxième variable globale qui va se faire modifier? Et donc bloquer les autres?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		sp->spritePos.y = sp->spritePos.y - 20;
    Ok mais bon il faudrait mieux prendre en compte la différence entre currentTimeMove et nextTimeMove pour calculer la distance sinon le mouvement sera trop haché et monotone...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		if(sp->spritePos.y < -5){ // si on est arriver au bout de la scene
    			/* faire mourrir le sprite */
    			return false;
    		}else{
    			nextTimeMove = currentTimeMove + speed;
    			return true;
    ET BAM!! Prochain sprite ne bougera plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    		}
    	}
    }
     
    /********
     * pushBuffers() - Ajout un element dans le buffer
     ****/
    void pushBuffers(buffers **bp, sprites sp){
    	buffers *element;
    	element = (buffers*) malloc(sizeof(buffers));
    		if(!element) return;
    		element->monSprite = sp;
    		element->prevBuffers = *bp;
    		*bp = element;
    }
    Ok ca c'est bon, sauf qu'on passerait un pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void pushBuffers(buffers **bp, sprites *sp) {
    	buffers *element;
    	element = (buffers*) malloc(sizeof(buffers));
    		if(!element) return;
    		element->monSprite = *sp;
    		element->prevBuffers = *bp;
    		*bp = element;
    }
    Et donc il faudrait changer les appels...

    A faire tout de même attention aux affectations avec structure, ce n'est qu'une copie superficielle...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /********
     * viewBuffers() - Affiche les elements du buffers
     ****/
    void viewBuffers(buffers *bp){
    	while(bp){
    		if(moveSpritesAxeY(&bp->monSprite, 20)){
    			renderSprites(&bp->monSprite);
    		}
    		bp = bp->prevBuffers;
    	}		
    }
    Ah, dépendant si on bouge le sprite ou non, on l'affiche? C'est logique ca? D'accord pour toi, c'est des missiles mais bon... En principe, faut mieux rester général. De plus, si la fonction retourne faux c'est que le missile est sorti de l'écran donc faudrait l'enlever de la liste...

    deux petites question en annexe:
    - pourquoi mon "exit();" n'est pas reconnu ?, (je suis sous linux, si c une histoire de lib à ajouter)
    Comme déjà dit, il suffit de faire man exit

    - comment tuer mes missiles ?
    Suffit de les enlever de la liste et libérer la mémoire...



    Bon c'est long comme message, j'espère avoir été clair et n'y vois aucun mépris ou méchanceté... Je pense que ce projet est au-dessus de ce que tu devrais faire mais c'est comme cela qu'on apprend.

    Bien que cela ne se voit pas dans les remarques, tu as les bonnes idées, tu fais les tests qu'il faut, enlève ton habitude d'avoir des variables globales et tu auras moins de mauvaises surprises...

    Continue comme ca!
    Jc

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    Bonsoir

    fearyourself:
    Merci beaucoup fearyourself, avoir repris mon code comme tu la fais c quand meme tres gentil surtout que tu as du y prendre du temps !, je n'ai senti aucun mauvais esprit de ta part mais plutot une motivation supplémentaire, donc t casse pas la tete (:, je vais refaire tout mon code en suivant tes incations, je vais travailler que en C et non C++, je maitrise plutot mal l'objet, donc c pas la peine que je me complique encore la tete !
    erf, quand meme je croyais que j'avais au moins un code bien structuré ... lol

    MrDuChnok:
    lol, en faite j'ai suivi un tuto sur le site pour les listes chaineé .... (:
    sinon t casse po la tete pour mes mauvaises explications, fearyourself ma fais remarquer que ca venais de mes variables globales

    bon bah j'ai du boulot !

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    je bug un peu pour la fonction createSprites()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    #include <SDL.h>
    #include <SDL_image.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "defines.h"
    //#include "structures.h
    //#include "fonctions.h
     
    /******** structures.h
     * Structures
     ****/
    typedef struct {
    	SDL_Surface		*spriteSrc;
    	SDL_Rect			spriteRect;
    	SDL_Rect			spritePos;
    	int				spriteTime;
    	int				spriteTimeUpdate;
    	int				spriteNb;
    	int				spriteIndex;
    	int				spriteSpeed;
    }sprites;
     
    typedef struct {
    	sprites				monSprite;
    	struct buffers		*prevBuffers;
    }buffers;
     
     
    /******** fonctions.h
     * Déclaration des Fonctions
     ****/
     void renderSprites(sprites *sp, SDL_Surface *target);
     void createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed, sprites *sp);
    /********
     * int main() - Fonction Principale
     ****/
    int main(int argc, char **argv){
    	/*
    	** Variables Locales
    	*/
    	char windowName[128] = "sdlShoot Beta 0.1 | SDL";
    	SDL_Event 		e;
    	SDL_Surface		*screen;
    	int				msg = 0;			
     
    	/*
    	** Initialisation de SDL
    	*/
    	if(SDL_Init(SDL_INIT_VIDEO) == -1){
    		printf("Erreur: Impossible d'initialiser SDL, SDL_INIT_VIDEO %c", SDL_GetError());
    		// voir man exit;
    	}
    	SDL_WM_SetCaption(windowName, NULL);
    	SDL_WM_SetIcon(SDL_LoadBMP("images/icone.bmp"), NULL);
     
    	screen = SDL_SetVideoMode(_WIDTH, _HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
    	if(screen == NULL){
    		// voir man exit;
    	}
     
    	/*
    	** Déclaration applicatives
    	*/
    	//- vaisseau
    	sprites *stVaisseau;
    	createSprites(IMG_Load("images/player.png"), 300, 300, 40, 64, 0, 0, stVaisseau);
     
    	/*
    	** Boucle d'attenrenderSprites(&stVaisseau);te des messages
    	*/
    	while(!msg){
    		while(SDL_PollEvent(&e)){
    			switch(e.type){
    				case SDL_QUIT: // si on cherche a quitter le pgm
    					msg = 1;
    				break;
    				case SDL_KEYUP: // si on pousse une touche
     
    				break;
    				case SDL_MOUSEMOTION:
     
    				break;
    				case SDL_MOUSEBUTTONDOWN:
     
    				break;
    				case SDL_MOUSEBUTTONUP:
     
    				break;
    			}
     
    		}
    		renderSprites(stVaisseau, screen);
    		/*
    		** Echange du buffer;
    		*/
    		SDL_Flip(screen);
    	}
    	/*
    	** On libere les ressources avant de quitter le pgm
    	*/
    	SDL_FreeSurface(screen);
     
    	SDL_Quit();
    	return 0;
    }
     
    /*********
     * createSprites() - Cree un sprite animé ou non
     ****/
    void createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed, sprites *sp){
    	sprites sprite;
    		sprite.spriteSrc 			= IMG_Load("images/player.png");//src;
    		sprite.spriteRect.y 		= 0;
    		sprite.spriteRect.x 		= 0;
    		sprite.spriteRect.w 		= spriteW;
    		sprite.spriteRect.h 		= spriteH;
    		sprite.spritePos.x 		= posX;
    		sprite.spritePos.y 		= posY;
    		sprite.spriteTime			= SDL_GetTicks();
    		sprite.spriteTimeUpdate = 0;
    		sprite.spriteNb 			= Nb;
    		sprite.spriteIndex		= 0;
    		sprite.spriteSpeed		= speed;
     
    		sp = &sprite;
    }
     
    /********
     * renderSprites() - Affiche le sprite animé
     ****/
    void renderSprites(sprites *sp, SDL_Surface *target){
    				SDL_BlitSurface(sp->spriteSrc, &sp->spriteRect, target, &sp->spritePos);
     
    }
    le pgm ce compil bien mais quand je le lance j'ai "Erreur de segmentation"

  16. #16
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /*********
     * createSprites() - Cree un sprite animé ou non
     ****/
    void createSprites(SDL_Surface *src, int posX, int posY, int spriteW, int spriteH, int Nb, int speed, sprites *sp){
    	sprites sprite;
    		sprite.spriteSrc 			= IMG_Load("images/player.png");//src;
    		sprite.spriteRect.y 		= 0;
    		sprite.spriteRect.x 		= 0;
    		sprite.spriteRect.w 		= spriteW;
    		sprite.spriteRect.h 		= spriteH;
    		sprite.spritePos.x 		= posX;
    		sprite.spritePos.y 		= posY;
    		sprite.spriteTime			= SDL_GetTicks();
    		sprite.spriteTimeUpdate = 0;
    		sprite.spriteNb 			= Nb;
    		sprite.spriteIndex		= 0;
    		sprite.spriteSpeed		= speed;
     
    		sp = &sprite;
    }


    Faut revoir son cours de C...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /*********
     * createSprites() - Cree un sprite animé ou non
     ****/
    void createSprites(SDL_Surface *src, int posX, int posY, int spriteW, 
               int spriteH, int Nb, int speed, sprites *sp){
    		sp->spriteSrc 			= IMG_Load("images/player.png");//src;
    		sp->spriteRect.y 		= 0;
    		sp->spriteRect.x 		= 0;
    		sp->spriteRect.w 		= spriteW;
    		sp->spriteRect.h 		= spriteH;
    		sp->spritePos.x 		= posX;
    		sp->spritePos.y 		= posY;
    		sp->spriteTime			= SDL_GetTicks();
    		sp->spriteTimeUpdate = 0;
    		sp->spriteNb 			= Nb;
    		sp->spriteIndex		= 0;
    		sp->spriteSpeed		= speed;
    }
    Me semble mieux,
    Jc

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Dans cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sprites *stVaisseau;
    	createSprites(IMG_Load("images/player.png"), 300, 300, 
    40, 64, 0, 0, stVaisseau);
    Est-ce que tu as alloué de la mémoire pour stocker la structure stVaisseau??

    Il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprites stVaisseau;
    createSprites(IMG_Load("images/player.png"), 300, 300, 40, 64, 0, 0, &stVaisseau);
    Jc

  18. #18
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Tu as un code de fou. Tu devrai commecer par te faire un petit moteur 2D. Reflechi à toutes les fonctions que tu pense utiles dans un jeu:
    Creation des sprites,affichage à une position de l'ecran,changement de couleur,reglage d'opacite,gestion des E/S et gestion de la scene(ta fameuse liste chainée) avec ajout d'un sprite à la scene,changer l'ordre d'affichage d'un sprite dans la scene pour les superpositions et effacer un sprite de la scene.Avec la gestion de la scene ton pb de missile se fera facilement. Quand l'utilisateur appuie sur la touche qui tire tu ajoute une image de type missile à la scene et arrivé à une certaine distance tu l'efface. Tu simplifiera enormement ton code et tu verra que si tu sais faire un niveau tu sais en faire 10.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    lol, jsuis un boulet j'avais meme pas remarqueé ... depuis hier jsuis dessus quand meme !

    sinon drcd, c un peu ce que je suis en train de faire (:

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut
    CA AVance !!!!!

    tout fonctionne impeccable j'ai mon petit avion qui bouge et je tire des missiles animés a la volée (:

    j'aurais quelques questions au sujet des jeux en 2D, comment fonctionne le fond ?? sachant que mon jeu sera compatible avec plusieurs resolutions d'affichage, si je place une simple image en guise de fond, en augmentant la resolution je vais perdre en qualité... non ??

    si vous avez deux trois conseils a me donner, (:

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB.NET] Comment envoyer un texte modifié(couleurs,style...)
    Par fdiedler dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/03/2005, 18h11
  2. [Rave5] Comment envoyer un text ver un label
    Par pacs dans le forum Rave
    Réponses: 2
    Dernier message: 03/03/2005, 14h55
  3. Comment envoyer un mail avec la commande mail
    Par pi3141563 dans le forum Réseau
    Réponses: 5
    Dernier message: 21/10/2004, 13h34
  4. [VB6] Comment envoyer un mail HTML par Winsocks ?
    Par hedgehog dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/05/2004, 10h04
  5. Comment envoyer une commande à une console ?
    Par seb_asm dans le forum Assembleur
    Réponses: 3
    Dernier message: 27/03/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo