Make remote control sticky and revise headless server

This commit is contained in:
Nguyễn Gia Phong 2018-02-27 22:25:58 +07:00
parent 0cfeaf9cab
commit 781b347fcb
3 changed files with 34 additions and 25 deletions

View File

@ -51,9 +51,9 @@ class Hero:
wound (float): amount of wound
sfx_heart (pygame.mixer.Sound): heart beat sound effect
"""
def __init__(self, surface, fps):
def __init__(self, surface, fps, maze_size):
self.surface = surface
w, h = self.surface.get_width(), self.surface.get_height()
w, h = maze_size
self.x, self.y = w >> 1, h >> 1
self.angle, self.color = pi / 4, TANGO['Aluminium']
self.R = (w * h / sin(pi*2/3) / 624) ** 0.5
@ -99,9 +99,9 @@ class Hero:
trigon = regpoly(sides, self.R, self.angle, self.x, self.y)
fill_aapolygon(self.surface, trigon, self.color[int(self.wound)])
def resize(self):
def resize(self, maze_size):
"""Resize the hero."""
w, h = self.surface.get_width(), self.surface.get_height()
w, h = maze_size
self.x, self.y = w >> 1, h >> 1
self.R = (w * h / sin(pi*2/3) / 624) ** 0.5

View File

@ -124,8 +124,9 @@ class Game:
self.server.listen(1)
print('Socket server is listening on {}:{}'.format(config.host,
config.port))
self.sockinp = 0, 0, 225, 0, 0 # freeze and point to NW
else:
self.server = None
self.server = self.sockinp = None
self.headless = config.headless
# self.fps is a float to make sure floordiv won't be used in Python 2
@ -174,7 +175,7 @@ class Game:
for row in walls))
x, y = self.expos(maze.x, maze.y)
lines.appendleft('{} {} {} {} {} {} {:.0f} {:d} {:d}'.format(
len(walls), ne, nb, maze.get_score(), x, y, hero.wound * 100,
len(walls), ne, nb, maze.get_score(), x, y, hero.wound,
hero.next_strike <= tick, hero.next_heal <= tick))
return '\n'.join(lines).encode()
@ -183,15 +184,6 @@ class Game:
Return False if QUIT event is captured, True otherwise.
"""
# Compare current FPS with the average of the last 10 frames
new_fps = self.clock.get_fps()
if new_fps < self.fps:
self.fps -= 1
elif self.fps < self.max_fps and not self.paused:
self.fps += 5
if not self.paused: self.maze.update(self.fps)
self.clock.tick(self.fps)
events = pygame.fastevent.get()
for event in events:
if event.type == QUIT:
@ -211,7 +203,16 @@ class Game:
pygame.mixer.music.play(-1)
else:
pygame.mixer.quit()
# Compare current FPS with the average of the last 10 frames
new_fps = self.clock.get_fps()
if new_fps < self.fps:
self.fps -= 1
elif self.fps < self.max_fps and not self.paused:
self.fps += 5
if not self.paused: self.maze.update(self.fps)
if not self.headless: self.maze.draw()
self.clock.tick(self.fps)
return True
def move(self, x, y):
@ -251,20 +252,26 @@ class Game:
This function is supposed to be run in a Thread.
"""
clock = Clock()
while True:
connection, address = self.server.accept()
print('Connected to {}:{}'.format(*address))
self.maze.reinit()
while not self.hero.dead:
data = self.export()
connection.send('{:06}'.format(len(data)).encode())
connection.send('{:08}'.format(len(data)).encode())
connection.send(data)
buf = connection.recv(8)
try:
buf = connection.recv(8)
except: # client is likely to be closed
break
if not buf: break
move, angle, attack = (int(i) for i in buf.decode().split())
y, x = (i - 1 for i in divmod(move, 3))
self.control(x, y, radians(angle), attack & 1, attack >> 1)
self.sockinp = x, y, radians(angle), attack & 1, attack >> 1
clock.tick(self.fps)
self.maze.lose()
self.sockinp = 0, 0, 225, 0, 0
print('{1}:{2} scored {0} points'.format(
self.maze.get_score(), *address))
connection.close()
@ -355,6 +362,6 @@ def main():
socket_thread = Thread(target=game.remote_control)
socket_thread.daemon = True # make it disposable
socket_thread.start()
while game.update(): pass
while game.update(): game.control(*game.sockinp)
else:
while game.update(): game.user_control()

View File

@ -78,11 +78,13 @@ class Maze:
sfx_slash (pygame.mixer.Sound): sound effect of slashed enemy
sfx_lose (pygame.mixer.Sound): sound effect to be played when you lose
"""
def __init__(self, fps, size, scrtype, headless=False):
def __init__(self, fps, size, scrtype, headless):
self.fps = fps
if not headless:
self.w, self.h = size
self.scrtype = scrtype
self.w, self.h = size
self.scrtype = scrtype
if headless:
self.surface = None
else:
self.surface = pygame.display.set_mode(size, self.scrtype)
self.distance = (self.w * self.h / 416) ** 0.5
@ -100,7 +102,7 @@ class Maze:
self.bullets, self.enemies = [], []
self.enemy_weights = {color: MINW for color in ENEMIES}
self.add_enemy()
self.hero = Hero(self.surface, fps)
self.hero = Hero(self.surface, fps, size)
self.map[MIDDLE][MIDDLE] = HERO
self.next_move = self.next_slashfx = 0
self.slashd = self.hero.R + self.distance/SQRT2
@ -327,7 +329,7 @@ class Maze:
"""Resize the maze."""
self.w, self.h = size
self.surface = pygame.display.set_mode(size, self.scrtype)
self.hero.resize()
self.hero.resize(size)
offsetx = (self.centerx-self.x) / self.distance
offsety = (self.centery-self.y) / self.distance