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
|
local enet = require"enet"
local words = require"common.words"
local PLAYER_SIZE = 30
local local_player = false
-- {
-- pos={100,100},
-- color={love.math.colorFromBytes(0xdf,0x73,0xff)},
-- }
local host,peer
local function draw_player(pl,me)
local hplsz = PLAYER_SIZE/2
love.graphics.setColor(pl.color)
love.graphics.rectangle("fill",pl.pos[1]-hplsz,pl.pos[2]-hplsz,PLAYER_SIZE,PLAYER_SIZE)
love.graphics.setColor(0,0,0)
love.graphics.print(tostring(pl.id),pl.pos[1],pl.pos[2])
if me then
love.graphics.setColor(1,1,1)
love.graphics.rectangle("line",pl.pos[1]-hplsz,pl.pos[2]-hplsz,PLAYER_SIZE,PLAYER_SIZE)
end
end
local remote_players = {}
local function update_local_player(pl,dt)
local SPEED = 300 -- pixels/sec
local function kd(code)
if love.keyboard.isScancodeDown(code) then return 1 else return 0 end
end
local dx = kd"d"-kd"a"
local dy = kd"s"-kd"w"
if dx == 0 and dy == 0 then
pl.pos_dirty = false
return
end
if dx ~= 0 and dy ~= 0 then
dx = dx / math.sqrt(2)
dy = dy / math.sqrt(2)
end
pl.pos[1] = pl.pos[1] + SPEED * dt * dx
pl.pos[2] = pl.pos[2] + SPEED * dt * dy
pl.pos_dirty = true
end
local function sync_local_player(pl,peer)
-- send updated info about local player to server
if pl.pos_dirty then
peer:send(words.join("ppos",pl.pos[1],pl.pos[2]))
end
end
function love.update(dt)
if local_player then
update_local_player(local_player,dt)
sync_local_player(local_player,peer)
end
repeat
local ev = host:service()
if ev and ev.type == "receive" then
local w = words.split(ev.data)
local op = w[1]
if op == "join" then
local id,x,y,r,g,b = unpack(w,2)
-- blegh
id=tonumber(id)
x=tonumber(x)
y=tonumber(y)
r=tonumber(r)
g=tonumber(g)
b=tonumber(b)
remote_players[id] = {pos={x,y},color={r,g,b},id=id}
elseif op == "leave" then
local id = tonumber(w[2])
remote_players[id]=nil
elseif op == "move" then
local id,x,y = unpack(w,2)
id=tonumber(id)
x=tonumber(x)
y=tonumber(y)
assert(remote_players[id],"wheeze")
remote_players[id].pos[1] = x
remote_players[id].pos[2] = y
elseif op == "you" then
local id,x,y,r,g,b = unpack(w,2)
id=tonumber(id)
x=tonumber(x)
y=tonumber(y)
r=tonumber(r)
g=tonumber(g)
b=tonumber(b)
local_player = {pos={x,y},color={r,g,b},id=id}
end
end
until not ev
end
function love.draw()
if local_player then
draw_player(local_player,true)
end
for _,pl in pairs(remote_players) do
draw_player(pl)
end
end
function love.load()
host = enet.host_create()
peer = host:connect("localhost:8473")
end
function love.quit()
peer:disconnect()
host:flush()
end
|