F1rush/src/voiture.c

338 lines
5.9 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];
Voiture voiture;
void init()
{
voiture.corridor = 2;
voiture.money = 0;
voiture.essence = 100;
voiture.distance = 0;
voiture.life = 1;
voiture.speed = 50;
voiture.decal_x = 24;
compteur = 0;
}
void update_essence()
{
voiture.essence -= 10;
}
void new_frame()
{
extern Image img_formel1;
extern Image img_obstacle;
int i,j;
dclear();
dimage(19, 11*voiture.corridor, &img_formel1);
dprint(1, 1, "%d", compteur);
dprint(57, 1, "e : %d", voiture.essence);
dprint(1, 57, "%d", RTC_id);
//dimage_part(1, 1, &img_obstacle, 10*7, 0, 10, 10);
if (voiture.essence == 0 || voiture.life == 0)
{
timer_stop(TIMER_USER); 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++;
}
int Jeu()
{
init(); // initialisation du Jeu
while(1)
{
timer_start(TIMER_USER, 15, Clock_Hz, new_frame, 0);
RTC_id = rtc_cb_add(RTCFreq_1Hz, update_essence, 0);
while(1)
{
key = getkey();
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;
}
}
}
}
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;
}
}
}
/*void garage(void)
{
unsigned char prix[5]={20,50,90,150,300};
unsigned char choice[2]={0,0};
int i;
char buffer[50];
char choix=0;
int j,k;
while(1)
{
Bdisp_AllClr_DDVRAM();
ML_bmp_or(IMG_GARAGE, 0, 0, 128, 64);
for(i=0;i<choice[0];i++)
{
ML_rectangle(58+9*i,33,62+9*i,37,1,1,2);
ML_display_vram();
}
for(i=0;i<choice[1];i++)
{
ML_rectangle(58+9*i,43,62+9*i,47,1,1,2);
ML_display_vram();
}
PrintMini(5,32+10*choix,"->",0);
sprintf(buffer,"argent %d prix %d" , 500, 500);
PrintMini(11,17,buffer,0);
GetKey(&key);
switch(key)
{
case KEY_CTRL_UP : case KEY_CTRL_DOWN : choix=(choix== 1 ? 0 : 1); break;
case KEY_CTRL_EXE : choice[choix]++; break;
case KEY_CTRL_EXIT : return ;
}
}
}*/
/*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;
}*/
// void mort()
// {
//
// dclear();
//
// while(key == KEY_NONE)
// {
// dtext(10,10,"Vous etes mort");
//
// key = getkey();
// }
//
// return;
// }
void init_obstacle()
{
int i=0,j=0;
char proba[10]={0,30,70,75,80,83,86,95,98,100};
while(j<9)
{
for(i=proba[j];i<proba[j+1];i++)
{
obstacles[i]=j;
}
j++;
}
//srand(RTC_getTicks());
for(i=0;i<4;i++)
{
obstacle[i].num_obst=obstacles[rand()%100];
obstacle[i].coordx=128+rand() % (128 - 30) + 30;
}
}
void draw_lines(int decalx)
{
int i,j;
for(i=1;i<4;i++)
{
for(j=0;j<128;j+=4)
{
dline(2*j-(decalx%4), i*11+10, 2*j+3-(decalx%4), i*11+10, Color_Black);
}
}
dline(1, 10, 128, 10, Color_Black);
dline(1, 54, 128, 54, Color_Black);
dupdate();
}