diff options
Diffstat (limited to 'src/player.odin')
| -rw-r--r-- | src/player.odin | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/src/player.odin b/src/player.odin index e098167..1dd79ae 100644 --- a/src/player.odin +++ b/src/player.odin @@ -2,7 +2,6 @@ package demonchime import "core:fmt" import "core:math" -import "core:math/linalg" import sapp "shared:sokol/app" @@ -13,11 +12,12 @@ Player :: struct { vel: Vec2, anim: draw.Animation, sprite: draw.Sprite, + on_floor: bool } PLAYER_SPEED :: 100 PLAYER_ACCEL :: 10 -PLAYER_JUMP_FORCE :: 300 +PLAYER_JUMP_FORCE :: 350 init_player :: proc(p: ^Player) { p.pos = Vec2{50, 50} @@ -58,7 +58,7 @@ update_player :: proc(p: ^Player, dt: f32) { draw.set_sprite_active_tag(&p.sprite, "down_idle") } - if is_keybind_down(state.input, state.input.jump) && p.pos.y >= 256 { + if is_keybind_down(state.input, state.input.jump) && p.on_floor { p.vel.y = -PLAYER_JUMP_FORCE } @@ -69,18 +69,52 @@ update_player :: proc(p: ^Player, dt: f32) { ) p.vel.y = math.min(p.vel.y + GRAVITY * dt, TERMINAL_VELOCITY) - p.pos += p.vel * dt - - if p.pos.y > 256 { - p.pos.y = 256 - p.vel.y = 0 + res_pos := p.pos + p.vel * dt + + rect_size := Vec2{f32(p.sprite.width), f32(p.sprite.height)} + rect_offset := Vec2{-rect_size.x / 2, -rect_size.y} + + rect := Rect{ + res_pos + rect_offset, + rect_size, } + p.on_floor = false + + iter := iter_entity_list(state.platform_list) + for plat in entity_list_iter(&iter) { + if aabb(rect, plat.rect) { + prev_rect := Rect{ + p.pos + rect_offset, + rect_size, + } + if aabb_hori(prev_rect, plat.rect) { + if p.vel.y > 0 { + res_pos.y = plat.rect.start.y - rect.size.y - rect_offset.y + p.on_floor = true + } else { + res_pos.y = plat.rect.start.y + plat.rect.size.y - rect_offset.y + } + p.vel.y = 0 + } else if aabb_vert(prev_rect, plat.rect) { + if p.vel.x > 0 { + res_pos.x = plat.rect.start.x - rect.size.x - rect_offset.x + } else { + res_pos.x = plat.rect.start.x + plat.rect.size.x - rect_offset.x + } + p.vel.x = 0 + } + } + } + + p.pos = res_pos + p.sprite.pos = p.pos draw.update_sprite(&p.sprite, dt) } draw_player :: proc(p: Player) { - draw.draw_sprite(&state.renderer, p.sprite) + draw.sprite(&state.renderer, p.sprite) } + |
