def test_ReadAndWriteEvent_Keyboard_2(self): evt = GameEvent() evt.keys = 1 evt.frame = 1000 evt.keybits = (1 << 64)-1 self.template_ReadAndWriteEvent(evt)
def PlayFrames(self, e, s, start_time, max_frame, frame_rate): '''This method is implemented to support UDPGameEngine's PlayAs(). Arguments: e -- The game engine. s -- The game state. start_time -- The time of game start. max_frame -- The number of frames to play. frame_rate -- The number of frames to play per second. ''' assert e != None assert s != None assert isinstance(frame_rate, int) assert frame_rate > 0 assert frame_rate <= 32767 start_frame = s.frame end_frame = start_frame + max_frame timeout = 0.0 key_event = e.RoleToEvent(s.roles[e.player_id]) send_rate = 10 time_between_send = 1.0 / send_rate next_send = 0.0 msg = GameEvent() while True: if s.frame >= end_frame: break now = time.time() target_frame = e.GetCurrentFrame(start_time, frame_rate, now) logger.debug('Playing from frome {0}, target {1}.'.format(s.frame, target_frame)) should_send = self.HandleKeyboardEvents(e, e.bitrec, s.frame, e.buffer_delay, e.key_cool_down_time, e.buffer_size) # Send bitrec to server. if e.server != None and (now >= next_send or should_send): msg.keybits = e.bitrec.bits[e.player_id] msg.frame = e.bitrec.frame next_send = now + time_between_send logger.debug('Sending key {0}, {1}'.format(msg.frame, bin(msg.keybits))) try: e.server.WriteEvent(msg) except Exception as ex: logger.exception(ex) logger.info('Disconnecting from server and ending.') e.server.Close() e.server = None e.EndGame(s) self.HandleServerEvents(e, s, e.rec, e.buffer_size) e.UpdateBitRecordFrame(e.bitrec, max(e.bitrec.frame, target_frame), e.buffer_size) play_to = min(target_frame, end_frame, e.bitrec.frame) if s.frame < e.bitrec.frame - e.buffer_size: logger.debug('Client is behind.') # bail out until server update. # to do: reset unacked s.frame = e.bitrec.frame - e.buffer_size self.behind_count += 1 if s.frame < play_to: e.PlayFromStateWithPlayer(s, e.bitrec, e.rec, play_to, e.player_id, e.buffer_size) e.renderer.Render(s, s, 0, 0)