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
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.