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
| #include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
#include <SDL_rotozoom.h>
#include "constantes.h"
#include "functions.h"
void jeu(SDL_Surface* ecran)
{
SDL_Surface *table = NULL, *Bb = NULL, *Qb = NULL, *rotation;
SDL_Rect positionTable, positionBb, positionQb, posBbInit;
SDL_Event event;
Position *P;
int continuer = 1, tempsPrecedent = 0, tempsActuel = 0, cptlancer = 0, cptdeplace = 0, *rebond;
double angle = 0;
double zoom = 1.0;
table = IMG_Load("table.jpg");
positionTable.x = ecran->w / 2 - table->w / 2;
positionTable.y = ecran->h / 2 - table->h / 2;
Bb = IMG_Load("Bb.bmp");
SDL_SetColorKey(Bb, SDL_SRCCOLORKEY, SDL_MapRGB(Bb->format, 0, 0, 0)); // Le noir derrière la boule blanche devient transparent
positionBb.x = LARGEUR_FENETRE / 3 + 25;
positionBb.y = HAUTEUR_FENETRE / 2 - (Bb->h) / 2;
Qb = IMG_Load("QB.bmp");
SDL_SetColorKey(Qb, SDL_SRCCOLORKEY, SDL_MapRGB(Qb->format, 0, 0, 0)); // Le noir derrière la queue de billard devient transparent
positionQb.x = LARGEUR_FENETRE / 3 - (Qb->w);
positionQb.y = HAUTEUR_FENETRE / 2 - (Qb->h) / 2;
rotation = Qb; // rotation prend l'image de la queue de billard (pour blitter rotation meme si il n'y a pas de rotation de l'image de Qb)
posBbInit = positionBb; // posBbInit prend la position initiale de la boule blanche
while(continuer)
{
SDL_PollEvent(&event); // Utilisation de PollEvent et non WaitEvent pour ne pas bloquer le programme
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_a:
continuer = 0;
break;
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_UP:
angle -= 1;
rotation = rotozoomSurface(Qb, angle, zoom, 0); // Transformation de la surface
positionQb.x = LARGEUR_FENETRE / 3 - (Qb->w);
positionQb.y -= (rotation->h / 10);
break;
case SDLK_DOWN:
angle += 1;
rotation = rotozoomSurface(Qb, angle, zoom, 0); // Transformation de la surface
positionQb.x = LARGEUR_FENETRE / 3 - (Qb->w);
positionQb.y += (rotation->h / 10);
break;
case SDLK_SPACE: // Recul de la queue de billard avant lancer
if (positionQb.x > LARGEUR_FENETRE / 3 - (Qb->w) - 25) // Si la queue de billard est placée correctement en abscisse avant la distance maximale
{
positionQb.x -= 1;
if (positionQb.y > HAUTEUR_FENETRE / 2 - (Qb->h) / 2)
{ positionQb.y += 1; }
else if (positionQb.y < HAUTEUR_FENETRE / 2 - (Qb->h) / 2)
{ positionQb.y -= 1; }
}
break;
}
break;
case SDL_KEYUP:
switch (event.key.keysym.sym)
{
case SDLK_SPACE:
cptlancer = 1;
break;
}
}
// Avancement de la queue de billard lors du lancer
if(cptlancer == 1 && (positionQb.x + rotation->w < posBbInit.x)) // Si le lancer a eu lieu et que la queue de billard est située avant la boule blanche au départ
{
positionQb.x += 1;
if (positionQb.y > HAUTEUR_FENETRE / 2 - (Qb->h) / 2)
positionQb.y -= 1;
else if (positionQb.y < HAUTEUR_FENETRE / 2 - (Qb->h) / 2)
positionQb.y += 1;
}
if(positionQb.x + rotation->w == posBbInit.x) // Si l'extremite de la queue de billard se trouve collé au côté droit de la boule
{
tempsActuel = SDL_GetTicks();
if (tempsActuel - tempsPrecedent > 30) // Si 30 ms se sont écoulées
{
if(!collisionTable(&positionTable, &positionBb, &rebond))
{
deplacerBoule(&P, &positionQb, &positionBb, &rotation, &posBbInit, cptdeplace);
}
if(collisionTable(&positionTable, &positionBb, &rebond))
{
//Partie a developper
;
}
tempsPrecedent = tempsActuel; // Le temps "actuel" devient le temps "precedent" pour les futurs calculs
}
else // Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme un certain temps
{
SDL_Delay(30 - (tempsActuel - tempsPrecedent));
}
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
SDL_BlitSurface(table, NULL, ecran, &positionTable);
if (P == NULL)
SDL_BlitSurface(Bb, NULL, ecran, &positionBb);
else
Blit(ecran, Bb, &P);
SDL_BlitSurface(rotation, NULL, ecran, &positionQb);
SDL_Flip(ecran);
}
SDL_FreeSurface(table);
SDL_FreeSurface(Bb);
SDL_FreeSurface(rotation);
}
void deplacerBoule(Position *P, SDL_Rect *positionQb, SDL_Rect *positionBb, SDL_Surface* qBillard, SDL_Rect *posBbInit, int cptdeplace)
{
if(cptdeplace == 0)
{
P->posX = (double)positionBb->x;
P->posY = (double)positionBb->y;
}
cptdeplace = 1;
if((positionQb->x + qBillard->w) < posBbInit->x)
P->posX += (double)(((positionQb->x + qBillard->w) - positionQb->x) / 10);
else if(positionQb->x > (posBbInit->x + 20))
P->posX -= (double)(((positionQb->x + qBillard->w) - positionQb->x) / 10);
if(positionQb->y < posBbInit->y)
P->posY += (double)(((positionQb->y + qBillard->h) - positionQb->y) / 10);
if(positionQb->y >= posBbInit->y)
P->posY -= (double)((positionQb->y - (positionQb->y + qBillard->h)) / 10);
}
int collisionTable(SDL_Rect* positionTable,SDL_Rect* positionBb, int *rebond)
{
if(!(positionTable->x + positionTable->w - 25 > positionBb->x + positionBb->w))
*rebond = DROITE;
if(!(positionTable->y + positionTable->h - 25 > positionBb->y + positionBb->h))
*rebond = BAS;
if(!(positionTable->x + 25 < positionBb->x))
*rebond = GAUCHE;
if(!(positionTable->y + 25 < positionBb->y))
*rebond = HAUT;
if((positionTable->x + positionTable->w - 25 > positionBb->x + positionBb->w)
&& (positionTable->y + positionTable->h - 25 > positionBb->y + positionBb->h)
&& (positionTable->x + 25 < positionBb->x)
&& (positionTable->y + 25 < positionBb->y)
)
return 0; // Si la balle ne touche aucun des 4 rebords
return 1; // Si la balle touche un des rebords
}
void Blit(SDL_Surface *ecran, SDL_Surface *Bb, Position *P)
{
SDL_Rect pos;
pos.x = (int)P->posX;
pos.y = (int)P->posY;
SDL_BlitSurface(Bb, NULL, ecran, &pos);
} |
Partager