#! /usr/bin/env python import time import pygame import struct import random from pygame.locals import * from twisted.internet.protocol import DatagramProtocol, Factory from twisted.internet import reactor, task class Network(DatagramProtocol): def __init__(self, mygame): self.mygame = mygame def startProtocol(self): print "Started." self.mygame.setProtocol(self) def datagramReceived(self, data, (host, port)): #print "received %r from %s:%d" % (data, host, port) self.mygame.dataRecieved(struct.unpack("hhh",data)) def mouseEvent(self, playerno,x,y): self.transport.write(struct.pack("hhh",playerno,x,y), ('208.101.16.146', 9999)) pass class Player(pygame.sprite.Sprite): def __init__(self,protocol,playerno): pygame.sprite.Sprite.__init__(self, self.containers) self.image = pygame.Surface((32, 32)) clr=75 for i in range(32): clr += 4 self.image.fill((clr, 0, 0), (i, 0, 1, 32)) self.rect = self.image.get_rect() self.protocol = protocol self.playerno = playerno def update(self): self.rect.center = pygame.mouse.get_pos() self.protocol.mouseEvent(self.playerno,self.rect.x,self.rect.y) class Other(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self, self.containers) self.image = pygame.Surface((32, 32)) clr=75 for i in range(32): clr += 4 self.image.fill((0, clr, 0), (i, 0, 1, 32)) self.rect = self.image.get_rect() def setCenter(self, pos): self.rect.center = pos class Game: protocol = None def __init__(self): pygame.init() pygame.display.set_caption("Online Test Thingy") self.screen = pygame.display.set_mode((640, 480), HWSURFACE|DOUBLEBUF) self.sprites = pygame.sprite.RenderUpdates() Player.containers = self.sprites Other.containers = self.sprites self.playerno = random.randrange(1,1000) # your unique player id self.other = Other() # other player class pygame.mouse.set_visible(0) event_loop = task.LoopingCall(self.pygame_loop) event_loop.start(0.01, now=True) def dataRecieved(self, data): if data[0] <> self.playerno: print data self.other.setCenter((data[1],data[2])) self.sprites.update() def pygame_loop(self): if self.protocol != None: for event in pygame.event.get(): if((event.type == KEYDOWN and event.key == K_ESCAPE) or event.type == QUIT): reactor.stop() self.other.setCenter((320, 240)) self.screen.fill((0, 0, 255)) clr=55 for i in range(65): clr += 3 self.screen.fill((0, 0, clr), (i*10, 0, 10, 480)) self.sprites.draw(self.screen) self.sprites.update() pygame.display.flip() def setProtocol(self, protocol): """attach a protocol instance to post the events to""" self.protocol = protocol self.player = Player(self.protocol, self.playerno) print "Set!" if __name__ == "__main__": mygame = Game() reactor.listenUDP(0, Network(mygame)) reactor.run()