diff options
| author | Xander Swan <email> | 2025-12-03 09:52:13 -0500 |
|---|---|---|
| committer | Xander Swan <email> | 2025-12-03 09:52:13 -0500 |
| commit | 53cba1d004451f0782312cb203afb7da47a29c5f (patch) | |
| tree | b772324597c52674a626c7137359d34f528b1bd2 /src/player.odin | |
| parent | bb52b5f9c9def80b1e8704acabde6f8c6a34e1a2 (diff) | |
update renderer structure a lil
Diffstat (limited to 'src/player.odin')
| -rw-r--r-- | src/player.odin | 76 |
1 files changed, 47 insertions, 29 deletions
diff --git a/src/player.odin b/src/player.odin index 01bc02b..e098167 100644 --- a/src/player.odin +++ b/src/player.odin @@ -10,59 +10,77 @@ import "draw" Player :: struct { pos: Vec2, + vel: Vec2, anim: draw.Animation, sprite: draw.Sprite, } -init_player :: proc(player: ^Player) { - anim_ok := draw.init_anim_data(&player.anim, "res/robot2.json") +PLAYER_SPEED :: 100 +PLAYER_ACCEL :: 10 +PLAYER_JUMP_FORCE :: 300 + +init_player :: proc(p: ^Player) { + p.pos = Vec2{50, 50} + + anim_ok := draw.init_anim_data(&p.anim, "res/robot2.json") if !anim_ok { fmt.println("coult not load animation") sapp.quit() return } - draw.init_sprite(&player.sprite, player.anim.image_path, player.anim) -} + draw.init_sprite(&p.sprite, p.anim.image_path, p.anim) -deinit_player :: proc(player: ^Player) { - draw.delete_anim_data(player.anim) + p.sprite.offset = Vec2{ + -math.floor(f32(p.sprite.width / 2)), + -f32(p.sprite.height) + } } -update_player :: proc(player: ^Player, dt: f32) { - SPEED :: 100 +deinit_player :: proc(p: ^Player) { + draw.delete_anim_data(p.anim) +} - input: Vec2 +update_player :: proc(p: ^Player, dt: f32) { + input: f32 - if is_keybind_down(state.input, state.input.move_up) { - input.y -= 1 - } if is_keybind_down(state.input, state.input.move_left) { - input.x -= 1 - } - if is_keybind_down(state.input, state.input.move_down) { - input.y += 1 + input -= 1 } if is_keybind_down(state.input, state.input.move_right) { - input.x += 1 + input += 1 } - if linalg.length2(input) > 0 { - input = linalg.normalize(input) - draw.set_sprite_active_tag(&player.sprite, "down_run") + if input != 0 { + draw.set_sprite_active_tag(&p.sprite, "down_run") + p.sprite.scale.x = math.sign(input) } else { - draw.set_sprite_active_tag(&player.sprite, "down_idle") + draw.set_sprite_active_tag(&p.sprite, "down_idle") } - player.pos += input * SPEED * dt + if is_keybind_down(state.input, state.input.jump) && p.pos.y >= 256 { + p.vel.y = -PLAYER_JUMP_FORCE + } + + p.vel.x = math.lerp( + p.vel.x, + input * PLAYER_SPEED, + math.pow(0.5, dt * PLAYER_ACCEL), + ) + p.vel.y = math.min(p.vel.y + GRAVITY * dt, TERMINAL_VELOCITY) - draw.update_sprite(&player.sprite, dt) + p.pos += p.vel * dt + + if p.pos.y > 256 { + p.pos.y = 256 + p.vel.y = 0 + } + + p.sprite.pos = p.pos + + draw.update_sprite(&p.sprite, dt) } -draw_player :: proc(player: Player) { - draw.draw_sprite( - &state.renderer, - player.sprite, - player.pos, - ) +draw_player :: proc(p: Player) { + draw.draw_sprite(&state.renderer, p.sprite) } |
