Jeu en allegro "mr hankey fête noël"

Contenu du snippet

Mr Hankey est un jeu d'adresse, il faut réussir à lancer la balle (Mr Hankey) dans la cible (la cuvette des toilettes). Chaque lancé est obtenu grâce à un angle et une vitesse que le joueur a définit.

Source / Exemple :


/*############################################################################
  #                                                                          #
  #            Mr Hankey fête noel (Allegro      Art numérique)              #
  #            Par Bibise                                          #
  #            Etudiant numéro : 155726                                      #
  #                                                                          #
  ############################################################################*/  

 

#include "allegro.h"
#include <math.h> 
#include <time.h>

//------------------------------------------------------------------------------
// Initialisation des defines
//------------------------------------------------------------------------------

#define PI 3.14
#define angle 45    //en degré
#define vitesse 50 //en ms
#define N 2000
#define M 10

//------------------------------------------------------------------------------
// Initialisation des variables
//------------------------------------------------------------------------------

BITMAP *buffer;
BITMAP* balle,*chiote,*back,*boule;

float teta=angle;
char sens_vitesse=0;
char sens_angle=0;
char stop_vitesse=0;
char stop_angle=0;      
float xe,ye;
float vx,vy;
float x,y ; //variable indiquant l'endroit où l'objet est lancé 
float vo=vitesse; // vitesse initial du projectile
float m=1;  // Masse du projectile 
int score=0;
int rot=0;
char a=1;
char timer_on=0;
volatile fps, frame_count, timer;//variable des frames et du timer
volatile int tim = 1;
volatile int timold=0;
int j;
int i=0;

float tempx[N];//tableau mémorisant la position des flocons en x
float tempy[N];//tableau mémorisant la position des flocons en y
float temp_taille[N];//tableau mémorisant la taille des flocons
float tabx[N];//tableau de la position des flocons en x
float taby[N];//tabelau de la position des flocons en y
float vit[N];//tabelau de la vitesse des flocons
int taille_f[N];//tabelau de la taille des flocons
float tabxe[M];//tableau mémorisant la position de la balle en x
float tabye[M];//tableau mémorisant la position de la balle en x

//------------------------------------------------------------------------------
// Initialisation des la fonctions
//------------------------------------------------------------------------------

int init_affichage();//implantation des images dans les variables
void affichage();//affichage ddu décore
void inc_barre();//fonction controlant les barres de vitesses et d'angles  
void flocon();//Fonction créant les flocans
//Fonction qui calcul les coordonées de la balle
int pointcalcul(float vi,float x,float y,float alpha);
void touche();//Fonction des touches actives

//------------------------------------------------------------------------------
// Fonction calculant les frames par seconde
//------------------------------------------------------------------------------

void fps_proc()
{
  fps=frame_count;
  frame_count=0;
}
END_OF_FUNCTION(fps_proc);

//------------------------------------------------------------------------------
// Fonction du timer
//------------------------------------------------------------------------------

void inc_x(void)
{
   tim++;
}

END_OF_FUNCTION(inc_x);

//------------------------------------------------------------------------------
// Fonction principal
//------------------------------------------------------------------------------
        
int main(void){   
           
   allegro_init(); 
   install_timer(); 
   install_keyboard ( );
   text_mode(-1); 
   srand(time(NULL));
   
  
 set_color_depth(16) ;
  

    if(set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 ) < 0 )
    {
        set_gfx_mode    ( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message ( "Ce programme ne peut pas etre initialise!\n" );
        exit( 1 );
    }
    
  install_int(fps_proc,1000);
  LOCK_VARIABLE(fps);
  LOCK_VARIABLE(frame_count);
  LOCK_FUNCTION(fps_proc);
  install_int_ex(inc_x, BPS_TO_TIMER(90)); 
  LOCK_VARIABLE(tim);
  LOCK_VARIABLE(timold);
  LOCK_FUNCTION(inc_x);
      
    
    init_affichage();
 

      while(!key[KEY_ESC]) { 
          
       if(timold<tim){
              
        clear(buffer);
        draw_sprite(buffer, back, 0, 0 );
        if(timer_on==1){
        timold=tim;
        textprintf(buffer,font,SCREEN_W-150,SCREEN_H-10,makecol(65000,65000,65000),"timer");
        }
        else if(timer_on==0){
            timold=0;
            tim=1;
            }
                  
     xe=100;
     ye=SCREEN_H-50;
     rot=0;
     inc_barre();//lance la fonction qui augmente les valeurs forces et angle  
     affichage();//affiche tout le décors
     touche(); //active les touches             
         
    if (stop_vitesse==1&stop_angle==1){//si la touche haut et bas ont été appuyé
         
        stop_vitesse=0;
        stop_angle=0;
        
        pointcalcul(vo,0,0,teta);//lancer du projectil avec une vitesse 
                                 //et un angle
        
        textprintf(buffer, font,  300,15, makecol(65000,0,0),"score = %d !",score);        
           
            }
        
        blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
        release_screen();
        frame_count++;//on compte une image    
            }  
                      
 }    
 //on libére la mémoire
    destroy_bitmap(buffer);
    destroy_bitmap(balle);
    destroy_bitmap(chiote);
    destroy_bitmap(back);
    destroy_bitmap(boule);
    return 0; 
    
      }                                               
