
//--------------------------------------------------------------------------------------------
// * Fonction MAIN *
//--------------------------------------------------------------------------------------------
int main ( int argc, char** argv )
{
//--------------------------------------------------------------------------------------------
// * INITIALISATION *
//--------------------------------------------------------------------------------------------
// Initialisation de la SDL
initSDL();
// Identification du répertoire courant (Windows)
DWORD dwRet;
dwRet = GetCurrentDirectory(MAX_PATH, repertoire);
printf("Répertoire du programme = %s \n",repertoire);
// Texte et Polices
initTTF();
// Initialisations spécifiques au Programme
initPrg();
//--------------------------------------------------------------------------------------------
// * BOUCLE PRINCIPALE *
//--------------------------------------------------------------------------------------------
while (!quitter)
{
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT: // exit
quitter = 1;
break;
case SDL_MOUSEBUTTONUP:
gesClic();
break;
case SDL_MOUSEMOTION:
gesMotion();
break;
case SDL_USEREVENT:
gesUser();
break;
case SDL_KEYDOWN:
gesKey();
break;
case SDL_KEYUP:
upKey();
break;
} // end switch
} // (SDL_PollEvent(&event))
if(actif) Actualise();
Affichage();
gesFrame();
} // (!quitter)
//--------------------------------------------------------------------------------------------
// * Fin du programme *
//--------------------------------------------------------------------------------------------
// Fin programme
void finPrg();
printf("Fin programme : OK \n");
return 0;
}
//--------------------------------------------------------------------------------------------
// * FONCTIONS *
//--------------------------------------------------------------------------------------------
void initSDL()
{
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0 )
{
printf( "Echec init SDL: %s\n", SDL_GetError() );
}
// make sure SDL cleans up before exit
atexit(SDL_Quit);
/* Chargement de l'icône AVANT SDL_SetVideoMode */
SDL_WM_SetIcon(Rsc2bmp("Icone"), NULL);
putenv("SDL_VIDEO_WINDOW_POS=40,35"); //pour placer la fenetre en x,y
SDL_WM_SetCaption(TITRE, NULL);
// create a new window
ecran = SDL_SetVideoMode(largeur, hauteur, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !ecran )
{
printf("Echec ouverture écran video: %s\n", SDL_GetError());
}
SDL_EnableUNICODE(1);
}
void initTTF()
{
TTF_Init(); // Polices texte
char f_name[MAX_PATH]="";
strcat(f_name,repertoire); // Répertoire du programme
strcat(f_name, "\\arial.ttf");
policeBox = TTF_OpenFont(f_name, 14); // pour les titres des boites d'alerte
strcpy(f_name,repertoire);
strcat(f_name, "\\FUBB.ttf");
policeFUBB = TTF_OpenFont(f_name, 20); // pour le Jeu
FUBB40 = TTF_OpenFont(f_name, 40);
strcpy(f_name,repertoire);
strcat(f_name, "\\arial.ttf");
police3 = TTF_OpenFont(f_name, 20); // pour la liste (scores)
}
void Actualise()
{
Time++; // On incrémente notre référence de temps à chaque boucle (+20ms)
switch(phase)
{
case INTRO: // Cinématique d'introduction
break;
case JEU1:
basicPlay(); // Le JEU1 tourne
script1(); // scénario du niveau 1
if(NbAster==0) // passage Niveau 2 lorsque tous Aster détruits
{
if(Time-T1<25*50) setGain(20); // Bonus pour les rapides
setJeu2();
}
if(Time>50*50 && NbAster==1) setJeu2(); // Après un temps limite
break;
case JEU2:
basicPlay();
script2(); // scénario du niveau 2
break;
case JEU3:
basicPlay();
script3(); // scénario du niveau 3
break;
case JEU4:
basicPlay();
script4(); // scénario du niveau 4
break;
case FIN: // Partie perdue, vaisseau détruit
mouvAster(); // Fin du basicPlay : on ne garde que les astéroides en mouvement
break;
case GAG: // Partie gagnée
basicPlay();
break;
default:
break;
}
}
void gesFrame()
{
tempsActuel = SDL_GetTicks(); // Temps de fin d'éxécution (depuis début boucle)
if (tempsActuel - tempsPrecedent < t_frame)
{ // on rajoute un délai pour obtenir t_frame
SDL_Delay(t_frame - (tempsActuel - tempsPrecedent));
}
tempsPrecedent = SDL_GetTicks(); // Temps de fin de la boucle (= début de la suivante !)
}
void finPrg()
{
SDL_RemoveTimer(timer); // arret timer
freeImages();
}
void Affichage()
{
SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0)); // fond noir
switch (phase)
{
case INTRO: // Cinématique d'introduction
blit(creation,540,270);
static int alpha=0;
alpha++; // Transparence progressive du Fond
if(alpha>255) alpha=255;
SDL_SetAlpha(Fond1,SDL_SRCALPHA, alpha);
blit(Fond1,0,0);
if(alpha==255) blit_tr(titre,170,0,0,0,0);
if(Time>300) affPanel(); // Affichage Panneau de controle
affListe(listBox1);
if(listBox1->selInd==CLIC) blit_tr(arrow,606,362,252,252,253);
break;
case SET: // Ecran settings (TO DO)
break;
case JEU1: // Mêmes affichages pour les 4 Jeux
case JEU2:
case JEU3:
case JEU4:
affVaisseau();
affAstres();
affEnemi();
affBalles();
affDisplay();
break;
case FIN: // Partie perdue , vaisseau détruit
affAstres();
affJeu(); // Proposition de rejouer ou exit
if((Time/40)%2) blit_tr(echec,300, 200, 0, 0, 0);
if(F_exit) blit_tr(exito,1069, 512, 0, 0, 0);
else blit_tr(exito_s,1100, 540, 0, 0, 0);
if(F_rejouer) blit_tr(rejouer,836, 548, 0, 0, 0);
else blit_tr(rejouer_s,860, 560, 0, 0, 0);
break;
case HLP: // Ecran d'Aide
blit(Fond1,0,0);
blit_tr(Help,626, 30, 255, 0, 0);
break;
case SCR: // Affichage des scores
blit(Fond1,0,0);
blit(Scores,735, 40);
blit_tr(close,1200,25,255,255,255);
affScore();
break;
case GAG: // Partie gagnée
affVaisseau();
affAstres();
affJeu();
affBalles();
affDisplay();
aff_string("!!! MISSION : OK !!!", 10, 40, policeFUBB, SHADED, C_vert, C_noir, 0 );
if(F_exit) blit_tr(exito,1069, 512, 0, 0, 0);
else blit_tr(exito_s,1100, 540, 0, 0, 0);
if(F_rejouer) blit_tr(rejouer,836, 548, 0, 0, 0);
else blit_tr(rejouer_s,860, 560, 0, 0, 0);
if((Time/40)%2) blit_tr(coupe,270,10,0,0,0);
break;
}
SDL_Flip(ecran);
}
void gesClic()
{
switch (phase)
{
case INTRO:
if(listBox1->selInd == CLIC)
{ // Sélection à l'intérieur de la Box liste
gesBox(listBox1);
if(listBox1->selInd == LSET)
{
setChoix();
}
listBox1->selInd = LOFF;
}
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>189 && event.button.y<189+40) // changer
{
listBox1->selInd=CLIC;
}
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>314 && event.button.y<314+40) // aide
{
phase=HLP;
}
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>439 && event.button.y<439+40) // score
{
phase=SCR;
}
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>564 && event.button.y<564+40) // jouer
{
setJeu1();
}
break;
case SET:
break;
case GAG:
case FIN:
if(event.button.x>862 && event.button.x<1032 && event.button.y>562 && event.button.y<599) // Rejouer
{
setJeu1();
}
if(event.button.x>1116 && event.button.x<1235 && event.button.y>553 && event.button.y<622) // exit
{
phase=INTRO;
}
break;
case HLP:
if(event.button.x>1144 && event.button.x<1205 && event.button.y>32 && event.button.y<98) phase=INTRO;
break;
case SCR:
if(event.button.x>1200 && event.button.x<1252 && event.button.y>25 && event.button.y<25+52) phase=INTRO;
else if(event.button.x>745 && event.button.x<775 && event.button.y>590 && event.button.y<620)
{ // Sélection nouveau nom
TxtNom->saisie=1;
}
else TxtNom->saisie=0;
break;
default:
break;
}
}
void gesMotion()
{
switch (phase)
{
case INTRO:
if (listBox1->selInd == CLIC) gesBoxM(listBox1); //
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>189 && event.button.y<189+40)
{
if(F_son && !F_changer) PlaySound("bip", NULL, SND_RESOURCE | SND_ASYNC); // Windows (jouer un son en ressource)
F_changer=1;
}
else F_changer=0;
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>314 && event.button.y<314+40)
{
if(F_son && !F_aide) PlaySound("bip", NULL, SND_RESOURCE | SND_ASYNC);
F_aide=1;
}
else F_aide=0;
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>439 && event.button.y<439+40)
{
if(F_son && !F_score) PlaySound("bip", NULL, SND_RESOURCE | SND_ASYNC);
F_score=1;
}
else F_score=0;
if(event.button.x>1032 && event.button.x<1032+175 && event.button.y>564 && event.button.y<564+40)
{
if(F_son && !F_jouer) PlaySound("bip", NULL, SND_RESOURCE | SND_ASYNC);
F_jouer=1;
}
else F_jouer=0;
break;
case SET: //
break;
case GAG:
case FIN: // Gestion de la surbrillance des boutons
if(event.button.x>1116 && event.button.x<1235 && event.button.y>553 && event.button.y<622) F_exit=1;
else F_exit=0;
if(event.button.x>862 && event.button.x<1032 && event.button.y>562 && event.button.y<599) F_rejouer=1;
else F_rejouer=0;
break;
default:
break;
}
}
void gesKey()
{
switch(phase)
{
case SCR:
if(TxtNom->saisie) saisieTexte(TxtNom);
if(TxtNom->entree) setNom();
break;
default:
if (event.key.keysym.sym == SDLK_SPACE)
{
tir();
}
if (event.key.keysym.sym == SDLK_a) // touche q ! Moteur
{
Moteur=1;
}
if (event.key.keysym.sym == SDLK_r) // touche r : reset Niveau 1
{
setJeu1();
}
if (event.key.keysym.sym == SDLK_p) // touche p : pause
{
if(actif) actif=0;
else actif=1;
}
if (event.key.keysym.sym == SDLK_i) // touche i : Invincible !!
{
if(Invincible) Invincible=0;
else Invincible=1;
}
if (event.key.keysym.sym == SDLK_LEFT)
{
K_gauche=1;
}
if (event.key.keysym.sym == SDLK_RIGHT)
{
K_droite=1;
}
if (event.key.keysym.sym == SDLK_KP_PLUS) // saute au niveau suivant
{
niveauSup();
}
if (event.key.keysym.sym == SDLK_s) // coupe le son
{
if(F_son) F_son=0;
else F_son=1;
}
if (event.key.keysym.sym == SDLK_e) // exit
{
phase=INTRO;
}
break;
}
}
void upKey()
{
if (event.key.keysym.sym == SDLK_a)
{
Moteur=0;
Pousse=0;
}
if (event.key.keysym.sym == SDLK_LEFT)
{
K_gauche=0;
}
if (event.key.keysym.sym == SDLK_RIGHT)
{
K_droite=0;
}
}
void basicPlay()
{
mouvAster();
if(etatVaiss==ON) // Direction du vaisseau
{
if(K_gauche) angleVaiss=angleVaiss-0.04;
if(K_droite) angleVaiss=angleVaiss+0.04;
}
mouvVaiss();
mouvEnemi();
mouvBalles();
collBalle(); // Détections collisions
collBulle();
collAster();
collLaser();
if(etatVaiss==OFF && Time-t_dead>3*50) phase=FIN;
}