Compare commits
5 Commits
53bfd04a04
...
main
Author | SHA1 | Date | |
---|---|---|---|
1b13535efd
|
|||
35b06ec9db
|
|||
89ab2e33cd
|
|||
02c4525b87
|
|||
034cdcce80
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -3,4 +3,8 @@ build/
|
|||||||
libgame.so
|
libgame.so
|
||||||
libtownengine.so
|
libtownengine.so
|
||||||
lua
|
lua
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
|
quack
|
||||||
|
|
||||||
|
# i was told binary files are bad for git ¯\_(ツ)_/¯
|
||||||
|
data/fonts
|
41
data/scripts/classes/player.lua
Normal file
41
data/scripts/classes/player.lua
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
local Vector3 = require "vector3"
|
||||||
|
local util = require "util"
|
||||||
|
|
||||||
|
-- this is a static class, so no instancing shenanigans needed
|
||||||
|
|
||||||
|
local Player = {
|
||||||
|
position = Vector3(),
|
||||||
|
velocity = Vector3(),
|
||||||
|
|
||||||
|
speed = 0.07,
|
||||||
|
mouse_sensitivity = 0.01,
|
||||||
|
|
||||||
|
yaw = 0,
|
||||||
|
yaw_speed = 0.05,
|
||||||
|
}
|
||||||
|
|
||||||
|
function Player:tick(ctx)
|
||||||
|
input_action{name = "left", control = "A"}
|
||||||
|
input_action{name = "right", control = "D"}
|
||||||
|
input_action{name = "forward", control = "W"}
|
||||||
|
input_action{name = "back", control = "S"}
|
||||||
|
|
||||||
|
local camera_forward = Vector3(draw_camera_from_principal_axes(self).direction)
|
||||||
|
camera_forward.y = 0
|
||||||
|
camera_forward = camera_forward:normalized()
|
||||||
|
local camera_right = camera_forward:cross(Vector3.UP)
|
||||||
|
|
||||||
|
local forward_input = util.b2n(input_action_pressed{name = "forward"}) - util.b2n(input_action_pressed{name = "back"})
|
||||||
|
local strafe_input = util.b2n(input_action_pressed{name = "right"}) - util.b2n(input_action_pressed{name = "left"})
|
||||||
|
|
||||||
|
local direction = ((camera_forward * forward_input) + (camera_right * strafe_input)):normalized()
|
||||||
|
self.velocity = direction * self.speed
|
||||||
|
|
||||||
|
if ctx.mouse_capture then
|
||||||
|
self.yaw = self.yaw + self.mouse_sensitivity * ctx.mouse_movement.x
|
||||||
|
end
|
||||||
|
|
||||||
|
self.position = self.position + self.velocity
|
||||||
|
end
|
||||||
|
|
||||||
|
return Player
|
@ -1,22 +1,7 @@
|
|||||||
-- called every frame, with constant delta time
|
local FONT = "fonts/Lunchtype21_Regular.ttf"
|
||||||
local capture = false
|
|
||||||
local trig = require "trig"
|
|
||||||
local Vector3l = require "vector3"
|
|
||||||
|
|
||||||
|
local Vector3 = require "vector3"
|
||||||
local function Vector3(x, y, z)
|
local player = require "classes.player"
|
||||||
if y == nil then
|
|
||||||
return {x = x, y = x, z = x}
|
|
||||||
end
|
|
||||||
return {x = x, y = y, z = z}
|
|
||||||
end
|
|
||||||
|
|
||||||
local rot = 0
|
|
||||||
local rot_spd = 0.05
|
|
||||||
|
|
||||||
local spd = 0.07
|
|
||||||
|
|
||||||
local pos = Vector3(0)
|
|
||||||
|
|
||||||
local function Vector2(x, y)
|
local function Vector2(x, y)
|
||||||
if y == nil then
|
if y == nil then
|
||||||
@ -25,54 +10,23 @@ local function Vector2(x, y)
|
|||||||
return {x = x, y = y}
|
return {x = x, y = y}
|
||||||
end
|
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()
|
function game_tick()
|
||||||
-- ctx.initialization_needed is true first frame and every time dynamic reload is performed
|
-- ctx.initialization_needed is true first frame and every time dynamic reload is performed
|
||||||
if ctx.initialization_needed then
|
if ctx.initialization_needed then
|
||||||
-- ctx.udata persists on reload
|
-- ctx.udata persists on reload
|
||||||
ctx.udata = {}
|
ctx.udata = {
|
||||||
end
|
|
||||||
ctx.mouse_capture = capture
|
|
||||||
input_action{name="quit", control="SPACE"}
|
|
||||||
|
|
||||||
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 = "quit"} then
|
|
||||||
if not capture then
|
|
||||||
capture = true
|
|
||||||
else
|
|
||||||
capture = false
|
capture = false
|
||||||
end
|
}
|
||||||
|
end
|
||||||
|
ctx.mouse_capture = ctx.udata.capture
|
||||||
|
input_action{name="toggle_mouse", control="ESCAPE"}
|
||||||
|
if input_action_just_pressed{name = "toggle_mouse"} then
|
||||||
|
ctx.udata.capture = not ctx.udata.capture
|
||||||
end
|
end
|
||||||
local dir = draw_camera_from_principal_axes{position = pos, yaw = rot}.direction
|
|
||||||
dir.y = 0
|
|
||||||
dir = trig.v3_normalized(dir)
|
|
||||||
|
|
||||||
local rot_d = b2n(input_action_pressed{name = "right"}) - b2n(input_action_pressed{name = "left"})
|
player:tick(ctx)
|
||||||
rot = rot + rot_d * rot_spd
|
|
||||||
|
|
||||||
local mov_d = b2n(input_action_pressed{name = "forward"}) - b2n(input_action_pressed{name = "back"})
|
draw_billboard{position = Vector3(0, 0, 3), size = Vector2(1, 1), texture = "images/duck.png"}
|
||||||
pos = trig.v3_add(pos, trig.v3_mult(dir, spd * mov_d))
|
|
||||||
|
|
||||||
draw_billboard{position = Vector3(5, 0, 0), size = Vector2(1, 1), texture = "images/duck.png"}
|
draw_text{position = Vector2(0), string = "vel: " .. tostring(player.velocity), font = FONT}
|
||||||
end
|
end
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
local M = {}
|
|
||||||
|
|
||||||
function M.v3_length_squared(v)
|
|
||||||
local x2 = v.x * v.x
|
|
||||||
local y2 = v.y * v.y
|
|
||||||
local z2 = v.z * v.z
|
|
||||||
|
|
||||||
return x2 + y2 + z2
|
|
||||||
end
|
|
||||||
|
|
||||||
function M.v3_normalized(v)
|
|
||||||
local length = math.sqrt(M.v3_length_squared(v))
|
|
||||||
local new_vec = {
|
|
||||||
x = v.x / length,
|
|
||||||
y = v.y / length,
|
|
||||||
z = v.z / length,
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_vec
|
|
||||||
end
|
|
||||||
|
|
||||||
function M.v3_mult(v, f)
|
|
||||||
return {
|
|
||||||
x = v.x * f,
|
|
||||||
y = v.y * f,
|
|
||||||
z = v.z * f,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function M.v3_add(v1, v2)
|
|
||||||
return {
|
|
||||||
x = v1.x + v2.x,
|
|
||||||
y = v1.y + v2.y,
|
|
||||||
z = v1.z + v2.z,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
return M
|
|
20
data/scripts/util.lua
Normal file
20
data/scripts/util.lua
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
local util = {}
|
||||||
|
|
||||||
|
function util.printt(t)
|
||||||
|
if type(t) == 'table' then
|
||||||
|
local s = '{ '
|
||||||
|
for k,v in pairs(t) do
|
||||||
|
if type(k) ~= 'number' then k = '"'..k..'"' end
|
||||||
|
s = s .. '['..k..'] = ' .. util.print(v) .. ','
|
||||||
|
end
|
||||||
|
return s .. '} '
|
||||||
|
else
|
||||||
|
return tostring(t)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function util.b2n(value)
|
||||||
|
return value and 1 or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
return util
|
@ -129,9 +129,49 @@ function Vector3:length_squared()
|
|||||||
return x2 + y2 + z2
|
return x2 + y2 + z2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Vector3:length()
|
||||||
|
return math.sqrt(self:length_squared())
|
||||||
|
end
|
||||||
|
|
||||||
function Vector3:normalized()
|
function Vector3:normalized()
|
||||||
local length = math.sqrt(self:length_squared())
|
local length = math.sqrt(self:length_squared())
|
||||||
|
if length == 0 then
|
||||||
|
return Vector3()
|
||||||
|
end
|
||||||
return Vector3(self.x / length, self.y / length, self.z / length)
|
return Vector3(self.x / length, self.y / length, self.z / length)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Vector3:dot(with)
|
||||||
|
if not is_weak_vector3(with) then
|
||||||
|
error("Vector3: with must be a Vector3-like table. Returning 0")
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local v2 = Vector3(with)
|
||||||
|
return self.x * v2.x + self.y * v2.y + self.z * v2.z
|
||||||
|
end
|
||||||
|
|
||||||
|
function Vector3:cross(with)
|
||||||
|
if not is_weak_vector3(with) then
|
||||||
|
error("Vector3: with must be a Vector3-like table. Returning Vector3()")
|
||||||
|
return Vector3()
|
||||||
|
end
|
||||||
|
local v2 = Vector3(with)
|
||||||
|
return Vector3 {
|
||||||
|
self.y * v2.z - self.z * v2.y,
|
||||||
|
self.z * v2.x - self.x * v2.z,
|
||||||
|
self.x * v2.y - self.y * v2.x,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
---- CONSTANTS
|
||||||
|
|
||||||
|
Vector3.UP = Vector3(0, 1, 0)
|
||||||
|
Vector3.DOWN = -Vector3.UP
|
||||||
|
Vector3.FORWARD = Vector3(0, 0, -1)
|
||||||
|
Vector3.BACK = -Vector3.FORWARD
|
||||||
|
Vector3.RIGHT = Vector3(1, 0, 0)
|
||||||
|
Vector3.LEFT = -Vector3.RIGHT
|
||||||
|
|
||||||
-------------------
|
-------------------
|
||||||
return Vector3
|
return Vector3
|
||||||
|
Reference in New Issue
Block a user