More menu stuff.
This commit is contained in:
parent
51a0bcbdb8
commit
8fedf05276
Binary file not shown.
|
@ -0,0 +1,10 @@
|
||||||
|
return setmetatable({
|
||||||
|
["newgame_button"] = "New Game",
|
||||||
|
["join_button"] = "Join Server",
|
||||||
|
["quit_button"] = "Quit",
|
||||||
|
["option_button"] = "Settings",
|
||||||
|
["mainmenu_button"] = "Main Menu",
|
||||||
|
["option_name"] = "Player Name",
|
||||||
|
["option_pron"] = "Player Pronouns",
|
||||||
|
["option_tint"] = "Player Colour",
|
||||||
|
}, {__index = function( t, k ) return k end } )
|
|
@ -14,4 +14,13 @@ function browser.onLoad( )
|
||||||
lg.setColor( 1, 1, 1, 1 )
|
lg.setColor( 1, 1, 1, 1 )
|
||||||
end
|
end
|
||||||
|
|
||||||
return scene.add( browser, 'browser' )
|
function browser.mousepressed()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function browser.keypressed( key, code, isRepeat )
|
||||||
|
if code == "escape" then return scene.mainmenu() end
|
||||||
|
end
|
||||||
|
|
||||||
|
scene.browser = browser
|
||||||
|
return browser
|
|
@ -0,0 +1,42 @@
|
||||||
|
local button = {}
|
||||||
|
local lg = assert( love.graphics )
|
||||||
|
|
||||||
|
function button:new( t, x, y, w, h, text, color, callback )
|
||||||
|
--print( t.x, t.y, t.w, t.h, t.text, t.color, t.callback )
|
||||||
|
return setmetatable( t or
|
||||||
|
{
|
||||||
|
x = 0, y = 0,
|
||||||
|
w = 100, h = 100,
|
||||||
|
text = text, color = color,
|
||||||
|
callback = callback,
|
||||||
|
selected = false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
__index = button,
|
||||||
|
__call = t.callback or callback
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function button:contains( x, y )
|
||||||
|
local mx, my, Mx, My = self.x, self.y, self.x + self.w, self.y + self.h
|
||||||
|
return (x < Mx and x > mx and y > my and y < My)
|
||||||
|
end
|
||||||
|
|
||||||
|
function button:draw( )
|
||||||
|
lg.setColor( self.color )
|
||||||
|
lg.rectangle( "fill", self.x, self.y, self.w, self.h, 10)
|
||||||
|
|
||||||
|
|
||||||
|
if self.selected then
|
||||||
|
lg.setColor( 1, 1, 1, 0.8 )
|
||||||
|
lg.rectangle( "fill", self.x + 3, self.y + 3, self.w - 6, self.h - 6, 10 )
|
||||||
|
else
|
||||||
|
lg.setColor( 0, 0, 0, 0.7 )
|
||||||
|
end
|
||||||
|
|
||||||
|
lg.setColor( 0, 0, 0, 0.7 )
|
||||||
|
lg.print( self.text, self.x + 15, self.y + 10 )
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable( button, { __call = button.new } )
|
|
@ -8,26 +8,42 @@ local game = {}
|
||||||
local t = 0
|
local t = 0
|
||||||
local tick = 0
|
local tick = 0
|
||||||
|
|
||||||
local currentWorld = shared.NewWorld()
|
|
||||||
|
|
||||||
function game.draw()
|
function game.draw()
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function game.onPacket( data, msg )
|
||||||
|
if data then print( data, msg ) end
|
||||||
|
end
|
||||||
|
|
||||||
function game.update( dt )
|
function game.update( dt )
|
||||||
t = dt + t
|
t = dt + t
|
||||||
|
game.onPacket( udp:receive() )
|
||||||
if t > 0.1 then
|
if t > 0.1 then
|
||||||
t = 0
|
t = 0
|
||||||
tick = tick + 1
|
tick = tick + 1
|
||||||
local s = string.format("client: %d", tick)
|
udp:send( tostring(tick) )
|
||||||
print( s )
|
|
||||||
udp:send( s )
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function game.newGame( )
|
||||||
|
game.curWorld = shared.NewWorld() --Last world state received from server.
|
||||||
|
game.preWorld = shared.NewWorld() --Current world state predicted by this client.
|
||||||
|
end
|
||||||
|
|
||||||
|
function game.disconnect( )
|
||||||
|
return scene.mainmenu()
|
||||||
|
end
|
||||||
|
|
||||||
function game.onLoad( )
|
function game.onLoad( )
|
||||||
udp:settimeout( 0 )
|
udp:settimeout( 0 )
|
||||||
udp:setpeername( "192.168.2.15", 51312 )
|
udp:setpeername( "192.168.2.15", 51312 )
|
||||||
end
|
end
|
||||||
|
|
||||||
return scene.add( game, 'game' )
|
function game.keypressed( key, code, isRepeat )
|
||||||
|
if code == "escape" then return game.disconnect() end
|
||||||
|
end
|
||||||
|
|
||||||
|
scene.game = game
|
||||||
|
return game
|
|
@ -1,40 +1,100 @@
|
||||||
--Main menu for client.
|
|
||||||
local lg = assert( love.graphics )
|
local lg = assert( love.graphics )
|
||||||
|
local love = assert( love )
|
||||||
local scene = assert( require 'client.scene' )
|
local scene = assert( require 'client.scene' )
|
||||||
local strings = assert( require 'client.strings' )
|
local strings = assert( require 'client.assets.strings' )
|
||||||
|
local button = assert( require 'client.button' )
|
||||||
local menu = {}
|
local menu = {}
|
||||||
|
|
||||||
local t = 0
|
local t = 0
|
||||||
local wWidth = 800
|
local wWidth = 800
|
||||||
local wHeight = 600
|
local wHeight = 600
|
||||||
|
|
||||||
function menu.onLoad()
|
local selectedButtonIdx = nil
|
||||||
lg.setNewFont( 32 )
|
|
||||||
end
|
local canvas = lg.newCanvas()
|
||||||
|
local buttons =
|
||||||
|
{
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115,
|
||||||
|
text = strings.newgame_button,
|
||||||
|
color = { 0.3, 0.2, 0.9, 0.5 },
|
||||||
|
callback = function() return scene.game() end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55,
|
||||||
|
text = strings.join_button,
|
||||||
|
color = { 0.3, 0.2, 0.8, 0.5 },
|
||||||
|
callback = function() return scene.browser() end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55 * 2,
|
||||||
|
text = strings.option_button,
|
||||||
|
color = { 0.3, 0.2, 0.9, 0.5 },
|
||||||
|
callback = function() return scene.options() end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55 * 3,
|
||||||
|
text = strings.quit_button,
|
||||||
|
color = { 0.3, 0.2, 1.0, 0.5 },
|
||||||
|
callback = love.event.quit },
|
||||||
|
}
|
||||||
|
|
||||||
|
local gradientQuad = lg.newMesh{
|
||||||
|
{
|
||||||
|
-- top-left corner (red-tinted)
|
||||||
|
0, 0, -- position of the vertex
|
||||||
|
0, 0, -- texture coordinate at the vertex position
|
||||||
|
0.4, 0.1, 0.4, 0.0 -- color of the vertex
|
||||||
|
},
|
||||||
|
{
|
||||||
|
-- top-right corner (green-tinted)
|
||||||
|
1, 0,
|
||||||
|
1, 0, -- texture coordinates are in the range of [0, 1]
|
||||||
|
0.8, 0.3, 0.1, 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
-- bottom-right corner (blue-tinted)
|
||||||
|
1, 1,
|
||||||
|
1, 1,
|
||||||
|
0.7, 0.4, 0.1, 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
-- bottom-left corner (yellow-tinted)
|
||||||
|
0, 1,
|
||||||
|
0, 1,
|
||||||
|
0.4, 0.15, 0.3, 0.0
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
function menu.draw()
|
function menu.draw()
|
||||||
local x, y = 10, 10
|
lg.setCanvas()
|
||||||
do
|
lg.setColor( 1,1,1,1 )
|
||||||
lg.setColor( 1, 0.8, 0.5, 1 )
|
lg.draw( canvas )
|
||||||
lg.rectangle( "fill", x, y, ( wWidth - 20 ) / 2, 50, 15 )
|
end
|
||||||
|
|
||||||
|
function menu.paint()
|
||||||
|
lg.setCanvas( canvas )
|
||||||
|
|
||||||
|
--bg
|
||||||
|
lg.setColor( 0.8, 0.6, 0.3, 1 )
|
||||||
|
lg.rectangle( "fill", 0, 0, wWidth, wHeight )
|
||||||
|
|
||||||
|
--buttons
|
||||||
|
for id, button in pairs( buttons ) do button:draw( ) end
|
||||||
|
|
||||||
|
--gradient
|
||||||
lg.setColor( 1, 1, 1, 1 )
|
lg.setColor( 1, 1, 1, 1 )
|
||||||
lg.print( strings.newgame_button, x + 15, y + 5 )
|
lg.draw( gradientQuad, 0, 0, 0, wWidth, wHeight )
|
||||||
y = y + 100
|
lg.setCanvas()
|
||||||
end
|
end
|
||||||
do
|
|
||||||
lg.setColor( 1, 0.8, 0.5, 1 )
|
function menu.onLoad()
|
||||||
lg.rectangle( "fill", x, y, ( wWidth - 20 ) / 2, 50, 15 )
|
lg.setNewFont( "client/assets/SitkaB.ttc", 28 )
|
||||||
lg.setColor( 1, 1, 1, 1 )
|
return menu.resize( lg.getDimensions() )
|
||||||
lg.print( strings.join_button, x + 15, y + 5 )
|
|
||||||
y = y + 100
|
|
||||||
end
|
|
||||||
do
|
|
||||||
lg.setColor( 1, 0.8, 0.5, 1 )
|
|
||||||
lg.rectangle( "fill", x, y, ( wWidth - 20 ) / 2, 50, 15 )
|
|
||||||
lg.setColor( 1, 1, 1, 1 )
|
|
||||||
lg.print( strings.quit_button, x + 15, y + 5 )
|
|
||||||
y = y + 100
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function menu.update( dt )
|
function menu.update( dt )
|
||||||
|
@ -43,20 +103,64 @@ end
|
||||||
|
|
||||||
function menu.resize( w, h )
|
function menu.resize( w, h )
|
||||||
wWidth, wHeight = w, h
|
wWidth, wHeight = w, h
|
||||||
|
canvas = lg.newCanvas()
|
||||||
|
for id, uiButton in pairs( buttons ) do
|
||||||
|
uiButton.w = wWidth
|
||||||
|
end
|
||||||
|
menu.paint()
|
||||||
end
|
end
|
||||||
|
|
||||||
function menu.mousemoved( x, y, dx, dy, istouch )
|
function menu.mousemoved( x, y, dx, dy, istouch )
|
||||||
|
if selectedButtonIdx then
|
||||||
|
buttons[selectedButtonIdx].selected = false
|
||||||
|
selectedButtonIdx = nil
|
||||||
|
end
|
||||||
|
for id, menuButton in ipairs( buttons ) do
|
||||||
|
if menuButton:contains( x, y ) then
|
||||||
|
menuButton.selected = true
|
||||||
|
selectedButtonIdx = id
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return menu.paint()
|
||||||
end
|
end
|
||||||
|
|
||||||
function menu.mousepressed( x, y, button, istouch, presses )
|
function menu.mousepressed( x, y, button, istouch, presses )
|
||||||
if button == 1 then scene.load( 'browser' )
|
if not selectedButtonIdx then return end
|
||||||
else scene.load( 'game' )
|
local uiButton = buttons[selectedButtonIdx]
|
||||||
end
|
if uiButton:contains( x, y ) then return uiButton() end
|
||||||
|
return menu.paint()
|
||||||
end
|
end
|
||||||
|
|
||||||
function menu.keypressed( key, code, isrepeat )
|
function menu.keypressed( key, code, isrepeat )
|
||||||
|
|
||||||
|
if code == "escape" then
|
||||||
|
return love.event.quit()
|
||||||
|
end
|
||||||
|
|
||||||
|
if code == "return" and selectedButtonIdx then
|
||||||
|
return buttons[selectedButtonIdx]()
|
||||||
|
end
|
||||||
|
|
||||||
|
if code == "down" or code == "tab" or code == "up" then
|
||||||
|
local sbi = (selectedButtonIdx or 1)
|
||||||
|
buttons[sbi].selected = false
|
||||||
|
|
||||||
|
--Increment / decrement
|
||||||
|
sbi = sbi + ((code == "up") and -1 or 1)
|
||||||
|
if sbi > #buttons then sbi = 1 end
|
||||||
|
if sbi < 1 then sbi = #buttons end
|
||||||
|
|
||||||
|
--Assign
|
||||||
|
print( "selecting button: ", sbi )
|
||||||
|
selectedButtonIdx = sbi
|
||||||
|
buttons[selectedButtonIdx].selected = true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return menu.paint()
|
||||||
end
|
end
|
||||||
|
|
||||||
return scene.add( menu, 'menu' )
|
scene.mainmenu = menu
|
||||||
|
return menu
|
|
@ -0,0 +1,108 @@
|
||||||
|
local lg = assert( love.graphics )
|
||||||
|
local love = assert( love )
|
||||||
|
local scene = assert( require 'client.scene' )
|
||||||
|
local strings = assert( require 'client.assets.strings' )
|
||||||
|
local button = assert( require 'client.button' )
|
||||||
|
local menu = {}
|
||||||
|
|
||||||
|
local t = 0
|
||||||
|
local wWidth = 800
|
||||||
|
local wHeight = 600
|
||||||
|
|
||||||
|
local selectedButtonIdx = nil
|
||||||
|
|
||||||
|
local buttons =
|
||||||
|
{
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115,
|
||||||
|
text = strings.option_name,
|
||||||
|
color = { 0.5, 0.7, 0.5, 1 },
|
||||||
|
callback = function() print("Adjust Name") end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55,
|
||||||
|
text = strings.option_pron,
|
||||||
|
color = { 0.5, 0.7, 0.5, 1 },
|
||||||
|
callback = function() print("Adjust Name") end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55 * 2,
|
||||||
|
text = strings.option_tint,
|
||||||
|
color = { 0.5, 0.7, 0.5, 1 },
|
||||||
|
callback = function() print("Adjust Colour") end },
|
||||||
|
|
||||||
|
button{
|
||||||
|
x = 15, w = 400, h = 50,
|
||||||
|
y = 115 + 55 * 3,
|
||||||
|
text = strings.mainmenu_button,
|
||||||
|
color = { 0.5, 0.7, 0.5, 1 },
|
||||||
|
callback = function() print("Adjust Name") return scene.mainmenu() end },
|
||||||
|
}
|
||||||
|
|
||||||
|
function menu.onLoad()
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.draw()
|
||||||
|
for id, button in pairs( buttons ) do button:draw( ) end
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.update( dt )
|
||||||
|
t = t + dt
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.resize( w, h )
|
||||||
|
wWidth, wHeight = w, h
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.mousemoved( x, y, dx, dy, istouch )
|
||||||
|
if selectedButtonIdx then
|
||||||
|
buttons[selectedButtonIdx].selected = false
|
||||||
|
selectedButtonIdx = nil
|
||||||
|
end
|
||||||
|
for id, menuButton in ipairs( buttons ) do
|
||||||
|
if menuButton:contains( x, y ) then
|
||||||
|
menuButton.selected = true
|
||||||
|
selectedButtonIdx = id
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.mousepressed( x, y, button, istouch, presses )
|
||||||
|
if not selectedButtonIdx then return end
|
||||||
|
local uiButton = buttons[selectedButtonIdx]
|
||||||
|
if uiButton:contains( x, y ) then return uiButton() end
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.keypressed( key, code, isrepeat )
|
||||||
|
|
||||||
|
if code == "escape" then
|
||||||
|
return scene.mainmenu()
|
||||||
|
end
|
||||||
|
|
||||||
|
if code == "return" and selectedButtonIdx then
|
||||||
|
return buttons[selectedButtonIdx]()
|
||||||
|
end
|
||||||
|
|
||||||
|
if code == "down" or code == "tab" or code == "up" then
|
||||||
|
local sbi = (selectedButtonIdx or 1)
|
||||||
|
buttons[sbi].selected = false
|
||||||
|
|
||||||
|
--Increment / decrement
|
||||||
|
sbi = sbi + ((code == "up") and -1 or 1)
|
||||||
|
if sbi > #buttons then sbi = 1 end
|
||||||
|
if sbi < 1 then sbi = #buttons end
|
||||||
|
|
||||||
|
--Assign
|
||||||
|
print( "selecting button: ", sbi )
|
||||||
|
selectedButtonIdx = sbi
|
||||||
|
buttons[selectedButtonIdx].selected = true
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
scene.options = menu
|
||||||
|
return menu
|
|
@ -2,19 +2,22 @@ local scene = {}
|
||||||
local love = assert( love )
|
local love = assert( love )
|
||||||
local mt = {}
|
local mt = {}
|
||||||
|
|
||||||
function mt.load( name )
|
local function loadScene( scene )
|
||||||
print( "Loading Scene:", name )
|
print( "Loading Scene:", scene.name )
|
||||||
local scene = assert( scene[name] )
|
|
||||||
for k, v in pairs( scene ) do
|
for k, v in pairs( scene ) do
|
||||||
love[k] = v
|
love[k] = v
|
||||||
end
|
end
|
||||||
scene.onLoad()
|
scene.onLoad()
|
||||||
end
|
end
|
||||||
|
|
||||||
function mt.add( t, name )
|
local function newScene( scenes, name, t )
|
||||||
print( "Adding Scene:", t.name or name )
|
t.name = t.name or name
|
||||||
scene[name] = t
|
print( "Adding Scene:", t.name )
|
||||||
return t
|
setmetatable( t, { __call = function() return loadScene( t ) end } )
|
||||||
|
rawset( scenes, name, t )
|
||||||
end
|
end
|
||||||
|
|
||||||
return setmetatable( scene, {__index = mt } )
|
return setmetatable( scene,
|
||||||
|
{__call = loadScene,
|
||||||
|
__newindex = newScene
|
||||||
|
} )
|
|
@ -1,5 +0,0 @@
|
||||||
return {
|
|
||||||
["newgame_button"] = "New Game",
|
|
||||||
["join_button"] = "Join Server",
|
|
||||||
["quit_button"] = "Quit",
|
|
||||||
}
|
|
|
@ -7,5 +7,6 @@ function love.load()
|
||||||
assert( require 'client.menu' )
|
assert( require 'client.menu' )
|
||||||
assert( require 'client.browser' )
|
assert( require 'client.browser' )
|
||||||
assert( require 'client.game' )
|
assert( require 'client.game' )
|
||||||
scenes.load( 'menu' )
|
assert( require 'client.options' )
|
||||||
|
scenes.mainmenu()
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,6 +9,10 @@ local server = {
|
||||||
serverName = "dajjal-server",
|
serverName = "dajjal-server",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local clients = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
local _print = print
|
local _print = print
|
||||||
function server.Print(...)
|
function server.Print(...)
|
||||||
|
@ -25,9 +29,11 @@ function server.StartLocalClient()
|
||||||
os.execute( "start vision.bat" )
|
os.execute( "start vision.bat" )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--Incoming packet.
|
||||||
function server.Parse( packet, ip, port )
|
function server.Parse( packet, ip, port )
|
||||||
if not packet then return end
|
if not packet then return end
|
||||||
print( packet )
|
print( packet, ip, port )
|
||||||
|
return server.Parse( udp:receivefrom() ) -- Process any packets we missed.
|
||||||
end
|
end
|
||||||
|
|
||||||
function server.Start()
|
function server.Start()
|
||||||
|
@ -38,15 +44,18 @@ function server.Start()
|
||||||
repeat
|
repeat
|
||||||
server.Parse( udp:receivefrom() )
|
server.Parse( udp:receivefrom() )
|
||||||
server.Advance()
|
server.Advance()
|
||||||
until socket.sleep( 0.1 )
|
until socket.sleep( 0.1 - (socket.gettime() % 0.1) )
|
||||||
end
|
end
|
||||||
|
|
||||||
function server.Advance()
|
function server.Advance()
|
||||||
server.tick = server.tick + 1
|
server.tick = server.tick + 1
|
||||||
|
for id, client in ipairs( clients ) do
|
||||||
|
udp:sendto( string.format("server: %d client: %d", server.tick, client.tick), client.ip, client.port)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function server.NewGame()
|
function server.NewGame()
|
||||||
|
server.tick = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
function server.Quit()
|
function server.Quit()
|
||||||
|
|
Loading…
Reference in New Issue