Semi solids

This commit is contained in:
KikooDX 2020-05-13 18:19:11 +02:00
parent 9e54400031
commit 2d9c826839
3 changed files with 13 additions and 9 deletions

View File

@ -1,5 +1,6 @@
char collide(int x, int y, char level[], char tile);
char collide_spike(int x, int y, char level[]);
char collide_solid(int x, int y, char level[], char polarity, int rvspd);
char collide_solid(int x, int y, char level[], char polarity,
char test_semi_solid);
char collide_point(int x, int y, char level[], char tile);
char collide_and_erase(int x, int y, char level[], char tile);

View File

@ -27,15 +27,16 @@ char collide_point(int x, int y, char level[], char tile)
return (level[(int)(x/16) + (int)(y/16) * LEVEL_WIDTH] == tile);
}
char collide_solid(int x, int y, char level[], char polarity, int rvspd)
char collide_solid(int x, int y, char level[], char polarity,
char test_semi_solid)
{
char collided;
if (polarity) collided = collide(x, y, level, 'b');
else collided = collide(x, y, level, 'r');
if (!collided && rvspd > 0)
if (!collided && test_semi_solid && ((y + PLAYER_H) % 16) <= 5)
{
collided = (collide_point(x, y + PLAYER_H, level, 's') ||
collide_point(x + PLAYER_W, y + PLAYER_H, level, 's'));
collided = (collide_point(x, y + PLAYER_H, level, '/') ||
collide_point(x + PLAYER_W, y + PLAYER_H, level, '/'));
}
return (collided ||
collide(x, y, level, '0') ||

View File

@ -110,14 +110,15 @@ int main(void)
trunc_hspd = hspd * direction;
if (1) //glue was here
{
if (!collide_solid(player_x + trunc_hspd, player_y, level, polarity, vspd))
if (!collide_solid(player_x + trunc_hspd, player_y, level, polarity, 0))
{
player_x += trunc_hspd;
}
else
{
int sign_hspd = sgn(trunc_hspd);
while (!collide_solid(player_x + sign_hspd, player_y, level, polarity, vspd))
while (!collide_solid(player_x + sign_hspd, player_y, level, polarity,
0))
{
player_x += sign_hspd;
}
@ -126,7 +127,7 @@ int main(void)
}
}
//ground detection
if (vspd >= 0 && collide_solid(player_x, player_y + 1, level, polarity, vspd))
if (vspd >= 0 && collide_solid(player_x, player_y + 1, level, polarity, 1))
{
on_ground = 6;
vspd = 0;
@ -181,7 +182,8 @@ int main(void)
}
if (trunc_vspd)
{
if (!collide_solid(player_x, player_y + trunc_vspd, level, polarity, vspd))
if (!collide_solid(player_x, player_y + trunc_vspd, level, polarity,
trunc_vspd > 0))
{
player_y += trunc_vspd;
}