From a0cebd89fbae4119e06d53442ca2d690cc618df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Eng=C3=A9libert?= Date: Sat, 10 Feb 2024 13:30:58 +0100 Subject: [PATCH] Fixes, player speed --- game.py | 62 ++++++++++++++++++++++++++++++++++++------------------ network.py | 14 ++++++++---- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/game.py b/game.py index edb50af..cbaffe5 100644 --- a/game.py +++ b/game.py @@ -1,17 +1,19 @@ -import network, sys, json, pygame +import network, sys, json, pygame, random pygame.init() -address = ("0.0.0.0", 33033) +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, address, pos, color): + 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() @@ -19,40 +21,56 @@ clock = pygame.time.Clock() sock = network.Sock() sock.listen(address) -me = Player(address, [10, 10], [255, 0, 0]) -players = {} +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}), ("192.168.0.255", 33033)) +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.pos[0] += 1 - send_all({"type":"move", "x":me.pos[0], "y":me.pos[1]}) - elif event.key == pygame.K_left: - me.pos[0] -= 1 - send_all({"type":"move", "x":me.pos[0], "y":me.pos[1]}) - elif event.key == pygame.K_bottom: - me.pos[1] += 1 - send_all({"type":"move", "x":me.pos[0], "y":me.pos[1]}) - elif event.key == pygame.K_top: - me.pos[1] -= 1 - send_all({"type":"move", "x":me.pos[0], "y":me.pos[1]}) + 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": - players[c] = Player(c, r["pos"], r["color"]) + 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[c].pos[0] += r["x"] - players[c].pos[1] += r["y"] + 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) @@ -60,6 +78,8 @@ while True: 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() diff --git a/network.py b/network.py index f5fc302..5ead593 100644 --- a/network.py +++ b/network.py @@ -1,6 +1,8 @@ -import socket +import socket, os, sys from threading import Thread, Lock +NETTRACE = str(os.environ.get("NETTRACE", "0")) == "1" + class Sock: def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -13,10 +15,12 @@ class Sock: def send(self, message, address): if type(message) == str: message = message.encode() - self.sock.sendto(message, address) + if NETTRACE: + print("Send to", tuple(address), ":", message, file=sys.stderr) + self.sock.sendto(message, tuple(address)) def listen(self, address, length=65535): - self.sock_thread = SockThread(self, address, length) + self.sock_thread = SockThread(self, tuple(address), length) self.sock_thread.start() def get(self): @@ -32,10 +36,12 @@ class SockThread(Thread): Thread.__init__(self) self.sock = sock self.length = length - self.sock.sock.bind(address) + self.sock.sock.bind(tuple(address)) def run(self): while True: r = self.sock.sock.recvfrom(self.length) + if NETTRACE: + print("Rec from", r[1], ":", r[0], file=sys.stderr) with self.sock.queue_lock: self.sock.queue.append(r)