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
| #include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include "SDL_Image.h"
struct stSprite
{
SDL_Surface * source;
int destX[3];
int destY[3];
int speed;
int deplX;
int deplY;
};
/* Création d'un sprite placé sur l'écran, */
struct stSprite * createSprite(SDL_Surface * source)
{
/* Allocation dynamique de la structure du sprite */
struct stSprite * oneSprite;
oneSprite = malloc(sizeof(struct stSprite));
oneSprite->source = source;
oneSprite->destX[0] = 400;
oneSprite->destY[0] = 580;
oneSprite->speed = 1;
oneSprite->deplX = 2;
oneSprite->deplY = 0;
return oneSprite;
}
/* Met à jour un sprite à partir de sa structure */
void sdlUpdateSprite(struct stSprite * oneSprite)
{
/* Sauvegarde des anciennes positions */
oneSprite->destX[2] = oneSprite->destX[1];
oneSprite->destX[1] = oneSprite->destX[0];
oneSprite->destY[2] = oneSprite->destY[1];
oneSprite->destY[1] = oneSprite->destY[0];
/* Mise à jour de la position */
oneSprite->destX[0] += oneSprite->deplX;
oneSprite->destY[0] += oneSprite->deplY;
/* Rebondi sur les bords */
if(oneSprite->destX[0] < 0)
{
oneSprite->destX[0] = 0;
oneSprite->deplX = 1;
}
if(oneSprite->destX[0] > 799-64)
{
oneSprite->destX[0] = 799-64;
oneSprite->deplX = -1;
}
}
/* Efface l'ancienne position du sprite */
void sdlEraseSprite(SDL_Surface * screen, struct stSprite * oneSprite)
{
/* Rectangle contenant les anciennes coordonnées du sprite à l'écran */
SDL_Rect sdlDstSprite;
sdlDstSprite.x = oneSprite->destX[2];
sdlDstSprite.y = oneSprite->destY[2];
sdlDstSprite.w = 64;
sdlDstSprite.h = 16;
/* On efface cette position */
SDL_FillRect(screen,&sdlDstSprite,0);
}
/* Affiche un sprite à partir de sa structure */
void sdlDisplaySprite(SDL_Surface * screen, struct stSprite * oneSprite)
{
/* Rectangle décrivant le sprite actuel à afficher */
SDL_Rect sdlSrcSprite;
/* Rectangle contenant les coordonnées du sprite à l'écran */
SDL_Rect sdlDstSprite;
/* On va chercher la coordonnee du sprite à afficher dans l'image */
sdlSrcSprite.x = 0;
/* Autres données */
sdlSrcSprite.y = 0;
sdlSrcSprite.w = 64;
sdlSrcSprite.h = 16;
/* Coordonnées à l'écran de la nouvelle position */
sdlDstSprite.x = oneSprite->destX[0];
sdlDstSprite.y = oneSprite->destY[0];
/* On recopie le rectangle du sprite sur le buffer d'affichage */
SDL_BlitSurface(oneSprite->source,&sdlSrcSprite,screen,&sdlDstSprite);
}
int main (int argc, char *argv[])
{
SDL_Surface *fond = NULL;
SDL_Rect dstfond;
Uint32 colorkey ;
/* Surface écran */
SDL_Surface * sdlMainScreen;
/* Surface contenant l'image des sprites */
SDL_Surface * sdlLoadedPicture;
/* Tableau de sprites */
struct stSprite * Sprites[0];
/* "Date" courante */
int currentTime;
/* Drapeau de fin de boucle */
int quitProgram = 0;
/* Variable de boucle */
int i;
/* Initialisation de la partie Vidéo de SDL */
if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0)
/* En cas d'échec, sortie */
exit (1);
/* Lorsque le programme se termine, il ferme SDL correctement */
atexit(SDL_Quit);
/* Demande d'affichage en 800x600 32bits */
/* SDL_SWSURFACE : la surface est crée en RAM système */
/* SDL_DOUBLEBUF : on utilise deux buffers */
sdlMainScreen = SDL_SetVideoMode (800, 600, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
/* En cas d'echec, on sort */
if (sdlMainScreen == NULL)
exit (2);
/* Charge l'image qui contient les sprites */
fond = IMG_Load("fond.png");
dstfond.w=fond->w;
dstfond.h=fond->h;
dstfond.x=0;
dstfond.y=0;
sdlLoadedPicture = IMG_Load("AquaRaquette.png");
colorkey = SDL_MapRGB( sdlLoadedPicture->format, 0xFF, 0xFF, 0xFF );
SDL_SetColorKey( sdlLoadedPicture, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );
SDL_BlitSurface(fond, NULL, sdlMainScreen, &dstfond);
if(sdlLoadedPicture==NULL)
exit(3);
//SDL_SetColorKey( sdlLoadedPicture, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );
/* Déclare la couleur noire comme transparente sur cette surface */
// SDL_SetColorKey(sdlLoadedPicture,SDL_SRCCOLORKEY,0);
Sprites[0] = createSprite(sdlLoadedPicture);
/* Boucle principale */
while (!quitProgram)
{
SDL_Event event;
/* Lecture des évènements dans la queue d'évènements */
while (SDL_PollEvent (&event))
{
switch (event.type)
{
/* Evenement de fermeture d'application, on sort la boucle */
case SDL_QUIT:
quitProgram = 1;
break;
}
}
/* Appel de la fonction d'affichage d'un sprite */
/* et effacement des anciennes positions */
sdlUpdateSprite(Sprites[0]);
sdlEraseSprite(sdlMainScreen,Sprites[0]);
/* Affichage des sprites */
sdlDisplaySprite(sdlMainScreen,Sprites[0]);
/* Echange des deux buffers */
SDL_Flip(sdlMainScreen);
}
free(Sprites[0]);
SDL_FreeSurface(sdlLoadedPicture);
return 0;
} |
Partager