From 286303522852b41edfa55b9f87162f331c0d80da Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Sat, 3 Feb 2024 18:57:23 +0100 Subject: [PATCH] Game --- demo.py | 2 +- game.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ network.py | 4 +++- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 game.py diff --git a/demo.py b/demo.py index 50bd62e..4c79817 100644 --- a/demo.py +++ b/demo.py @@ -7,7 +7,7 @@ port = int(sys.argv[2]) if sys.argv[1] == "s": sock.listen(("0.0.0.0", port)) while True: - for d, a in sock.poll(): + for d, a in sock.get(): print(d, a) time.sleep(0.1) elif sys.argv[1] == "c": diff --git a/game.py b/game.py new file mode 100644 index 0000000..edb50af --- /dev/null +++ b/game.py @@ -0,0 +1,66 @@ +import network, sys, json, pygame + +pygame.init() + +address = ("0.0.0.0", 33033) +w, h = 640, 480 +size = [w, h] +black = [0, 0, 0] + +class Player: + def __init__(self, address, pos, color): + self.address = address + self.pos = pos + self.color = color + +screen = pygame.display.set_mode(size) +clock = pygame.time.Clock() + +sock = network.Sock() +sock.listen(address) + +me = Player(address, [10, 10], [255, 0, 0]) +players = {} + +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)) + +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]}) + for (r, c) in sock.get(): + r = json.loads(r.decode()) + if r["type"] == "join": + players[c] = Player(c, r["pos"], r["color"]) + elif r["type"] == "move": + players[c].pos[0] += r["x"] + players[c].pos[1] += r["y"] + + screen.fill(black) + + pygame.draw.rect(screen, me.color, (*me.pos, 16, 16)) + + for pid in players: + player = players[pid] + pygame.draw.rect(screen, player.color, (*player.pos, 16, 16)) + + pygame.display.flip() + clock.tick(30) diff --git a/network.py b/network.py index 7cbe3c0..f5fc302 100644 --- a/network.py +++ b/network.py @@ -4,6 +4,8 @@ from threading import Thread, Lock class Sock: def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) self.queue = [] self.queue_lock = Lock() self.sock_thread = None @@ -17,7 +19,7 @@ class Sock: self.sock_thread = SockThread(self, address, length) self.sock_thread.start() - def poll(self): + def get(self): if len(self.queue) == 0: return [] with self.queue_lock: