Improved jump system & elevator.

This commit is contained in:
KikooDX 2020-02-13 14:41:24 +01:00
parent 85564f45d0
commit 88a548372d
2 changed files with 35 additions and 24 deletions

Binary file not shown.

View File

@ -7,11 +7,15 @@
#include "player.h"
#define WALK_SPD 1
#define MIN_VSPD -8.0
#define JUMP_SPD -3.4
#define MIN_VSPD -6.0
#define MAX_VSPD 6
#define JUMP_SPD -3.2
#define GRAV 0.2
#define JUMP_SCALE 12
#define JUMP_REDUCTION -0.1
#define UG_CAN_JUMP upgrades[0]
void dupdate(); //gint function
void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold); //test if jump pressed
int sgn(int number); //return the sign of input double
@ -72,7 +76,7 @@ int main(void)
if (vspd >= 0 && collide_solid(player_x, player_y + 1, level)) on_ground = 6;
else
{
if (vspd > MIN_VSPD) vspd += GRAV;
if (on_ground != 6 && vspd < MAX_VSPD) vspd += GRAV;
if (on_ground) on_ground--;
}
//vertical movement
@ -81,30 +85,43 @@ int main(void)
if (jump_buffer && on_ground) {
vspd = JUMP_SPD;
on_ground = 0;
jump_hold = 10;
jump_hold = JUMP_SCALE;
}
else if (jump_hold && keydown(KEY_SHIFT))
{
jump_hold--;
vspd -= GRAV / 2;
vspd += JUMP_REDUCTION;
}
else jump_hold = 0;
//elevator collision and raise
if ((collide(player_x - 1, player_y, level, '^') ||
collide(player_x + 1, player_y, level, '^')) && vspd > MIN_VSPD)
{
if (vspd > -1)
{
vspd -= GRAV;
}
vspd -= GRAV;
}
//vertical collision
{
int trunc_vspd = vspd; //truncate vspd
if (!collide_solid(player_x, player_y + trunc_vspd, level))
{
player_y += trunc_vspd;
}
else
{
int sign_vspd = sgn(trunc_vspd);
while (!collide_solid(player_x, player_y + sign_vspd, level))
{
player_y += sign_vspd;
}
vspd = 0;
}
if (trunc_vspd)
{
if (!collide_solid(player_x, player_y + trunc_vspd, level))
{
player_y += trunc_vspd;
}
else
{
int sign_vspd = sgn(trunc_vspd);
while (!collide_solid(player_x, player_y + sign_vspd, level))
{
player_y += sign_vspd;
}
vspd = 0;
}
}
}
//spike collision and death
if (collide(player_x, player_y, level, 'v'))
@ -113,12 +130,6 @@ int main(void)
player_y = start_y;
vspd = 0;
}
//elevator collision and raise
if (collide(player_x - 1, player_y, level, '^') ||
collide(player_x + 1, player_y, level, '^'))
{
if (vspd < 8) vspd -= GRAV;
}
//borders collision
if (player_x <= 11)
{