diff options
Diffstat (limited to 'src/muntik.odin')
| -rw-r--r-- | src/muntik.odin | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/muntik.odin b/src/muntik.odin new file mode 100644 index 0000000..023174c --- /dev/null +++ b/src/muntik.odin @@ -0,0 +1,73 @@ +package demonchime + +import "core:math" +import hm "core:container/handle_map" + +import "fw" +import "phys" + +Muntik :: struct { + handle: Handle, + body: phys.Body_Handle, + sprite: Sprite, + walk_dir: f32, +} + +make_muntik :: proc(pos: Vec2, direction: f32) -> (Handle, ^Muntik) { + sprite: Sprite + init_sprite(&sprite, .Muntik) + sprite.offset = { + f32(sprite.width / 2), + f32(sprite.height), + } + + body := phys.make_body( + phys.Rect{-sprite.offset, {14, 9}}, + layers = {.Enemy}, + ) + phys.set_position(body, pos) + + handle := hm.add(&state.muntik_list, Muntik{ + body = body, + sprite = sprite, + walk_dir = direction, + }) + return handle, hm.get(&state.muntik_list, handle) +} + +update_muntiks :: proc(dt: f32) { + iter := hm.iterator_make(&state.muntik_list) + for m, _ in hm.iterate(&iter) { + vel := phys.get_velocity(m.body) + vel.x = m.walk_dir * MUNTIK_SPEED + vel.y = math.min(vel.y + GRAVITY * dt, TERMINAL_VELOCITY) + phys.set_velocity(m.body, vel) + + phys.update_body(m.body) + + pos := phys.get_position(m.body) + + m.sprite.pos = pos + m.sprite.scale.x = -m.walk_dir + + set_sprite_active_tag(&m.sprite, "walk") + update_sprite(&m.sprite, dt) + + turnaround_rc_start := Vec2{pos.x + m.walk_dir * 4, pos.y} + turnaround_rc := phys.make_raycast( + turnaround_rc_start, + turnaround_rc_start + {0, 16}, + ) + + if !phys.is_colliding(turnaround_rc) { + m.walk_dir *= -1 + } + } +} + +draw_muntiks :: proc() { + iter := hm.iterator_make(&state.muntik_list) + for m, _ in hm.iterate(&iter) { + draw_sprite(m.sprite) + } +} |
