summaryrefslogtreecommitdiffhomepage
path: root/menu.lua
blob: 47e1b25265349d11fcb847374c6b080e737449ae (plain)
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
-- `Menu` (Scene)
-- It creates single screen of a menu
-- I do know that model I used here and in `World` loading configuration files is not flawless but I did not want to rewrite `World`s one but wanted to keep things similar at least in project scope.

require "not.Music"

-- Here it begins
Menu = {
	scale = getScale(),
	elements, --table
	active = 1,
	music,
	sprite,
	background,
	asteroids,
	stars,
	asteroids_bounce = 0,
	stars_frame = 1,
	stars_delay = 0.8,
	allowMove = true,
	quads = {
		button = {
			normal = love.graphics.newQuad(0, 0, 58,15, 80,130),
			active = love.graphics.newQuad(0, 0, 58,15, 80,130)
		},
		portrait = {
			normal = love.graphics.newQuad( 0, 15, 32,32, 80,130),
			active = love.graphics.newQuad(32, 15, 32,32, 80,130)
		},
		panorama = {
			normal = love.graphics.newQuad(0,47, 80,42, 80,130),
			active = love.graphics.newQuad(0,88, 80,42, 80,130)
		},
		arrow_l = love.graphics.newQuad(68, 0, 6, 6, 80,130),
		arrow_r = love.graphics.newQuad(74, 0, 6, 6, 80,130),
		stars = {
			love.graphics.newQuad(  0, 0, 320, 200, 640,200),
			love.graphics.newQuad(320, 0, 320, 200, 640,200)
		},
	}
}
function Menu:new(name)
	local o = {}
	setmetatable(o, self)
	self.__index = self
	self.sprite = love.graphics.newImage("assets/menu.png")
	self.background = love.graphics.newImage("assets/backgrounds/menu.png")
	self.asteroids = love.graphics.newImage("assets/asteroids.png")
	self.stars = love.graphics.newImage("assets/stars.png")
	o.elements = {}
	o:load(name)
	o.music = Music:new("menu.ogg")
	return o
end
function Menu:delete()
	self.music:delete()
end

-- Load menu from file
function Menu:load(name)
	local name = "config/" .. (name or "menumain") .. ".lua"
	local menu = love.filesystem.load(name)
	self.active = 1
	self.elements = menu(self)
	self.elements[self.active]:focus()
end

-- Return reference to quads table and menu sprite
function Menu:getSheet()
	return self.sprite, self.quads
end

-- Cycle elements
function Menu:next()
	self.elements[self.active]:blur()
	self.active = (self.active%#self.elements)+1
	if not self.elements[self.active]:focus() then
		self:next()
	end
end
function Menu:previous()
	self.elements[self.active]:blur()
	if self.active == 1 then
		self.active = #self.elements
	else
		self.active = self.active - 1
	end
	if not self.elements[self.active]:focus() then
		self:previous()
	end
end

-- LÖVE2D callbacks
function Menu:update(dt)
	for _,element in pairs(self.elements) do
		element:update(dt)
	end
	self.asteroids_bounce = self.asteroids_bounce + dt*0.1
	if self.asteroids_bounce > 2 then self.asteroids_bounce = self.asteroids_bounce - 2 end
	self.stars_delay = self.stars_delay - dt
	if self.stars_delay < 0 then
		self.stars_delay = self.stars_delay + Menu.stars_delay --Menu.stars_delay is initial
		if self.stars_frame == 2 then
			self.stars_frame = 1
		else
			self.stars_frame = 2
		end
	end
end
function Menu:draw()
	local scale = self.scale
	local scaler = getRealScale()
	love.graphics.draw(self.background, 0, 0, 0, scaler, scaler)
	love.graphics.draw(self.stars, self.quads.stars[self.stars_frame], 0, 0, 0, scaler, scaler)
	love.graphics.draw(self.asteroids, 0, math.floor(64+math.sin(self.asteroids_bounce*math.pi)*4)*scaler, 0, scaler, scaler)
	love.graphics.setFont(Font)
	for _,element in pairs(self.elements) do
		element:draw(scale)
	end
end

-- Controller callbacks
function Menu:controlpressed(set, action, key)
	if self.allowMove then
		if action == "down" then
			self:next()
		end
		if action == "up" then
			self:previous()
		end
	end
	for _,element in pairs(self.elements) do
		element:controlpressed(set, action, key)
	end
end
function Menu:controlreleased(set, action, key)
	for _,element in pairs(self.elements) do
		element:controlreleased(set, action, key)
	end
end