HorseSeaHorse/lib/sock/examples/pong/client/main.lua
2021-02-07 00:37:19 -06:00

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