Sorry, as i've said i've not played with sockets directly much. On Monday, May 25, 2015 at 7:43:25 PM UTC-4, PirlKnighte wrote: > > 1) How did you yield the mail loop to allow for packet passing? I've > tried adding forced pauses, but that didn't seem to do anything. >
Yield is a python generator <https://wiki.python.org/moin/Generators> function, I had adapted an example I had found to work with Twisted specifically. I can't quite find the link right now but I'll just attach an example script that will hopefully provide the answers you need (you'll need twisted to run it). > 2) What does it mean to 'fold' the network I/O and update? I have not run > across that term before. > Generally it means to include, or combine, more or less, its not necessarily a programmer specific term. In this case to include a reference to your network code in your update loop so it can check for incoming data. -- You received this message because you are subscribed to the Google Groups "pyglet-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyglet-users+unsubscr...@googlegroups.com. To post to this group, send email to pyglet-users@googlegroups.com. Visit this group at http://groups.google.com/group/pyglet-users. For more options, visit https://groups.google.com/d/optout.
import pyglet from pyglet.window import mouse from pyglet.window import key from pyglet import clock from twisted.internet.endpoints import TCP4ServerEndpoint from twisted.internet.protocol import Protocol from twisted.internet.protocol import Factory from twisted.internet.protocol import ClientFactory from twisted.internet import reactor from twisted.internet import task import pickle import zlib pyglet.options['debug_gl'] = False #primary window/game class #/---------------------------------------------------------------------------/ class Prototype(pyglet.window.Window): def __init__(self): super(Prototype, self).__init__(640, 480, resizable=False, fullscreen=False, caption="Test") self.clear() #connected user variable, when someone connects the Echo Class will add itself into it. #then just call self.user.sendData to transmit to the connected user or self.user.dataRecieved to get data. self.user = [] self.server = None #since the Reactor is in control, to properly run the main game loop you have to manually call the clock. #this variable is to keep track of the last time the clock was ticked. self.old_dt = clock.tick() self.fps_display = pyglet.clock.ClockDisplay() #main game loop #/---------------------------------------------------------------------------/ def update(self): while not self.has_exit: #manually dispatch window events (since twisted reactor is in control) self.dispatch_events() #Make sure events are timed properly while coiterating with network layer. That and tick clock events like the fps counter and game pacing. dt = clock.tick() self.old_dt = self.old_dt + dt #if enough time has passed, update game state if self.old_dt >= 0.025: self.old_dt = 0 self.clear() self.fps_display.draw() #draw here and manually flip frame buffers self.flip() #return control to twisted Reactor yield 1 #mouse click #/---------------------------------------------------------------------------/ def on_mouse_press(self,x,y,button,modifiers): if button == pyglet.window.mouse.LEFT: if len(self.user) != 0: data = ['left_press',x,y] for a in self.user: a.sendData(data) if button == pyglet.window.mouse.RIGHT: if len(self.user) != 0: data = ['right_press',x,y] for a in self.user: a.sendData(data) #/---------------------------------------------------------------------------/ def on_mouse_release(self,x,y,button,modifiers): if button == pyglet.window.mouse.LEFT: #if someone has logged in, transmit if you click the mouse if len(self.user) != 0: data = ['left_release',x,y] for a in self.user: a.sendData(data) if button == pyglet.window.mouse.RIGHT: #if someone has logged in, transmit if you click the mouse if len(self.user) != 0: data = ['right_release',x,y] for a in self.user: a.sendData(data) #/---------------------------------------------------------------------------/ def on_key_release(self,symbol, modifiers): if symbol == key.S: self.server = TCP4ServerEndpoint(reactor, 8007) self.server.listen(QOTDFactory()) print "server initializing" if symbol == key.C: reactor.connectTCP('localhost', 8007, EchoClientFactory()) print "connecting" #shutdown program gracefully #/---------------------------------------------------------------------------/ def shutdown(self, result): reactor.stop() #system error shutdown #/---------------------------------------------------------------------------/ def bailout(self, reason): reason.printTraceback() reactor.stop() #main network/server client #/---------------------------------------------------------------------------/ class Echo(Protocol): #connection established def connectionMade(self): data = "An apple a day keeps the doctor away\r\n" data = pickle.dumps(data) compressed = zlib.compress(data) self.transport.write(compressed) window.user.append(self) #recieve data #/---------------------------------------------------------------------------/ def dataReceived(self, data): data = zlib.decompress(data) data = pickle.loads(data) if data[0] == 'left_press': print '1' if data[0] == 'left_release': print '2' if data[0] == 'right_press': print '3' if data[0] == 'right_release': print '4' # print data #send data #/---------------------------------------------------------------------------/ def sendData(self,data): data = pickle.dumps(data) data = zlib.compress(data) self.transport.write(data) #this monitors the port and automatically calls Echo() when someone connects, passing their address to it. #/---------------------------------------------------------------------------/ class QOTDFactory(Factory): def buildProtocol(self, addr): print addr, "connected." return Echo() #This class establishes a connection to a server. #/---------------------------------------------------------------------------/ class EchoClientFactory(ClientFactory): def startedConnecting(self, connector): print 'Started to connect.' def buildProtocol(self, addr): print 'Connected.' return Echo() def clientConnectionLost(self, connector, reason): print 'Lost connection. Reason:', reason def clientConnectionFailed(self, connector, reason): print 'Connection failed. Reason:', reason if __name__ == '__main__': #initialize main window window = Prototype() #port to listen to task.coiterate(window.update()).addCallback(window.shutdown).addErrback(window.bailout) #start reactor loop reactor.run()