import network, sys, json, pygame, random, xlog 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, oid, address, pos, color): self.oid = oid self.address = address self.pos = pos self.color = color self.speed = [0, 0] self.life = 100 self.direction = [1, 0] def stab(self): for oid in players: if oid == self.oid: continue player = players[oid] if abs(player.pos[0]-self.pos[0]) < 32 and abs(player.pos[1]-self.pos[1]) < 32: player.damage(10) def damage(self, dmg): self.life -= dmg def update(self): self.pos[0] += self.speed[0] self.pos[1] += self.speed[1] def draw(self, surface): pygame.draw.rect(surface, self.color, (self.pos[0]-8, self.pos[1]-8, 16, 16)) lifebar = int(32*self.life/100) pygame.draw.rect(surface, (64,255,64), (self.pos[0]-lifebar//2+8, self.pos[1]+6, lifebar, 4)) def print_debug(self, lines): lines.append("Player {}: {}".format(self.oid, obj.address)) class EnergyBall: def __init__(self, oid, pos, speed): self.oid = oid self.pos = pos self.speed = speed def update(self): self.pos[0] += self.speed[0] self.pos[1] += self.speed[1] for oid in players: player = players[oid] if abs(self.pos[0]-player.pos[0])<8 or abs(self.pos[1]-player.pos[1])<8: def draw(self, surface): pygame.draw.rect(surface, (128,255,255), (self.pos[0]-2, self.pos[1]-2, 4, 4)) def print_debug(self, lines): pass screen = pygame.display.set_mode(size) clock = pygame.time.Clock() sock = network.Sock() sock.listen(address) me = Player(random.randint(0,2147483648), address, [10, 10], [255, 0, 0]) objects = {me.oid: me} players = {me.oid: me} def send_all(msg): msg = json.dumps(msg) for oid in players: sock.send(msg, objects[oid].address) sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"oid":me.oid}), ["192.168.0.255", 33033]) sock.send(json.dumps({"type":"join","pos":me.pos,"color":me.color,"port":address[1],"oid":me.oid}), ["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_ESCAPE: send_all({"type":"quit", "oid":me.oid}) sys.exit() if event.key == pygame.K_RIGHT: me.speed[0] = 2 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_LEFT: me.speed[0] = -2 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_DOWN: me.speed[1] = 2 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_UP: me.speed[1] = -2 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_SPACE: me.stab() send_all({"type":"stab", "oid":me.oid}) elif event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT: me.speed[0] = 0 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_LEFT: me.speed[0] = 0 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_DOWN: me.speed[1] = 0 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) elif event.key == pygame.K_UP: me.speed[1] = 0 send_all({"type":"move", "oid":me.oid, "speed":me.speed}) for (r, c) in sock.get(): r = json.loads(r.decode()) if r["oid"] == me.oid: continue if r["type"] == "join": pl = [] for oid in players: player = players[oid] pl.append({"oid":oid, "pos":player.pos, "color":player.color, "address":player.address}) sock.send(json.dumps({"type":"recap", "players":pl, "oid":me.oid}), [c[0], r["port"]]) players[r["oid"]] = Player(r["oid"], [c[0], r["port"]], r["pos"], r["color"]) elif r["type"] == "move": players[r["oid"]].speed = r["speed"] elif r["type"] == "recap": for player in r["players"]: if not player["oid"] in players: address = player["address"] if address[0] == "0.0.0.0": address = [c[0], c[1]] objects[player["oid"]] = Player(player["oid"], address, player["pos"], player["color"]) players[player["oid"]] = objects[player["oid"]] elif r["type"] == "quit": players.pop(r["oid"]) objects.pop(r["oid"]) elif r["type"] == "stab": objects[r["oid"]].stab() screen.fill(black) lines = [] for oid in objects: obj = objects[oid] obj.update() obj.draw(screen) obj.print_debug(lines) xlog.display(screen, lines) pygame.display.flip() clock.tick(30)