aboutsummaryrefslogtreecommitdiff
path: root/src/player.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.odin')
-rw-r--r--src/player.odin76
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)
}