1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
require "globals"
local Transform = require 'Transform'
local Drawable = require 'Drawable'
local Input = require 'Input'
local Camera = require 'Camera'
local Bolvis = require 'Bolvis'
local Sprite = require 'Sprite'
local world = require 'world'
local level
local camera
function love.load()
love.setDeprecationOutput(false)
love.mouse.setRelativeMode(true)
level = world()
level:object(Transform {pos = {960, 540}}, Bolvis())
level:object(Transform {pos = {400, 540}}, Sprite {name = 'utah-teapot'})
level:object(Transform {pos = {600, 540}}, Sprite {name = 'apioform'})
level:object(Transform {pos = {960, 300}}, Sprite {name = 'test'})
level:object(Transform {pos = {960, 700}}, Sprite {name = 'test'})
level:object(Transform {pos = {430, 700}}, Sprite {name = 'test'})
level:object(Transform {pos = {1490, 700}}, Sprite {name = 'test'})
end
local function screen_transform()
local ww, wh = love.graphics.getDimensions()
local sw, sh = 1920, 1080
local scalex, scaley = ww / sw, wh / sh
local scale
if scalex * sh < wh then
scale = scalex
else
scale = scaley
end
local dimx, dimy = sw * scale, sh * scale
local x, y = ww / 2 - dimx / 2, wh / 2 - dimy / 2
return love.math.newTransform(x, y, 0, scale, scale)
end
local function call(ct, method, ...)
for o in level:iterate(ct) do
o:call(method, ...)
end
end
function love.draw()
love.graphics.applyTransform(screen_transform())
level.camera:transform()
local to_draw = {}
for o in level:iterate(Drawable) do
table.insert(to_draw, o)
end
table.sort(to_draw, function(a, b)
return a:get(Drawable).i.z < b:get(Drawable).i.z
end)
for _, o in ipairs(to_draw) do
love.graphics.push()
local cmps = {}
for c in o:all_components() do
table.insert(cmps, c)
end
table.sort(cmps, function(a, b)
return (a.i.z or 0) < (b.i.z or 0)
end)
for _, c in ipairs(cmps) do
if c.draw then c:draw() end
end
love.graphics.pop()
end
end
function love.update(dt)
-- physics.world:update(dt, 20, 20)
call(nil, 'update', dt)
end
function love.mousemoved(...)
call(Input, 'mousemoved', ...)
end
function love.mousepressed(...)
love.mouse.setRelativeMode(true)
call(Input, 'mousepressed', ...)
end
function love.mousereleased(...)
call(Input, 'mousereleased', ...)
end
function love.keypressed(key, ...)
if key == 'tab' and
(love.keyboard.isDown 'ralt' or love.keyboard.isDown 'lalt') then
love.mouse.setRelativeMode(false)
end
call(Input, 'keypressed', key, ...)
end
function love.keyreleased(...)
call(Input, 'keyreleased', ...)
end
|