improved stepping mode

This commit is contained in:
Simon Pirkelmann 2021-09-06 09:00:00 +02:00
parent 4c3c3f973e
commit bbb341ea56

View File

@ -183,7 +183,7 @@ class Program:
self.prg_counter = 0 self.prg_counter = 0
self.screen_rect = None self.screen_rect = None
def step(self): def step(self, state='running'):
cmd = self.cmds[self.prg_counter] cmd = self.cmds[self.prg_counter]
self.prg_counter += 1 self.prg_counter += 1
@ -208,17 +208,6 @@ class Program:
else: else:
print("color not matching -> skipping command") print("color not matching -> skipping command")
# get all events
ev = pygame.event.get()
# proceed events
for event in ev:
# handle MOUSEBUTTONUP
if event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
if pos[0] >= 325 and pos[0] <= 400 and pos[1] >= 600 and pos[1] <= 650:
print(f"clicked at pos = {pos}")
self.state = 'input'
# update state for new robot position # update state for new robot position
if (not (0 <= self.robot.x < self.board.tiles.shape[1])) or not (0 <= self.robot.y < self.board.tiles.shape[0]): if (not (0 <= self.robot.x < self.board.tiles.shape[1])) or not (0 <= self.robot.y < self.board.tiles.shape[0]):
# robot leaves the board -> GAME OVER # robot leaves the board -> GAME OVER
@ -235,7 +224,7 @@ class Program:
return 'won' return 'won'
# by default we continue in the running state # by default we continue in the running state
return 'running' return state
def render(self, scale_fac, prg_counter_override=None): def render(self, scale_fac, prg_counter_override=None):
"""Render the current program. This will render all commands and highlight the next command to execute """Render the current program. This will render all commands and highlight the next command to execute
@ -298,6 +287,7 @@ class Game:
self.won_text = myfont.render('YOU WON', False, GREEN) self.won_text = myfont.render('YOU WON', False, GREEN)
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))
# 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)
@ -357,6 +347,9 @@ class Game:
elif self.state == 'running': elif self.state == 'running':
btn_surf.fill(tuple(RED)) btn_surf.fill(tuple(RED))
btn_surf.blit(self.stop_text, (0, 10)) btn_surf.blit(self.stop_text, (0, 10))
elif self.state == 'stepping':
btn_surf.fill(tuple(YELLOW))
btn_surf.blit(self.step_text, (0, 10))
self.screen.blit(btn_surf, self.btn_rect) self.screen.blit(btn_surf, self.btn_rect)
# render messages # render messages
@ -400,6 +393,8 @@ class Game:
self.state = 'input' self.state = 'input'
elif self.state == 'input': elif self.state == 'input':
self.state = 'running' self.state = 'running'
elif self.state == 'stepping':
self.state = self.prg.step(self.state)
elif event.type == pygame.KEYUP: elif event.type == pygame.KEYUP:
if event.key == pygame.K_x: if event.key == pygame.K_x:
if not self.beamer_mode: if not self.beamer_mode:
@ -414,15 +409,17 @@ class Game:
# switch to normal mode # switch to normal mode
os.environ['SDL_VIDEO_WINDOW_POS'] = '0, 0' os.environ['SDL_VIDEO_WINDOW_POS'] = '0, 0'
self.scale_fac = 125 self.scale_fac = 125
self.screen = pygame.display.set_mode((self.board.tiles.shape[1] * self.scale_fac, self.screen = pygame.display.set_mode((int(self.board.tiles.shape[1] * self.scale_fac * 1.1),
self.board.tiles.shape[0] * self.scale_fac + 5 * self.scale_fac)) int((self.board.tiles.shape[0] + 2) * self.scale_fac * 1.2)))
self.beamer_mode = False self.beamer_mode = False
elif event.key == pygame.K_r: elif event.key == pygame.K_r:
# run program # run program
self.state = 'running' self.state = 'running'
elif event.key == pygame.K_s: elif event.key == pygame.K_s:
self.state = 'manual' if self.state != 'stepping':
self.prg.step() self.state = 'stepping'
else:
self.state = self.prg.step(self.state)
return self.state return self.state
def reset(self): def reset(self):
@ -445,7 +442,9 @@ class Game:
self.state = self.reset() self.state = self.reset()
elif self.state == 'quit': elif self.state == 'quit':
running = False running = False
elif self.state == 'manual': elif self.state == 'stepping':
pass
elif self.state == 'game_over' or self.state == 'won':
pass pass
else: else:
print("unknown state") print("unknown state")