top of page


//--------------------------------------------------------------------------------------------
//                                  * 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;
}

 

  Page précédente                                                                                                                           Sommaire                                                                                                                                                  Page suivante

bottom of page