local FONT = "fonts/Lunchtype21_Regular.ttf" local Vector3 = require "vector3" local capture = false local head_rotation = 0 local rotate_speed = 0.05 local mouse_sensitivity = 0.01 local spd = 0.07 local position = Vector3() local velocity = Vector3() local function Vector2(x, y) if y == nil then return {x = x, y = x} end return {x = x, y = y} end local function wrap(value, min, max) local range = max - min if value == 0 then return min end local result = value - (range * math.floor((value - min) / range)) if result == max then return min end return result end local function b2n(value) return value and 1 or 0 end function game_tick() -- ctx.initialization_needed is true first frame and every time dynamic reload is performed if ctx.initialization_needed then -- ctx.udata persists on reload ctx.udata = {} end ctx.mouse_capture = capture input_action{name="toggle_mouse", control="ESCAPE"} input_action{name = "left", control = "A"} input_action{name = "right", control = "D"} input_action{name = "forward", control = "W"} input_action{name = "back", control = "S"} if input_action_just_pressed{name = "toggle_mouse"} then if not capture then capture = true else capture = false end end local dir = Vector3(draw_camera_from_principal_axes{position = position, yaw = head_rotation}.direction) dir.y = 0 dir = dir:normalized() if not capture then local rot_d = b2n(input_action_pressed{name = "right"}) - b2n(input_action_pressed{name = "left"}) head_rotation = head_rotation + rot_d * rotate_speed else head_rotation = head_rotation + mouse_sensitivity * ctx.mouse_movement.x end local mov_d = b2n(input_action_pressed{name = "forward"}) - b2n(input_action_pressed{name = "back"}) velocity = dir * spd * mov_d position = position + velocity draw_billboard{position = Vector3(5, 0, 0), size = Vector2(1, 1), texture = "images/duck.png"} draw_text{position = Vector2(0), string = "vel: " .. tostring(velocity), font = FONT} end