HorseSeaHorse/lib/sock/examples/pong/server/main.lua

137 lines
3.4 KiB
Lua
Raw Permalink Normal View History

2021-02-07 00:37:19 -06:00
package.path = package.path .. ";../../?.lua"
sock = require "sock"
bitser = require "spec.bitser"
-- Utility functions
function isColliding(this, other)
return this.x < other.x + other.w and
this.y < other.y + other.h and
this.x + this.w > other.x and
this.y + this.h > other.y
end
function love.load()
-- how often an update is sent out
tickRate = 1/60
tick = 0
server = sock.newServer("*", 22122, 2)
server:setSerialization(bitser.dumps, bitser.loads)
-- Players are being indexed by peer index here, definitely not a good idea
-- for a larger game, but it's good enough for this application.
server:on("connect", function(data, client)
-- tell the peer what their index is
client:send("playerNum", client:getIndex())
end)
-- receive info on where a player is located
server:on("mouseY", function(y, client)
local index = client:getIndex()
players[index].y = y
end)
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)
server:update()
-- wait until 2 players connect to start playing
local enoughPlayers = #server.clients >= 2
if not enoughPlayers then return end
for i, player in pairs(players) do
-- This is a naive solution, if the ball is inside the paddle it might bug out
-- But hey, it's low stakes pong
if isColliding(ball, player) then
ball.vx = ball.vx * -1
ball.vy = ball.vy * -1
end
end
-- Left/Right bounds
if ball.x < 0 or ball.x > love.graphics.getWidth() then
if ball.x < 0 then
scores[2] = scores[2] + 1
else
scores[1] = scores[1] + 1
end
server:sendToAll("scores", scores)
ball.x = love.graphics.getWidth()/2
ball.y = love.graphics.getHeight()/2
ball.vx = ball.vx * -1
ball.vy = ball.vy * -1
end
-- Top/Bottom bounds
if ball.y < 0 or ball.y > love.graphics.getHeight() - ball.h then
ball.vy = ball.vy * -1
if ball.y < 0 then
ball.y = 0
end
if ball.y > love.graphics.getHeight() - ball.h then
ball.y = love.graphics.getHeight() - ball.h
end
end
ball.x = ball.x + ball.vx * dt
ball.y = ball.y + ball.vy * dt
tick = tick + dt
if tick >= tickRate then
tick = 0
for i, player in pairs(players) do
server:sendToAll("playerState", {i, player})
end
server:sendToAll("ballState", ball)
end
end
function love.draw()
for i, 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)
local score = ("%d - %d"):format(scores[1], scores[2])
love.graphics.print(score, 5, 5)
end