Compare commits
1 Commits
ca2d0d34bd
...
dcd204e476
Author | SHA1 | Date | |
---|---|---|---|
|
dcd204e476 |
@@ -51,7 +51,7 @@ from .input import get_input, check_for_exit, pause_game
|
|||||||
from .display import display_text, initialize_gui
|
from .display import display_text, initialize_gui
|
||||||
|
|
||||||
# Import menu functions
|
# Import menu functions
|
||||||
from .menu import game_menu, learn_sounds, instructions, credits, donate, exit_game
|
from .menu import game_menu, instruction_menu, learn_sounds, instructions, credits, donate, exit_game
|
||||||
|
|
||||||
# Update imports to reference Scoreboard methods
|
# Update imports to reference Scoreboard methods
|
||||||
high_scores = Scoreboard.display_high_scores
|
high_scores = Scoreboard.display_high_scores
|
||||||
@@ -113,7 +113,7 @@ __all__ = [
|
|||||||
'display_text', 'initialize_gui',
|
'display_text', 'initialize_gui',
|
||||||
|
|
||||||
# Menu
|
# Menu
|
||||||
'game_menu', 'learn_sounds', 'instructions', 'credits', 'donate', 'exit_game', 'high_scores', 'has_high_scores',
|
'game_menu', 'instruction_menu', 'learn_sounds', 'instructions', 'credits', 'donate', 'exit_game', 'high_scores', 'has_high_scores',
|
||||||
|
|
||||||
# Game class
|
# Game class
|
||||||
'Game',
|
'Game',
|
||||||
|
88
menu.py
88
menu.py
@@ -25,6 +25,94 @@ from .display import display_text
|
|||||||
from .scoreboard import Scoreboard
|
from .scoreboard import Scoreboard
|
||||||
from .services import PathService, ConfigService
|
from .services import PathService, ConfigService
|
||||||
|
|
||||||
|
def instruction_menu(sounds, instruction_text, *options):
|
||||||
|
"""Display a menu with an instruction announcement at the top.
|
||||||
|
|
||||||
|
The instruction text is announced as item 0 but is not selectable.
|
||||||
|
The actual menu items start at index 1, and navigation skips the instruction.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sounds (dict): Dictionary of sound objects
|
||||||
|
instruction_text (str): The instruction/context text to announce
|
||||||
|
*options: Menu options to display
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: Selected menu option or None if cancelled
|
||||||
|
"""
|
||||||
|
# Get speech instance
|
||||||
|
speech = Speech.get_instance()
|
||||||
|
|
||||||
|
# Create combined list with instruction at index 0
|
||||||
|
all_items = [instruction_text] + list(options)
|
||||||
|
|
||||||
|
loop = True
|
||||||
|
pygame.mixer.stop()
|
||||||
|
current_index = 0 # Start at instruction
|
||||||
|
last_spoken = -1
|
||||||
|
|
||||||
|
# Clear any pending events
|
||||||
|
pygame.event.clear()
|
||||||
|
|
||||||
|
while loop:
|
||||||
|
if current_index != last_spoken:
|
||||||
|
speech.speak(all_items[current_index])
|
||||||
|
last_spoken = current_index
|
||||||
|
|
||||||
|
event = pygame.event.wait()
|
||||||
|
if event.type == pygame.KEYDOWN:
|
||||||
|
if event.key == pygame.K_ESCAPE:
|
||||||
|
return None
|
||||||
|
elif event.key in [pygame.K_DOWN, pygame.K_s]:
|
||||||
|
moved = False
|
||||||
|
if current_index == 0: # On instruction, go to first menu item
|
||||||
|
current_index = 1
|
||||||
|
moved = True
|
||||||
|
elif current_index < len(all_items) - 1: # Normal navigation
|
||||||
|
current_index += 1
|
||||||
|
moved = True
|
||||||
|
|
||||||
|
if moved:
|
||||||
|
try:
|
||||||
|
sounds['menu-move'].play()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
elif event.key in [pygame.K_UP, pygame.K_w]:
|
||||||
|
if current_index > 1: # Can move up from menu items (but not to instruction)
|
||||||
|
current_index -= 1
|
||||||
|
try:
|
||||||
|
sounds['menu-move'].play()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
elif event.key == pygame.K_HOME:
|
||||||
|
target_index = 1 if current_index != 1 else current_index # Go to first menu item
|
||||||
|
if target_index != current_index:
|
||||||
|
current_index = target_index
|
||||||
|
try:
|
||||||
|
sounds['menu-move'].play()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
elif event.key == pygame.K_END and current_index != len(all_items) - 1:
|
||||||
|
current_index = len(all_items) - 1
|
||||||
|
try:
|
||||||
|
sounds['menu-move'].play()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
elif event.key == pygame.K_RETURN:
|
||||||
|
if current_index == 0: # Can't select the instruction
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
sounds['menu-select'].play()
|
||||||
|
time.sleep(sounds['menu-select'].get_length())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return options[current_index - 1] # Adjust for instruction offset
|
||||||
|
elif event.type == pygame.QUIT:
|
||||||
|
return None
|
||||||
|
|
||||||
|
pygame.event.pump()
|
||||||
|
pygame.event.clear()
|
||||||
|
time.sleep(0.001)
|
||||||
|
|
||||||
def game_menu(sounds, playCallback=None, *customOptions):
|
def game_menu(sounds, playCallback=None, *customOptions):
|
||||||
"""Display and handle the main game menu with standard and custom options.
|
"""Display and handle the main game menu with standard and custom options.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user