END_OF_MAIN();

//------------------------------------------------------------------------------
// Fonction affichant et créant les flocons
//------------------------------------------------------------------------------

void flocon()
{

  for(j=0;j<N;j++){//tant que j est plus petit que le nombre de flocon
      
             
         //réinitialisation de la positions des flocons        
        if (taby[j]>rand()%50+550){ //si les flocons atteignent une valeur donnée 
              
              if(j%4==2){//on mémorise ce flocon
            tempx[j]=tabx[j];//mémorise la position x
            tempy[j]=taby[j];//mémorise la position y
            temp_taille[j]=taille_f[j];//mémorise la taille
                   } 
              
              //on leur attribu une nouvelle valeur
              taille_f[j]=rand()%15 ;//taille du flocon
              tabx[j]=rand()%800;   //position x du flocon
              taby[j]=rand()%550;   //position y du flocon
              vit[j]=0.02; //vitesse initial du flocon
              
              
               
           }
              
          taby[j]=taby[j]+vit[j];//on incrémente la vitesse de chaque flocon
          vit[j]+=0.001;
           
                
           
         //affichage du flocon suivant ça position et ça taille
          stretch_sprite(buffer, boule,tabx[j]-boule->w/2 , taby[j]-boule->h/2, 
          taille_f[j], taille_f[j]);
         //affcihage des flocons au sol 
          stretch_sprite(buffer, boule,tempx[j]-boule->w/2 , tempy[j]-boule->h/2, 
          temp_taille[j], temp_taille[j]);
          } 
}    

//------------------------------------------------------------------------------
// Fonction calculant les coordonnées de laballe suivant la vitesse et l'angle
//------------------------------------------------------------------------------

int pointcalcul(float vi,float x,float y,float alpha)
{       
        
    
        float dt=0.1;
        float g=9.81;        
        vx=vi*cos(alpha/180*PI); 
        vy=vi*sin(alpha/180*PI);
        
       while(1){
        if(timold<tim){
        draw_sprite(buffer, back, 0, 0 );
        
        if(timer_on==1){
        timold=tim;
        textprintf(buffer,font,SCREEN_W-150,SCREEN_H-10,makecol(65000,65000,65000),"timer");
        }
        else if(timer_on==0){
            timold=0;
            tim=1;
            }
        if (y<0) {//si la balle touche le sol
            
            tabxe[i]=xe;//on mémorise la position x de la balle
            tabye[i]=ye;//on mémorise la position y de la balle
            i++;
            if(i>=M) {
                i=0;
             }    
            
            return 1;}
        
        //si la balle touche la cuvette des toilettes
        if ((xe+balle->w/2>SCREEN_W-chiote->w && ye+balle->h/2>SCREEN_H-chiote->h/2)
        && xe+balle->w/2<SCREEN_W-chiote->w/2+20 ){
            score++;//on augmente le score
            
            return 1;}

        //initialisation du calcul avec des angles en degrés
       
        x+=vx*dt;
        y+=vy*dt;
        vy-=g*m*dt;
        
        xe=100+x;
        ye=SCREEN_H-50-y;
        rot+=2;
        
        affichage() ;//afichage du décors
        acquire_screen();   
        blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
        release_screen();
        frame_count++;    
            
            }}
       
                   
return 0;

}

//------------------------------------------------------------------------------
// Fonction incréméntant la vitesse et l'angle
//------------------------------------------------------------------------------

