jsb-netgame/game.py

87 lines
2.7 KiB
Python

import network, sys, json, pygame, random
pygame.init()
address = ["0.0.0.0", int(sys.argv[1])]
w, h = 640, 480
size = [w, h]
black = [0, 0, 0]
class Player:
def __init__(self, pid, address, pos, color):
self.pid = pid
self.address = address
self.pos = pos
self.color = color
self.speed = [0, 0]
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
sock = network.Sock()
sock.listen(address)
me = Player(random.randint(0,65535), address, [10, 10], [255, 0, 0])
players = {me.pid: me}
def send_all(msg):
msg = json.dumps(msg)
for pid in players:
sock.send(msg, players[pid].address)
sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"pid":me.pid}), ["192.168.0.255", 33033])
sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"pid":me.pid}), ["127.0.0.1", 33033])
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
me.speed[0] = 1
send_all({"type":"move", "pid":me.pid, "speed":me.speed})
elif event.key == pygame.K_LEFT:
me.speed[0] = -1
send_all({"type":"move", "pid":me.pid, "speed":me.speed})
elif event.key == pygame.K_DOWN:
me.speed[1] = 1
send_all({"type":"move", "pid":me.pid, "speed":me.speed})
elif event.key == pygame.K_UP:
me.speed[1] = -1
send_all({"type":"move", "pid":me.pid, "speed":me.speed})
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT or event.key == pygame.K_DOWN or event.key == pygame.K_UP:
me.speed[0] = 0
me.speed[1] = 0
send_all({"type":"move", "pid":me.pid, "speed":me.speed})
for (r, c) in sock.get():
r = json.loads(r.decode())
if r["pid"] == me.pid:
continue
if r["type"] == "join":
pl = []
for pid in players:
player = players[pid]
pl.append({"pid":pid, "pos":player.pos, "color":player.color, "address":player.address})
sock.send(json.dumps({"type":"recap", "players":pl, "pid":me.pid}), [c[0], r["port"]])
players[r["pid"]] = Player(r["pid"], [c[0], r["port"]], r["pos"], r["color"])
elif r["type"] == "move":
players[r["pid"]].speed = r["speed"]
elif r["type"] == "recap":
for player in r["players"]:
if not player["pid"] in players:
players[player["pid"]] = Player(player["pid"], player["address"], player["pos"], player["color"])
screen.fill(black)
pygame.draw.rect(screen, me.color, (*me.pos, 16, 16))
for pid in players:
player = players[pid]
player.pos[0] += player.speed[0]
player.pos[1] += player.speed[1]
pygame.draw.rect(screen, player.color, (*player.pos, 16, 16))
pygame.display.flip()
clock.tick(30)