supercasiobros/src/camera.c

86 lines
1.3 KiB
C
Raw Normal View History

2020-01-29 14:34:57 +01:00
#include <camera.h>
2020-02-17 18:43:16 +01:00
2020-01-29 14:34:57 +01:00
#include <mario.h>
#include <world.h>
#include <base.h>
static int y=0;
int cameraX() {return min(max(mario.p.x-40,0),map_current->w*8-128);}
int cameraY() {return max(y-32,0);}
2020-01-29 14:34:57 +01:00
2020-02-07 10:40:24 +01:00
static int immobile=0;
static int last_vy=0;
static int distance=0;
void cameraMove() // movement vertical seulement
2020-01-29 14:34:57 +01:00
{
/* static int isMoving=0;
2020-02-07 10:40:24 +01:00
static int ref_y=0;
if (mario.p.y-cameraY()<16 || mario.p.y-cameraY()>56)
2020-02-07 10:40:24 +01:00
{
isMoving=1;
2020-02-07 10:40:24 +01:00
ref_y=mario.p.y;
}
if (isMoving)
2020-02-07 10:40:24 +01:00
{
for (int i=0; i<9; i++)
y+=sgn(mario.p.y-y);
if (y==ref_y)
isMoving=0;
2020-02-07 10:40:24 +01:00
}
*/
2020-02-07 10:40:24 +01:00
static int camera_vy=0;
if (mario.p.y==last_vy) // mario arrêté
immobile++;
else
2020-02-07 10:40:24 +01:00
{
last_vy=mario.p.y;
immobile=0;
}
if (mario.p.y-cameraY()-mario.p.h<16 || mario.p.y-cameraY()>54)
2020-02-07 10:40:24 +01:00
{
y+=5*sgn(mario.p.y-y);
}
if (immobile>=2)
{
//y+=(mario.p.y-y)/3;
if (camera_vy==0)
{
distance=2*(mario.p.y-y)*sgn(mario.p.y-y);
}
//décéleration après avoir parvouru la moitié de la distance, sinon acceleration
if (camera_vy*(camera_vy+1)>distance)
camera_vy--;
else
camera_vy++;
//y++;
if (camera_vy<0)
camera_vy=0;
if (((y+camera_vy*sgn(mario.p.y-y)/2)-(mario.p.y))*sgn(mario.p.y-y)>0)
{
y=mario.p.y;
camera_vy=0;
}
else
y+=(camera_vy*sgn(mario.p.y-y))/2;
2020-02-07 10:40:24 +01:00
}
last_vy=mario.p.y;
2020-01-29 14:34:57 +01:00
}
void cameraAdjust()
2020-01-29 14:34:57 +01:00
{
y=mario.p.y;
}
void cameraReset()
2020-01-29 14:34:57 +01:00
{
y=0;
}