4 doFile(Path
with(launchPath
, "Tank.io"))
6 systemfont
:= Font clone open("Library/Fonts/Free/FreeSans.ttf") setPointSize(14)
8 GameClient
:= Object clone
9 GameClient
parent := OpenGL
10 GameClient objects
:= Map clone
11 GameClient player
:= nil
12 GameClient clientId
:= "nil"
13 GameClient
message := "running client"
15 GameClient reshape
:= method(w
, h
,
18 glViewport(0, 0, w
, h
)
19 glMatrixMode(GL_PROJECTION
)
21 gluOrtho2D(0, w
, 0, h
)
22 glMatrixMode(GL_MODELVIEW
)
27 GameClient display
:= method(
28 glClearColor(.1,.6,.1,1)
30 glClear(GL_COLOR_BUFFER_BIT
)
33 objects
foreach(i
, object
, object draw
)
37 systemfont
drawString(message)
43 GameClient keyboard
:= method(key
, x
, y
,
45 self message := "key := " .. k
46 self serverConnection
send("k", k
)
49 GameClient motion
:= method(x
, y
, nil
)
50 GameClient passiveMotion
:= method(x
, y
, nil
)
51 GameClient mouse
:= method(button
, state
, x
, y
, nil
)
53 GameClient timer
:= method(v
,
59 GameClient run
:= method(
60 glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA
)
61 glutInitWindowSize(512, 512)
63 glutCreateWindow("Multiplayer Game")
64 glutEventTarget(GameClient
)
73 glEnable(GL_LINE_SMOOTH
)
75 glBlendFunc(GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
)
76 glHint(GL_LINE_SMOOTH_HINT
, GL_NICEST
)
84 // --- Networking
-----------------------------------
86 GameClient connect
:= method(
87 self serverConnection
:= ServerConnection
setDelegate(self)
88 self serverConnection setup
89 self serverConnection
@run
92 // --- Delegate methods
-----------------------------------
94 GameClient setClientId
:= method(id
,
99 GameClient add
:= method(id
, type,
100 write("add ", id
, " '", type, "'\n")
101 objects
atPut(id
, getSlot(type) clone)
104 GameClient remove
:= method(id
,
105 write("remove ", id
, "\n")
109 GameClient update
:= method(id
, x
, y
, angle
,
110 write("update ", id
, "\n")
111 obj
:= objects
at(id
)
117 write("no object with id '", id
, "' found for update\n")
121 // --- ServerConnection
-----------------------------------
123 ServerConnection
:= Object clone
124 ServerConnection setDelegate
:= method(d
, self delegate
:= d
; self)
125 ServerConnection setup
:= method(
126 ip
:= if(args
at(0), args
at(0), "67.118.104.220")
127 port
:= if(args
at(1), args
at(1), 8888)
128 self socket
:= Socket clone setHost(ip
) setPort(port
) connect
129 if (socket
== nil
, write("Unable to connect to ", ip
, " on port ", port
, "\n"); exit)
132 ServerConnection run
:= method(
133 while (socket isOpen
,
135 text
:= socket readBuffer asString
136 //Object write("got: " .. text
.. "\n")
137 p
:= text
splitNoEmpties(" ")
139 if (action
== "i", delegate
setClientId(p
at(1)) )
140 if (action
== "a", delegate
append(p
at(1), p
at(2)) )
142 delegate
update(p
at(1), p
at(2) asNumber
, p
at(3) asNumber
, p
at(4) asNumber
)
144 if (action
== "r", delegate
remove(p
at(1)) )
146 socket readBuffer empty
151 ServerConnection send
:= method(action
, value
,
152 s
:= action
.. " " .. value
.. " "
153 write("send: " , s
, "\n")