supercasiobros/src/plateforme.c

116 lines
2.5 KiB
C

#include <plateforme.h>
#include <world.h>
#include <mario.h>
#include <tile.h>
#include <score.h>
#include <camera.h>
#include <level.h>
#include <gint/std/string.h>
#include <gint/std/stdlib.h>
#include <base.h>
int plateform_table_size=0;
plateform_t* plateformes=0;
void reset_plateforme(plateform_t* p)
{
p->b.x=p->xinit;
p->b.y=p->yinit;
}
void move_plateforme(plateform_t* p)
{
// Si mario et la plateforme vont se chevaucher, la plateforme est immobilisée
{
box_t b = p->b;
b.x+=b.vx;
b.y+=b.vy;
int x_collide= (mario.p.x<=b.x && b.x<mario.p.x+mario.p.w) || (mario.p.x<=b.x+b.w-1 && b.x+b.w<mario.p.x+mario.p.w);
int y_collide= (mario.p.y<=b.y && b.y<mario.p.y+mario.p.h) || (mario.p.y<=b.y+b.h-1 && b.y+b.h<mario.p.y+mario.p.h);
if (x_collide&&y_collide)
return;
}
box_t temp=p->b;
boxMove(&p->b);
// Si mario est sur la plateforme, il bouge avec
if (((mario.p.x<p->b.x+p->b.w && mario.p.x>=p->b.x) || (mario.p.x+mario.p.w<p->b.x+p->b.w && mario.p.x+mario.p.w>=p->b.x)) && (mario.p.y-3==p->b.y))
{
box_t mario_clone=mario.p;
mario_clone.vx=temp.vx;
mario_clone.vy=temp.vy;
boxMove(&mario_clone);
mario.p.x=mario_clone.x;
mario.p.y=mario_clone.y;
}
if (p->b.vx==0)
{
p->b.vx=-temp.vx;
//p->b.x -= sgn(p->b.vx);
}
if (p->b.vy==0)
p->b.vy=-temp.vy;
}
void platformsDraw()
{
if (plateformes==0 || plateform_table_size==0)
return;
plateform_t * p=0;
for (int i=0; i<plateform_table_size; i++)
{
p=&plateformes[i];
for (int j=p->b.x; j < p->b.x+p->b.w; j+=3)
tileDraw(j-cameraX(),p->b.y-cameraY(), &tplateforme, 0,0);
//drect(p->b.x-worldGetCell_real_x0(),64-(p->b.y-worldGetCell_real_y0()),p->b.x-worldGetCell_real_x0()+p->b.w,64-(p->b.y-worldGetCell_real_y0()-3), C_BLACK);
}
}
void platformsMove()
{
if (plateformes==0 || plateform_table_size==0)
return;
plateform_t * p=0;
for (int i=0; i<plateform_table_size; i++)
{
p=&plateformes[i];
move_plateforme(p);
}
}
int platformsCollisionTest(int x, int y)
{
if (plateformes==0 || plateform_table_size==0)
return 0;
for (int i=0; i<plateform_table_size; i++)
{
plateform_t * p=&plateformes[i];
if (p->b.x<=x && p->b.x+p->b.w>x && p->b.y<=y && p->b.y+3>y)
return 1;
}
return 0;
}
void platformsInit(plateform_t * table, int s)
{
plateform_table_size=0;
if (plateformes)
{
freeProf(plateformes);
plateformes=0;
}
if (0==table)
return;
int size=sizeof(plateform_t)*s;
plateformes=mallocProf(size);
if (plateformes==0)
mallocError();
plateform_table_size=s;
memcpy(plateformes, table, size);
}