From fae77016d537fe5b24d0a4271119434155f14180 Mon Sep 17 00:00:00 2001 From: Milang Date: Fri, 7 Feb 2020 10:40:24 +0100 Subject: [PATCH] add a new camera system (experimental) --- src/camera.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/camera.c b/src/camera.c index 51b7682..9b7f515 100644 --- a/src/camera.c +++ b/src/camera.c @@ -6,13 +6,71 @@ static int y=0; int camera_x() {return min(max(mario.p.x-40,0),map_current->w*8-128);} -int camera_y() {return max(y-24,0);} +int camera_y() {return max(y-32,0);} -void camera_move(int delay) +static int immobile=0; +static int last_vy=0; + +static int distance=0; + +void camera_move(int delay) // movement vertical seulement { - if (delay<=0) - delay=3; // on ajoute 1/3 de la distance camera mario - y+=(mario.p.y-y)/delay; +/* static int is_moving=0; + static int ref_y=0; + if (mario.p.y-camera_y()<16 || mario.p.y-camera_y()>56) + { + is_moving=1; + ref_y=mario.p.y; + } + if (is_moving) + { + for (int i=0; i<9; i++) + y+=sgn(mario.p.y-y); + if (y==ref_y) + is_moving=0; + } +*/ + static int camera_vy=0; + if (mario.p.y==last_vy) // mario arrêté + immobile++; + else + { + last_vy=mario.p.y; + immobile=0; + } + if (mario.p.y-camera_y()-mario.p.h<16 || mario.p.y-camera_y()>54) + { + 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; + + } + last_vy=mario.p.y; } void camera_adjust()