forked from Telos4/RoboRally
improved stepping mode
This commit is contained in:
parent
4c3c3f973e
commit
bbb341ea56
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user