X-Git-Url: http://royale.zerezo.com/git/?p=zeRace;a=blobdiff_plain;f=car.c;fp=car.c;h=e7695679378fdea163073f0450659411494c28ff;hp=0000000000000000000000000000000000000000;hb=dde2df6289f6daf23ee1632560c4c89061ef2f4a;hpb=866e35b81c26169886388f7c93dce52f2a42809f diff --git a/car.c b/car.c new file mode 100644 index 0000000..e769567 --- /dev/null +++ b/car.c @@ -0,0 +1,84 @@ +#include "car.h" + +#define COEFF 1 + +void move_car(struct _car *car,int keys,SDL_Surface *fun) +{ + int c,r,g,b; + + /* reset flags */ + car->lapflag=0; + car->crashflag=0; + + /* get the pixel color under the center of car in the function map */ + c=getpixel(fun,car->x,car->y); + /* red layer (checkpoints) */ + r=(c )&0xff; + /* green layer (road quality) */ + g=(c>>8 )&0xff; + /* blue layer (unused) */ + b=(c>>16)&0xff; + + if (keys & 8) /* up */ + car->speed+=0.01*2*COEFF; + if (keys & 4) /* down */ + car->speed-=0.01*COEFF; + if (keys & 2) /* left */ + { + if (car->speed<0) + car->angle+=0.01*(255-b)/255*COEFF; + else + car->angle-=0.01*(255-b)/255*COEFF; + } + if (keys & 1) /* right */ + { + if (car->speed<0) + car->angle-=0.01*(255-b)/255*COEFF; + else + car->angle+=0.01*(255-b)/255*COEFF; + } + + /* limit angle between 0 and 2*pi */ + if (car->angle<0) car->angle+=2*M_PI; + if (car->angle>2*M_PI) car->angle-=2*M_PI; + + /* update the speed depending on the road quality */ + car->speed-=car->speed*(255-g)/1000; + + /* if it is a wall we move back to the last position */ + if (g==0) + { + car->x=car->ox; + car->y=car->oy; + car->crashflag=1; + } + + /* save the old position and compute the new one */ + car->ox=car->x; + car->oy=car->y; + car->speed*=0.995; + car->x-=cos(car->angle)*car->speed; + car->y-=sin(car->angle)*car->speed; + + /* collision with the border of the screen */ + if (car->xw/2 || car->x>fun->w-car->w/2 || car->yh/2 || car->y>fun->h-car->h/2) + { + car->x=car->ox; + car->y=car->oy; + car->speed=0; + car->crashflag=1; + } + + /* if we are on the next checkpoint, validate it (no missing allowed) */ + if (r/8==car->lastcheck+1) car->lastcheck++; + /* if we validate all and start over, we complete a turn */ + if (r/8==0 && car->lastcheck==31) + { + /* reset turn variables */ + car->lastcheck=0; + car->lap++; + car->lapflag=1; + } + + return; +}