def test_ReadAndWriteEvent_Keyboard_2(self):
     evt = GameEvent()
     evt.keys = 1
     evt.frame = 1000
     evt.keybits = (1 << 64)-1
     self.template_ReadAndWriteEvent(evt)
예제 #2
0
 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)