Change order of collision detection for better movement

This commit is contained in:
Juhani Krekelä 2022-01-16 15:42:45 +00:00
parent ad127dcf4f
commit bd276afa18
1 changed files with 39 additions and 39 deletions

View File

@ -155,25 +155,25 @@ static char *stages[] = {
" ! "
" ggg ",
" "
" C N"
" "
" "
" "
" "
" "
" "
" "
" "
" ",
" "
" "
" "
" "
" "
" "
" "
" "
" "
" ",
" B 3 "
" 2 3 "
"1 3 1"
" 12"
"@ 1 123"
"A1 123!"
"1 123g",
"@d B12 C"
"A 12 "
"11gggggggg"
" D"
"gg44444444"
" 22 "
" 2 "
" 2 2"
" 2!"
" 333333",
};
enum switches_state { ALL_OFF, SWITCH1, SWITCH2, SWITCH3, SWITCH4 };
@ -395,27 +395,6 @@ static void update_stage(struct timespec now, struct timespec dt_timespec) {
// Collision against tiles
size_t px = player_x;
size_t py = player_y;
size_t left_cx = px - 1;
size_t right_cx = px + TILE_SIDE;
size_t leftright_top_cy = py;
size_t leftright_bottom_cy = py + TILE_SIDE - 3; //XXX: proper handling of snapping
if ((solid_tile(left_cx, leftright_top_cy) ||
solid_tile(left_cx, leftright_bottom_cy)) &&
player_dx < 0) {
size_t snapped_px = (px + TILE_SIDE - 1) / TILE_SIDE * TILE_SIDE;
player_x = snapped_px;
player_dx = 0;
}
if ((solid_tile(right_cx, leftright_top_cy) ||
solid_tile(right_cx, leftright_bottom_cy)) &&
player_dx > 0) {
size_t snapped_px = px / TILE_SIDE * TILE_SIDE;
player_x = snapped_px;
player_dx = 0;
}
px = player_x;
py = player_y;
size_t topbottom_left_cx = px + 1;
size_t topbottom_right_cx = px + TILE_SIDE - 1 - 1;
size_t top_cy = py - 1;
@ -440,6 +419,27 @@ static void update_stage(struct timespec now, struct timespec dt_timespec) {
jump_start_y = player_y + jump_maxheight;
}
px = player_x;
py = player_y;
size_t left_cx = px - 1;
size_t right_cx = px + TILE_SIDE;
size_t leftright_top_cy = py;
size_t leftright_bottom_cy = py + TILE_SIDE - 3; //XXX: proper handling of snapping
if ((solid_tile(left_cx, leftright_top_cy) ||
solid_tile(left_cx, leftright_bottom_cy)) &&
player_dx < 0) {
size_t snapped_px = (px + TILE_SIDE - 1) / TILE_SIDE * TILE_SIDE;
player_x = snapped_px;
player_dx = 0;
}
if ((solid_tile(right_cx, leftright_top_cy) ||
solid_tile(right_cx, leftright_bottom_cy)) &&
player_dx > 0) {
size_t snapped_px = px / TILE_SIDE * TILE_SIDE;
player_x = snapped_px;
player_dx = 0;
}
// Touching tiles
size_t midpoint_x = player_x + TILE_SIDE / 2;
size_t midpoint_y = player_y + TILE_SIDE / 2;