117 lines
2.8 KiB
Lua
117 lines
2.8 KiB
Lua
|
package.path = package.path .. ";../../?.lua"
|
||
|
sock = require "sock"
|
||
|
bitser = require "spec.bitser"
|
||
|
|
||
|
function love.load()
|
||
|
-- how often an update is sent out
|
||
|
tickRate = 1/60
|
||
|
tick = 0
|
||
|
|
||
|
client = sock.newClient("localhost", 22122)
|
||
|
client:setSerialization(bitser.dumps, bitser.loads)
|
||
|
client:setSchema("playerState", {
|
||
|
"index",
|
||
|
"player",
|
||
|
})
|
||
|
|
||
|
-- store the client's index
|
||
|
-- playerNumber is nil otherwise
|
||
|
client:on("playerNum", function(num)
|
||
|
playerNumber = num
|
||
|
end)
|
||
|
|
||
|
-- receive info on where the players are located
|
||
|
client:on("playerState", function(data)
|
||
|
local index = data.index
|
||
|
local player = data.player
|
||
|
|
||
|
-- only accept updates for the other player
|
||
|
if playerNumber and index ~= playerNumber then
|
||
|
players[index] = player
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
client:on("ballState", function(data)
|
||
|
ball = data
|
||
|
end)
|
||
|
|
||
|
client:on("scores", function(data)
|
||
|
scores = data
|
||
|
end)
|
||
|
|
||
|
client:connect()
|
||
|
|
||
|
function newPlayer(x, y)
|
||
|
return {
|
||
|
x = x,
|
||
|
y = y,
|
||
|
w = 20,
|
||
|
h = 100,
|
||
|
}
|
||
|
end
|
||
|
|
||
|
function newBall(x, y)
|
||
|
return {
|
||
|
x = x,
|
||
|
y = y,
|
||
|
vx = 150,
|
||
|
vy = 150,
|
||
|
w = 15,
|
||
|
h = 15,
|
||
|
}
|
||
|
end
|
||
|
|
||
|
local marginX = 50
|
||
|
|
||
|
players = {
|
||
|
newPlayer(marginX, love.graphics.getHeight()/2),
|
||
|
newPlayer(love.graphics.getWidth() - marginX, love.graphics.getHeight()/2)
|
||
|
}
|
||
|
|
||
|
scores = {0, 0}
|
||
|
|
||
|
ball = newBall(love.graphics.getWidth()/2, love.graphics.getHeight()/2)
|
||
|
end
|
||
|
|
||
|
function love.update(dt)
|
||
|
client:update()
|
||
|
|
||
|
if client:getState() == "connected" then
|
||
|
tick = tick + dt
|
||
|
|
||
|
-- simulate the ball locally, and receive corrections from the server
|
||
|
ball.x = ball.x + ball.vx * dt
|
||
|
ball.y = ball.y + ball.vy * dt
|
||
|
end
|
||
|
|
||
|
if tick >= tickRate then
|
||
|
tick = 0
|
||
|
|
||
|
if playerNumber then
|
||
|
local mouseY = love.mouse.getY()
|
||
|
local playerY = mouseY - players[playerNumber].h/2
|
||
|
|
||
|
-- Update our own player position and send it to the server
|
||
|
players[playerNumber].y = playerY
|
||
|
client:send("mouseY", playerY)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function love.draw()
|
||
|
for _, player in pairs(players) do
|
||
|
love.graphics.rectangle('fill', player.x, player.y, player.w, player.h)
|
||
|
end
|
||
|
|
||
|
love.graphics.rectangle('fill', ball.x, ball.y, ball.w, ball.h)
|
||
|
|
||
|
love.graphics.print(client:getState(), 5, 5)
|
||
|
if playerNumber then
|
||
|
love.graphics.print("Player " .. playerNumber, 5, 25)
|
||
|
else
|
||
|
love.graphics.print("No player number assigned", 5, 25)
|
||
|
end
|
||
|
local score = ("%d - %d"):format(scores[1], scores[2])
|
||
|
love.graphics.print(score, 5, 45)
|
||
|
end
|