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) } }