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
|
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sdl/sdl.h>
#include <SDL/SDL_image.h>
#include "animation.h"
#include "constante.h"
void mouvementSprite( Sprite *sprite, int direction )
{
// On affecte la direction au sprite
sprite->direction = direction;
// on affecte l'animation correcpondant à la direction au sprite
if (direction != AUCUNE_DIRECTION)
{
sprite->anim = 1;
switch (direction)
{
case DIRECTION_DROITE:
sprite->orientation = DROITE; //le sprite s'oriente vers la droite
break;
case DIRECTION_GAUCHE:
sprite->orientation = GAUCHE; //le sprite s'oriente vers la gauche
break;
default:
;
}
}
else
// si le sprite est arreté, on ne l'anime pas
sprite->anim = 0;
// on met la première animation
sprite->anim_courante = 0;
sprite->temps_anim_courante = 0;
// on regle la source de l'image à copier
sprite->source.y = sprite->orientation * sprite->hauteur;
sprite->source.x = sprite->anim_courante * sprite->largeur;
}
int chargementSprite( Sprite *sprite, const char *image )
{
sprite->image = IMG_Load( image ); //on charge l'image dans la composante image du sprite
if ( sprite->image == NULL )
{
fprintf(stderr, "Echec de chargement du fichier %s : %s.\n", image, SDL_GetError());
return 0;
}
/* Verification du format de l'image */
if ( (sprite->image->w != 540) || (sprite->image->h != 120) )
if ( sprite->image == NULL )
{
fprintf(stderr, "L'image du fichier %s doit être de taille 540*120 pixels.\n", image);
SDL_FreeSurface(sprite->image);
return 0;
}
if ( !sprite->image )
return 0;
// on fixe la cle de transparance
SDL_SetColorKey( sprite->image, SDL_SRCCOLORKEY, SDL_MapRGB( sprite->image->format, 250, 65, 245) );
/* On definit d'abord les propriétés du sprite : */
// le sprite n'est pas animé par defaut
sprite->anim = 0;
// on commence par la première animation
sprite->anim_courante = 0;
// le sprite dispose de neuf animations
sprite->total_anims = 9;
// par défaut, le sprite est tourné vers le bas
sprite->orientation = DROITE;
// chaque animation dure 20 affichages
sprite->temps_anim = 20;
// Le temps qu'il reste à afficher l'animation courante
sprite->temps_anim_courante = 0;
// On definit ensuite les dimentions du sprite.
sprite->largeur = 60;
sprite->hauteur = 60;
sprite->source.x = sprite->anim_courante * sprite->largeur;
sprite->source.y = sprite->orientation * sprite->hauteur;
sprite->source.w = sprite->largeur;
sprite->source.h = sprite->hauteur;
sprite->dest.x = 0;
sprite->dest.y = 0;
sprite->dest.w = sprite->largeur;
sprite->dest.h = sprite->hauteur;
// on definit enfin la vitesse et la direction du sprite
sprite->vitesse = 3;
sprite->direction = AUCUNE_DIRECTION;
return 1;
}
void affichageSprite( Sprite *sprite, SDL_Surface *destination )
{
// le sprite vas vers le haut
if (sprite->direction & DIRECTION_GAUCHE)
{
// on va à gauche et on fait attention a ne pas sortir de l'ecran
sprite->dest.x -= sprite->vitesse;
if (sprite->dest.x < 0)
sprite->dest.x = 0;
}
else if (sprite->direction & DIRECTION_DROITE)
{
// on va à droite et on fait attention a ne pas sortir de l'ecran
sprite->dest.x += sprite->vitesse;
if (sprite->dest.x + sprite->largeur > LONGUEUR_FENETRE)
sprite->dest.x = LONGUEUR_FENETRE - sprite->largeur;
}
/* si le sprite est animé, on gere l'animation */
if (sprite->anim)
{
// on decremente le temps restant à l'animation courante
sprite->temps_anim_courante-=5;
// et on regarde s'il est temps de changer d'animation
if ( sprite->temps_anim_courante <= 0 )
{
// s'il faut changer, on passe à l'animation suivante
sprite->anim_courante++;
// si on était à la dernière animation, on repasse à la première
if (sprite->anim_courante >= sprite->total_anims)
sprite->anim_courante = 0;
// on regle la source à copier
sprite->source.x = sprite->largeur * sprite->anim_courante;
sprite->temps_anim_courante = sprite->temps_anim;
}
}
// enfin, on dessine le sprite à l'ecran
SDL_BlitSurface( sprite->image, &sprite->source, destination, &sprite->dest );
}<br><br> |
Partager