forked from Telos4/RoboRally
show current program in beamer mode + general improvements; stable version
This commit is contained in:
parent
e669b10ebc
commit
3d64e2e834
|
@ -245,6 +245,7 @@ class Program:
|
||||||
tile['star'] = False
|
tile['star'] = False
|
||||||
|
|
||||||
if all([not t['star'] for t in self.board.tiles.flatten()]):
|
if all([not t['star'] for t in self.board.tiles.flatten()]):
|
||||||
|
self.robot.update_pos(self.board.get_xdims(), self.board.get_ydims())
|
||||||
print("YOU WON")
|
print("YOU WON")
|
||||||
return 'won'
|
return 'won'
|
||||||
|
|
||||||
|
@ -315,6 +316,8 @@ class Game:
|
||||||
self.run_text = myfont.render('RUN', False, tuple(BLACK))
|
self.run_text = myfont.render('RUN', False, tuple(BLACK))
|
||||||
self.stop_text = myfont_small.render('STOP', False, tuple(BLACK))
|
self.stop_text = myfont_small.render('STOP', False, tuple(BLACK))
|
||||||
self.step_text = myfont_small.render('STEP', False, tuple(BLACK))
|
self.step_text = myfont_small.render('STEP', False, tuple(BLACK))
|
||||||
|
self.prg_text = myfont_small.render('CURRENT PROGRAM', False, tuple(GREEN))
|
||||||
|
|
||||||
|
|
||||||
# save initial state
|
# save initial state
|
||||||
self.initial_pos = (self.robot.x, self.robot.y, self.robot.orientation)
|
self.initial_pos = (self.robot.x, self.robot.y, self.robot.orientation)
|
||||||
|
@ -330,7 +333,7 @@ class Game:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
if self.beamer_mode:
|
if self.beamer_mode:
|
||||||
dx = 0
|
dx = self.xoffset
|
||||||
dy = 0
|
dy = 0
|
||||||
else:
|
else:
|
||||||
dx = int(0.05 * self.screen.get_width())
|
dx = int(0.05 * self.screen.get_width())
|
||||||
|
@ -345,9 +348,6 @@ class Game:
|
||||||
board_surf.blit(robot_surf, (self.robot.x * self.scale_fac, self.robot.y * self.scale_fac, self.scale_fac, self.scale_fac))
|
board_surf.blit(robot_surf, (self.robot.x * self.scale_fac, self.robot.y * self.scale_fac, self.scale_fac, self.scale_fac))
|
||||||
self.screen.blit(board_surf, (dx, dy, dx + self.board.tiles.shape[1] * self.scale_fac, dy + self.board.tiles.shape[0] * self.scale_fac))
|
self.screen.blit(board_surf, (dx, dy, dx + self.board.tiles.shape[1] * self.scale_fac, dy + self.board.tiles.shape[0] * self.scale_fac))
|
||||||
|
|
||||||
if not self.beamer_mode:
|
|
||||||
# if we are not in beamer mode we also show the current program / inputs
|
|
||||||
|
|
||||||
# render program
|
# render program
|
||||||
if self.state == 'input':
|
if self.state == 'input':
|
||||||
# in input mode we highlight the command which is selected for edit
|
# in input mode we highlight the command which is selected for edit
|
||||||
|
@ -356,15 +356,13 @@ class Game:
|
||||||
# in other modes we render the current program counter
|
# in other modes we render the current program counter
|
||||||
prg_surf = self.prg.render(self.scale_fac)
|
prg_surf = self.prg.render(self.scale_fac)
|
||||||
prg_surf = pygame.transform.scale(prg_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3))
|
prg_surf = pygame.transform.scale(prg_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3))
|
||||||
self.prg.screen_rect = pygame.Rect((dx, board_surf.get_height() + 2 * dy, prg_surf.get_width(), prg_surf.get_height()))
|
self.prg.screen_rect = pygame.Rect(
|
||||||
self.screen.blit(prg_surf, self.prg.screen_rect)
|
(dx, board_surf.get_height() + 2 * dy, prg_surf.get_width(), prg_surf.get_height()))
|
||||||
|
|
||||||
# render input fields and buttons
|
# render input fields and buttons
|
||||||
inp_surf = self.programmer.render(self.scale_fac)
|
inp_surf = self.programmer.render(self.scale_fac)
|
||||||
inp_surf = pygame.transform.scale(inp_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3))
|
inp_surf = pygame.transform.scale(inp_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3))
|
||||||
self.programmer.screen_rect = pygame.Rect((dx, board_surf.get_height() + prg_surf.get_height() + 3 * dy, inp_surf.get_width(), inp_surf.get_height()))
|
self.programmer.screen_rect = pygame.Rect(
|
||||||
self.screen.blit(inp_surf, self.programmer.screen_rect)
|
(dx, board_surf.get_height() + prg_surf.get_height() + 3 * dy, inp_surf.get_width(), inp_surf.get_height()))
|
||||||
|
|
||||||
btn_surf = pygame.Surface((3 * self.scale_fac // 2, self.scale_fac))
|
btn_surf = pygame.Surface((3 * self.scale_fac // 2, self.scale_fac))
|
||||||
self.btn_rect = pygame.Rect((2 * dx + prg_surf.get_width(), board_surf.get_height() + 2 * dy,
|
self.btn_rect = pygame.Rect((2 * dx + prg_surf.get_width(), board_surf.get_height() + 2 * dy,
|
||||||
btn_surf.get_height(), btn_surf.get_width()))
|
btn_surf.get_height(), btn_surf.get_width()))
|
||||||
|
@ -377,25 +375,42 @@ class Game:
|
||||||
elif self.state == 'stepping':
|
elif self.state == 'stepping':
|
||||||
btn_surf.fill(tuple(YELLOW))
|
btn_surf.fill(tuple(YELLOW))
|
||||||
btn_surf.blit(self.step_text, (0, 10))
|
btn_surf.blit(self.step_text, (0, 10))
|
||||||
|
|
||||||
|
if not self.beamer_mode:
|
||||||
|
# if we are not in beamer mode we render program and inputs below the board
|
||||||
|
self.screen.blit(prg_surf, self.prg.screen_rect)
|
||||||
|
|
||||||
|
self.screen.blit(inp_surf, self.programmer.screen_rect)
|
||||||
|
|
||||||
self.screen.blit(btn_surf, self.btn_rect)
|
self.screen.blit(btn_surf, self.btn_rect)
|
||||||
|
else:
|
||||||
|
prg_surf = pygame.transform.scale(prg_surf, (dx, dx//5))
|
||||||
|
# in beamer mode we render the program to the left of the board to appear on the laptop
|
||||||
|
self.screen.blit(prg_surf, (0,100))
|
||||||
|
|
||||||
|
prg_descr_surb = pygame.Surface((500, 100))
|
||||||
|
#prg_descr_surb.blit(self.prg_text)
|
||||||
|
self.screen.blit(self.prg_text, (50, 50))
|
||||||
|
mode_text = myfont_small.render(f'STATE: {self.state}', False, tuple(GREEN))
|
||||||
|
self.screen.blit(mode_text, (50, dx//5 + 350))
|
||||||
|
|
||||||
# render messages
|
# render messages
|
||||||
if self.state == 'game_over':
|
if self.state == 'game_over':
|
||||||
game_over_surf = pygame.Surface((self.screen.get_width() // 2, self.screen.get_height() // 2))
|
game_over_surf = pygame.Surface(((self.screen.get_width() - dx) // 2, self.screen.get_height() // 2))
|
||||||
game_over_surf.fill(tuple(GREEN))
|
game_over_surf.fill(tuple(GREEN))
|
||||||
game_over_surf.blit(self.game_over_text, ((game_over_surf.get_width() - self.game_over_text.get_width()) // 2,
|
game_over_surf.blit(self.game_over_text, ((game_over_surf.get_width() - self.game_over_text.get_width()) // 2,
|
||||||
(game_over_surf.get_height() - self.game_over_text.get_height()) // 2))
|
(game_over_surf.get_height() - self.game_over_text.get_height()) // 2))
|
||||||
self.screen.blit(game_over_surf, (self.screen.get_width() // 4, self.screen.get_height() // 4))
|
self.screen.blit(game_over_surf, (dx + (self.screen.get_width() - dx) // 4, self.screen.get_height() // 4))
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
pygame.time.wait(1500)
|
pygame.time.wait(1500)
|
||||||
self.state = 'reset'
|
self.state = 'reset'
|
||||||
elif self.state == 'won':
|
elif self.state == 'won':
|
||||||
won_surf = pygame.Surface((self.screen.get_width() // 2, self.screen.get_height() // 2))
|
won_surf = pygame.Surface(((self.screen.get_width() - dx) // 2, self.screen.get_height() // 2))
|
||||||
won_surf.fill(tuple(GREEN))
|
won_surf.fill(tuple(GREEN))
|
||||||
won_surf.blit(self.won_text,
|
won_surf.blit(self.won_text,
|
||||||
((won_surf.get_width() - self.won_text.get_width()) // 2,
|
((won_surf.get_width() - self.won_text.get_width()) // 2,
|
||||||
(won_surf.get_height() - self.won_text.get_height()) // 2))
|
(won_surf.get_height() - self.won_text.get_height()) // 2))
|
||||||
self.screen.blit(won_surf, (self.screen.get_width() // 4, self.screen.get_height() // 4))
|
self.screen.blit(won_surf, (dx + (self.screen.get_width() - dx) // 4, self.screen.get_height() // 4))
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
pygame.time.wait(1500)
|
pygame.time.wait(1500)
|
||||||
self.state = 'reset'
|
self.state = 'reset'
|
||||||
|
@ -435,9 +450,10 @@ class Game:
|
||||||
if event.key == pygame.K_x:
|
if event.key == pygame.K_x:
|
||||||
if not self.beamer_mode:
|
if not self.beamer_mode:
|
||||||
# switch to beamer mode
|
# switch to beamer mode
|
||||||
os.environ['SDL_VIDEO_WINDOW_POS'] = '1920, 280'
|
self.xoffset = 1000
|
||||||
|
os.environ['SDL_VIDEO_WINDOW_POS'] = f'{1920-self.xoffset}, 280'
|
||||||
self.scale_fac = 180
|
self.scale_fac = 180
|
||||||
self.screen = pygame.display.set_mode((self.board.tiles.shape[1] * self.scale_fac,
|
self.screen = pygame.display.set_mode((self.xoffset + self.board.tiles.shape[1] * self.scale_fac,
|
||||||
self.board.tiles.shape[0] * self.scale_fac),
|
self.board.tiles.shape[0] * self.scale_fac),
|
||||||
pygame.NOFRAME)
|
pygame.NOFRAME)
|
||||||
self.beamer_mode = True
|
self.beamer_mode = True
|
||||||
|
@ -509,7 +525,7 @@ if __name__ == "__main__":
|
||||||
seed = 2
|
seed = 2
|
||||||
random.seed(seed)
|
random.seed(seed)
|
||||||
np.random.seed(seed)
|
np.random.seed(seed)
|
||||||
game = Game(dimx=7, dimy=4, robotx=3, roboty=1, use_real_robot=False)
|
game = Game(dimx=7, dimy=4, robotx=3, roboty=1, use_real_robot=True)
|
||||||
game.run()
|
game.run()
|
||||||
|
|
||||||
# TODOs
|
# TODOs
|
||||||
|
|
Loading…
Reference in New Issue
Block a user