void inc_barre(){
     if (stop_angle==0){ 
       if (sens_angle==0){//si sens angle est égale à 0        
                teta+=0.8;//on incrémente l'angle
                if (teta>=90)//si l'angle est plus grand que 90
                     sens_angle=1;}//on passe le sens à 1
                     
        if (sens_angle==1){//si le sens angle est égale à 1
                teta-=0.8;//on décrémente l'angle
                if (teta<=0)//si l'angle est plus petit que 0
                    sens_angle=0;} //on passe le sens à 0
                }    
          
    if(stop_vitesse==0){    
       if (sens_vitesse==0){//si sens vitesse est égale à 0        
                vo+=0.8;//on incrémente la vitesse
                if (vo>=100)//si la vitesse est plus grand que 100
                     sens_vitesse=1;}//on passe le sens vitesse à 1
       if (sens_vitesse==1){//si le sens vitesse est égale à 1
                vo-=0.8;//on décremente la vitesse
                if (vo<=0)//si la vitesse est inférieur à 0
                    sens_vitesse=0;}//on passe le sens à 0
       }    
}  

//------------------------------------------------------------------------------
// Fonction qui affiche le décors
//------------------------------------------------------------------------------

void affichage(){
    
    
    for(j=0;j<M;j++){
       rotate_sprite(buffer, balle, tabxe[j]-balle->w/2, tabye[j]-balle->h/2,itofix(90) );
       }
       
      rectfill(buffer,50,5,50+(int)vo+(int)vo,30,makecol(0,0,65500));
       textprintf(buffer, font,  140,15, makecol(65000,0,0),"force = %d",(int)vo);      

       rectfill(buffer,50,35,50+(int)teta+(int)teta,60,makecol(65000,0,10000));
       textprintf(buffer, font,  140,45, makecol(65000,0,0),"%angle = %d",(int)teta);
   

        textprintf(buffer, font,  300,15, makecol(65000,0,0),"score = %d",score);
        
        
        draw_sprite(buffer, chiote, SCREEN_W-chiote->w, SCREEN_H-chiote->h ); 
        rotate_sprite(buffer, balle, xe-balle->w/2, ye-balle->h/2, itofix(rot) );
         
       flocon();
     
      textprintf(buffer,font,SCREEN_W-60,SCREEN_H-10,makecol(65000,65000,65000),"Fps:%i",fps);
  } 

//------------------------------------------------------------------------------
// Fonction qui gére les touche active
//------------------------------------------------------------------------------
  
void touche(){
        if(key[KEY_UP]){stop_vitesse=1;}
   if(key[KEY_DOWN]){stop_angle=1;}   
   if(key[KEY_ENTER]&&timer_on==0){
       timer_on=1;
       }  
       else
        if( key[KEY_ENTER]&&timer_on==1){
           timer_on=0;}
} 
//------------------------------------------------------------------------------
// Fonction qui initialise le décors
//------------------------------------------------------------------------------
int init_affichage(){
        buffer = create_bitmap (SCREEN_W,SCREEN_H);
    if (! buffer){
        set_gfx_mode(GFX_TEXT,0,0,0,0);
        allegro_message("erreur");
        allegro_exit();
    }
    
    balle = load_bitmap("balle2.bmp",NULL);
    if(!balle) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Erreur ! Impossible de lire le fichier image balle !");
        return 1;
    }    
    chiote = load_bitmap("chiote.bmp",NULL);
    if(!chiote) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Erreur ! Impossible de lire le fichier image chiote !");
        return 1;
    }     
    back = load_bitmap("neige.bmp",NULL);
    if(!back) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Erreur ! Impossible de lire le fichier image neige !");
        return 1;
                    
}    
boule = load_bitmap("boule.bmp",NULL);
    if(!back) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Erreur ! Impossible de lire le fichier image boule !");
        return 1;}
       
        for(j=0;j<M;j++){//initailisation du tableau de sauvegarde 
                         // des positions de la balles
            tabxe[j]=1000;
            tabye[j]=1000;
}    
         for(j=0;j<N;j++){//initialisation des position des flocons
            tabx[j]=rand()%800;
            taby[j]=rand()%550;
        }                            
                                                           
 
}

Conclusion :


La touche « flèche du Haut » donne la force du lancé, la touche « flèche du bas » donne l'angle du lancé. La touche ENTER active ou désactive le timer.

Le fichier est trop volumineux vous trouverez l'executable , les textures et le code source sources sur http://cyberfou.club.fr/art/art.rar

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.