forked from omgee/lua-platformer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.lua
More file actions
162 lines (127 loc) · 3.41 KB
/
main.lua
File metadata and controls
162 lines (127 loc) · 3.41 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
--Загрузочная функция love2d
function love.load()
-- Концигурация окошка и цветов Love2D
gr = love.graphics
wn = love.window
kb = love.keyboard
gr.setBackgroundColor(255, 255, 255)
gr.setColor(0, 0, 0)
wn.setMode(320, 320)
wn.setTitle("Test platformer")
-- Карта (матрица 10х10)
map = {
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,1,1,0,0},
{1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,1,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1},
}
-- Класс ГГ
player = {
x = 111,
y = 118,
jump = false,
jumpSize = 0,
coll = {
left = false,
right = false,
top = false,
bottom = false
}
}
-- Подгрузка графики
block = gr.newImage("block.png")
-- Расчет вертикальной коллизии
function player.vertical(unit)
local x1 = math.floor((player.x + 1) / 32) + 1
local x2 = math.floor((player.x + 31) / 32) + 1
local y1 = math.floor((player.y + 32 + unit) / 32) + 1
local y2 = math.floor((player.y - unit) / 32) + 1
if map[y1][x1] == 0 and map[y1][x2] == 0 then
player.coll.bottom = false
else
player.coll.bottom = true
player.y = (y1 - 2) * 32
end
if map[y2][x1] == 0 and map[y2][x2] == 0 then
player.coll.top = false
else
player.coll.top = true
player.y = y2 * 32
end
end
-- Расчет горизонтальной коллизии
function player.horizontal(unit)
local y1 = math.floor((player.y + 1) / 32) + 1
local y2 = math.floor((player.y + 31) / 32) + 1
local x1 = math.floor((player.x - unit) / 32) + 1
local x2 = math.floor((player.x + 32 + unit) / 32) + 1
if map[y1][x1] == 0 and map[y2][x1] == 0 then
player.coll.left = false
else
player.coll.left = true
player.x = x1 * 32
end
if map[y1][x2] == 0 and map[y2][x2] == 0 then
player.coll.right = false
else
player.coll.right = true
player.x = (x2 - 2) * 32
end
end
end
-- Работа с клавиатурой
function love.keypressed(key)
if key == " " and player.coll.bottom then
player.jump = true
end
end
function love.keyreleased(key)
if key == " " then
player.jump = false
end
end
-- Функция расчета
function love.update(dt)
-- Еденица движения
unit = dt * 500
-- Коллизия
player.vertical(unit)
player.horizontal(unit)
if not player.coll.bottom and not player.jump then
player.y = player.y + unit
end
-- Прыжок
if player.jump and player.jumpSize < 96 and not player.coll.top then
player.jumpSize = player.jumpSize + 1
player.y = player.y - unit
else
player.jumpSize = 0
player.jump = false
end
if not player.coll.left and kb.isDown("a") then
player.x = player.x - unit
end
if not player.coll.right and kb.isDown("d") then
player.x = player.x + unit
end
end
--Функция отрисовки
function love.draw()
gr.setColor(255, 255, 255)
-- Отрисовка карты
for i = 1, #map do
for k = 1, #map[i] do
if map[i][k] == 1 then
gr.draw(block, (k - 1) * 32, (i - 1) * 32)
end
end
end
-- Отрисовка ГГ
gr.draw(block, player.x, player.y)
end