11#!/usr/bin/env python
2+
23from argparse import ArgumentParser
34
45import pygame as pg
56from pygame .locals import QUIT
67
7- import redis
8+ from redis import Redis
89
910from screen import Screen
1011from player import Player
1112from others import Others
1213
14+ # 2 differents speeds
15+ #
16+ # if we do too few frames per second,
17+ # after another player moves, we may see it very late
18+ # (worst case: if FRAME_RATE is 4, then the delay may reach 250ms)
19+ #
20+ # so, we set our frame rate higher; BUT on the other hand
21+ # this also results in the player moving too fast
22+ # so FRAMES_PER_MOVE is defined so we move our player only once every n frames
23+
24+ # how often we redisplay the screen
25+ FRAME_RATE = 10
26+ # we move our player that many times slower
27+ FRAMES_PER_MOVE = 3
1328
14- # xxx need to separate player speed and frame rate
15- FRAME_RATE = 4
1629
1730def main ():
1831
1932 parser = ArgumentParser ()
2033 parser .add_argument ("-s" , "--server" , default = None ,
2134 help = "IP adddress for the redis server" )
35+ parser .add_argument ("-a" , "--auto-move" , action = "store_true" ,
36+ help = "auto move" )
2237 parser .add_argument ("name" )
2338 args = parser .parse_args ()
2439
@@ -32,43 +47,46 @@ def main():
3247
3348 clock = pg .time .Clock ()
3449
35- redis_server = redis . Redis (args .server )
50+ redis_server = Redis (args .server , decode_responses = True )
3651
3752 player = Player (local_player_name , H , W , redis_server )
3853 player .join ()
3954
4055 others = Others (redis_server )
4156
4257 # ask the redis server where the other players are
43- players = others .all_players ()
58+ players = others .fetch_all_players ()
4459 screen .display (players )
4560
4661 # type 'a' to toggle auto move
47- auto_move = False
62+ auto_move = args . auto_move
4863
64+ counter = 0
4965 while True :
66+ # sync with the frame rate
5067 clock .tick (FRAME_RATE )
51- if auto_move :
52- player . random_move ()
53- for event in pg . event . get ():
54- if ( event . type == QUIT or
55- ( event . type == pg . KEYDOWN and event . key == pg . K_q )):
56- player . leave ()
57- return
58- if event . type == pg . KEYDOWN :
59- if event . key == pg . K_UP :
60- player .move ( 0 , - 1 )
61- elif event . key == pg . K_DOWN :
62- player . move ( 0 , 1 )
63- elif event .key == pg . K_RIGHT :
64- player . move ( 1 , 0 )
65- elif event . key == pg . K_LEFT :
66- player . move ( - 1 , 0 )
67- elif event .key == pg .K_a :
68+ # get the position of other players
69+ players = others . fetch_all_players ()
70+
71+ # move the local player
72+ # actually do all this only once every FRAMES_PER_MOVE frames
73+ counter += 1
74+ if counter % FRAMES_PER_MOVE == 0 :
75+ counter = 0
76+ if auto_move :
77+ player .random_move ( )
78+
79+ for event in pg . event . get ():
80+ if ( event .type == QUIT or
81+ ( event . type == pg . KEYDOWN and event . key == pg . K_q )):
82+ player . leave ()
83+ return
84+ elif event .type == pg . KEYDOWN and event . key == pg .K_a :
6885 auto_move = not auto_move
69- # again, refresh the position of other players
70- players = others .all_players ()
71- # and redisplay accordingly
86+ else :
87+ player .handle_event (event )
88+
89+ # redisplay accordingly every frame
7290 screen .display (players )
7391
7492
0 commit comments