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