305 lines
5.6 KiB
C
305 lines
5.6 KiB
C
#include "voiture.h"
|
|
|
|
#include "display.h"
|
|
#include "tales.h"
|
|
#include "keyboard.h"
|
|
#include "stdio.h"
|
|
#include "clock.h"
|
|
#include "timer.h"
|
|
|
|
Obstacles obstacle[4]; // struture Obstacle & attributs
|
|
Voiture voiture; // structure Voiture & caracteristiques
|
|
|
|
void init()
|
|
{
|
|
|
|
voiture.corridor = 2;
|
|
voiture.money = 0;
|
|
voiture.essence = 100;
|
|
voiture.distance = 0;
|
|
voiture.life = 1;
|
|
voiture.speed = 50;
|
|
voiture.decal_x = 15;
|
|
compteur = 0;
|
|
|
|
for(int i = 0; i<4; i++)
|
|
{
|
|
obstacle[i].coordx = -20;
|
|
obstacle[i].num_obst = 1;
|
|
}
|
|
}
|
|
|
|
void update_essence()
|
|
{
|
|
voiture.essence -= 1;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
short menu=0;
|
|
|
|
extern Image img_menu;
|
|
|
|
while(1)
|
|
{
|
|
dclear();
|
|
|
|
dimage(0, 0, &img_menu);
|
|
dreverse_area(62+16*menu,23+21*menu,108+16*menu,39+21*menu);
|
|
|
|
dupdate();
|
|
|
|
key=getkey();
|
|
|
|
switch(key)
|
|
{
|
|
case KEY_UP : case KEY_DOWN : menu=!menu; break;
|
|
case KEY_EXE :
|
|
|
|
switch(menu)
|
|
{
|
|
case 0 : Jeu(); break;
|
|
case 1 : /*garage();*/ break;
|
|
}
|
|
break;
|
|
|
|
case KEY_EXIT : return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
int Jeu()
|
|
{
|
|
unsigned short RTC_id;
|
|
init(); // initialisation du Jeu
|
|
|
|
timer_start(TIMER_USER, 15, Clock_Hz, new_frame, 0);
|
|
RTC_id = rtc_cb_add(RTCFreq_1Hz, update_essence, 0);
|
|
|
|
while(1)
|
|
{
|
|
key = getkey();
|
|
|
|
if (voiture.life == 0)
|
|
{
|
|
key = KEY_EXIT;
|
|
}
|
|
|
|
switch(key)
|
|
{
|
|
case KEY_UP : voiture.corridor=(voiture.corridor<=1 ? 1 : voiture.corridor-1); break;
|
|
case KEY_DOWN : voiture.corridor=(voiture.corridor>=4 ? 4 : voiture.corridor+1); break;
|
|
case KEY_EXIT : timer_stop(TIMER_USER); rtc_cb_end(RTC_id); return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void new_frame()
|
|
{
|
|
extern Image img_formel1;
|
|
extern Image img_obstacle;
|
|
|
|
int i,j;
|
|
|
|
dclear();
|
|
|
|
dimage(voiture.decal_x, 11*voiture.corridor, &img_formel1);
|
|
dprint(1, 1, "%d", compteur);
|
|
//dprint(57, 1, "e : %d", voiture.essence);
|
|
dprint(1, 57, "%d", rand(0,101,compteur));
|
|
|
|
//Jauge d'essence
|
|
dline(25+voiture.essence/5, 58, 45, 58, Color_Black);
|
|
dreverse_area(24, 57, 46, 59);
|
|
|
|
//generation de chacun des obstacles
|
|
for(i=0; i<4; i++)
|
|
{
|
|
if(obstacle[i].coordx < -10)
|
|
{
|
|
generate_obstacle(i);
|
|
}
|
|
|
|
dimage_part(obstacle[i].coordx, 11*i+11, &img_obstacle, 10*obstacle[i].num_obst, 0, 10, 10);
|
|
obstacle[i].coordx--;
|
|
}
|
|
|
|
if (voiture.essence == 0)
|
|
{
|
|
voiture.life = 0;
|
|
}
|
|
|
|
if (voiture.life == 0)
|
|
{
|
|
dclear();
|
|
dtext(10,10,"Vous etes mort");
|
|
dtext(1,20,"Appuyez sur une touche");
|
|
dupdate();
|
|
return;
|
|
}
|
|
|
|
// dessin des lignes
|
|
for(i=1;i<4;i++)
|
|
{
|
|
for(j=compteur%2;j<128;j+=4)
|
|
{
|
|
dline(2*j, i*11+10, 2*j+3, i*11+10, Color_Black);
|
|
}
|
|
}
|
|
|
|
dline(1, 10, 128, 10, Color_Black);
|
|
dline(1, 54, 128, 54, Color_Black);
|
|
|
|
dupdate();
|
|
compteur++;
|
|
|
|
}
|
|
|
|
void mort()
|
|
{
|
|
dclear();
|
|
dtext(10,10,"Vous etes mort");
|
|
dupdate();
|
|
return;
|
|
}
|
|
|
|
void generate_obstacle(char ID_corridor)
|
|
{
|
|
unsigned char alea = rand(0, 100 ,compteur);
|
|
unsigned char proba[9]={30,40,5,5,3,3,9,3,2};
|
|
unsigned char i, sum;
|
|
|
|
dprint(15, 57, "%c", alea);
|
|
sum = 0;
|
|
i = 0;
|
|
|
|
while(sum<=alea)
|
|
{
|
|
sum+=proba[i];
|
|
i++;
|
|
}
|
|
|
|
obstacle[ID_corridor].num_obst = i;
|
|
obstacle[ID_corridor].coordx = 128 + rand(0, 20 ,compteur);
|
|
|
|
return;
|
|
}
|
|
|
|
int rand(int min, int max, int seed)
|
|
{
|
|
return ((++seed%2)*(--seed%50)+3)%(max-min) + min;
|
|
}
|
|
|
|
/*int Jeu()
|
|
{
|
|
|
|
extern Image img_formel1;
|
|
extern Image img_obstacle;
|
|
|
|
unsigned char decal=1;
|
|
short decalx_car=24;
|
|
int start_time=0;
|
|
int speed=50;
|
|
unsigned int i=0,j=0;
|
|
char appuie=0;
|
|
int score=0;
|
|
char vie=10;
|
|
int max=100;
|
|
int money=0;
|
|
short essence=100;
|
|
|
|
init_obstacle();
|
|
|
|
while(1)
|
|
{
|
|
dclear();
|
|
speed=(score%5==0 ? speed+1: speed);
|
|
draw_lines(i);
|
|
|
|
dimage(decalx_car-19, 11*decal, &img_formel1);
|
|
|
|
for(j=0;j<4;j++)
|
|
{
|
|
obstacle[j].coordx-=2+speed/25;
|
|
// ML_bmp_or(*(OBSTACLES+obstacle[j].num_obst), obstacle[j].coordx, 11*(j+1), 10, 10);
|
|
dimage_part(obstacle[j].coordx, 11*(j+1), &img_obstacle, 10*obstacle[j].num_obst, 10*obstacle[j].num_obst +10, 10, 10);
|
|
|
|
if(obstacle[j].coordx<0)
|
|
{
|
|
obstacle[j].num_obst=obstacles[rand()%100];
|
|
obstacle[j].coordx=128+40*j;
|
|
}
|
|
if(obstacle[0].num_obst==1 && obstacle[1].num_obst==1 && obstacle[2].num_obst==1 && obstacle[3].num_obst==1) obstacle[0].num_obst=0;
|
|
}
|
|
|
|
if(obstacle[decal-1].coordx<decalx_car && obstacle[decal-1].coordx>decalx_car-20 && obstacle[decal-1].num_obst>0)
|
|
{
|
|
switch(obstacle[decal-1].num_obst)
|
|
{
|
|
case 1 : if(vie==1)
|
|
{
|
|
mort(score, 0); return 1;
|
|
}
|
|
else vie--; break;
|
|
case 2 : speed+=25; break;
|
|
case 3 : speed-=25; break;
|
|
case 4 : vie++; break;
|
|
// case 5 : decalx_car=74; obstacle[decal-1].num_obst=0;break;
|
|
case 6 : essence=max; break;
|
|
case 7 : money++; break;
|
|
case 8 : money+=2; break;
|
|
}
|
|
|
|
// if(decalx_car==74 && (int)(RTC_getTicks()-start_time)>192)
|
|
// {
|
|
// decalx_car=24;
|
|
// }
|
|
|
|
obstacle[decal-1].num_obst=0;
|
|
}
|
|
if(essence<=0)
|
|
{
|
|
mort(score, 1);
|
|
return 1;
|
|
}
|
|
essence=(i%26==0 ? essence-10 : essence); //chaque seconde 10 d'essence partent
|
|
|
|
//dupdate();
|
|
dprint(1, 1, "metre : %d vie : %d", score, vie);
|
|
|
|
dprint(1,56,"essence %d/%d Argent %d ", essence, max, money);
|
|
|
|
timer_start(TIMER_USER, 80, Clock_Hz, vide, 0);
|
|
|
|
//while(1) {
|
|
|
|
if(key==KEY_UP && appuie==0) // KEY_CTRL_UP
|
|
{
|
|
decal=(decal<=1 ? 1 : decal-1);
|
|
appuie=1;
|
|
break;
|
|
}
|
|
else if(key==KEY_DOWN && appuie==0) //KEY_CTRL_DOWN
|
|
{
|
|
decal=(decal>=4 ? 4 : decal+1);
|
|
appuie=1;
|
|
break;
|
|
}
|
|
else if (key==KEY_NONE) // permet de ne pas rester appuiyer sur la touche (simule le Getkey())
|
|
{
|
|
appuie=0;
|
|
break;
|
|
}
|
|
if(key==KEY_EXIT) //KEY_CTRL_EXIT
|
|
{
|
|
timer_stop(TIMER_USER);
|
|
return 1;
|
|
}
|
|
//}
|
|
|
|
i+=3;
|
|
score=(i%4==0 ? score+2: score);
|
|
}
|
|
return 1;
|
|
}*/
|