Various bug fixes. Intro sound working correctly.
This commit is contained in:
		
							
								
								
									
										90
									
								
								__init__.py
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								__init__.py
									
									
									
									
									
								
							| @@ -4,13 +4,14 @@ Core initialization module for PygStormGames framework. | |||||||
| Provides the main PygStormGames class that serves as the central hub for game functionality. | Provides the main PygStormGames class that serves as the central hub for game functionality. | ||||||
| """ | """ | ||||||
|  |  | ||||||
|  | import pyglet | ||||||
|  | import time | ||||||
| from .config import Config | from .config import Config | ||||||
| from .display import Display | from .display import Display | ||||||
| from .menu import Menu | from .menu import Menu | ||||||
| from .scoreboard import Scoreboard | from .scoreboard import Scoreboard | ||||||
| from .sound import Sound | from .sound import Sound | ||||||
| from .speech import Speech | from .speech import Speech | ||||||
| import pyglet |  | ||||||
|  |  | ||||||
| class pygstormgames: | class pygstormgames: | ||||||
|     """Main class that coordinates all game systems.""" |     """Main class that coordinates all game systems.""" | ||||||
| @@ -36,27 +37,19 @@ class pygstormgames: | |||||||
|         try: |         try: | ||||||
|             player = self.sound.play_sound('game-intro') |             player = self.sound.play_sound('game-intro') | ||||||
|             if player: |             if player: | ||||||
|                 # Wait for completion or skip input |                 startTime = time.time() | ||||||
|                 @self.display.window.event |                 duration = player.source.duration | ||||||
|                 def on_key_press(symbol, modifiers): |                 # Make sure to give pyglet enough cycles to start playing | ||||||
|                     if symbol in (pyglet.window.key.ESCAPE,  |                 pyglet.clock.tick() | ||||||
|                                 pyglet.window.key.RETURN,  |                 interrupted = self.wait_for_completion( | ||||||
|                                 pyglet.window.key.SPACE): |                     lambda: not player.playing or (time.time() - startTime) >= duration | ||||||
|  |                 ) | ||||||
|  |                 if interrupted: | ||||||
|                     player.pause() |                     player.pause() | ||||||
|                         # Remove the temporary event handler |  | ||||||
|                         self.display.window.remove_handler('on_key_press', on_key_press) |  | ||||||
|                         return True |  | ||||||
|                      |  | ||||||
|                 # Wait for sound to finish or user to skip |  | ||||||
|                 while player.playing: |  | ||||||
|                     self.display.window.dispatch_events() |  | ||||||
|                  |  | ||||||
|                 # Remove the temporary event handler if not already removed |  | ||||||
|                 self.display.window.remove_handler('on_key_press', on_key_press) |  | ||||||
|         except: |         except: | ||||||
|             pass |             pass | ||||||
|  |  | ||||||
|         # Set up window event handlers |         # Set up window event handlers after intro is complete | ||||||
|         self.display.window.push_handlers(self.on_key_press) |         self.display.window.push_handlers(self.on_key_press) | ||||||
|          |          | ||||||
|     def on_key_press(self, symbol, modifiers): |     def on_key_press(self, symbol, modifiers): | ||||||
| @@ -95,3 +88,64 @@ class pygstormgames: | |||||||
|         self.sound.cleanup() |         self.sound.cleanup() | ||||||
|         self.speech.cleanup() |         self.speech.cleanup() | ||||||
|         pyglet.app.exit() |         pyglet.app.exit() | ||||||
|  |  | ||||||
|  |     def wait(self, valid_keys=None): | ||||||
|  |         """Wait for key press(es). | ||||||
|  |      | ||||||
|  |         Args: | ||||||
|  |             valid_keys (list, optional): List of pyglet.window.key values to wait for. | ||||||
|  |                 If None, accepts any key press. | ||||||
|  |          | ||||||
|  |         Returns: | ||||||
|  |             int: The key that was pressed | ||||||
|  |     """ | ||||||
|  |         result = [None]  # Use list to allow modification in closure | ||||||
|  |      | ||||||
|  |         def on_key_press(symbol, modifiers): | ||||||
|  |             if valid_keys is None or symbol in valid_keys: | ||||||
|  |                 result[0] = symbol | ||||||
|  |                 return pyglet.event.EVENT_HANDLED | ||||||
|  |              | ||||||
|  |         # Register temporary handler | ||||||
|  |         self.display.window.push_handlers(on_key_press=on_key_press) | ||||||
|  |      | ||||||
|  |         # Wait for valid key press | ||||||
|  |         while result[0] is None: | ||||||
|  |             self.display.window.dispatch_events() | ||||||
|  |             pyglet.clock.tick() | ||||||
|  |          | ||||||
|  |         # Clean up | ||||||
|  |         self.display.window.remove_handlers() | ||||||
|  |         return result[0] | ||||||
|  |  | ||||||
|  |     def wait_for_completion(self, condition, validKeys=None): | ||||||
|  |         """Wait for either a condition to be met or valid keys to be pressed. | ||||||
|  |      | ||||||
|  |         Args: | ||||||
|  |             condition: Function that returns True when waiting should end | ||||||
|  |             validKeys (list, optional): List of pyglet.window.key values that can interrupt | ||||||
|  |                 If None, uses ESCAPE, RETURN, and SPACE | ||||||
|  |      | ||||||
|  |         Returns: | ||||||
|  |             bool: True if interrupted by key press, False if condition was met | ||||||
|  |         """ | ||||||
|  |         if validKeys is None: | ||||||
|  |             validKeys = [pyglet.window.key.ESCAPE,  | ||||||
|  |                         pyglet.window.key.RETURN,  | ||||||
|  |                         pyglet.window.key.SPACE] | ||||||
|  |      | ||||||
|  |         wasInterrupted = [False]  # Use list to allow modification in closure | ||||||
|  |      | ||||||
|  |         def on_key_press(symbol, modifiers): | ||||||
|  |             if symbol in validKeys: | ||||||
|  |                 wasInterrupted[0] = True | ||||||
|  |                 return pyglet.event.EVENT_HANDLED | ||||||
|  |              | ||||||
|  |         self.display.window.push_handlers(on_key_press=on_key_press) | ||||||
|  |      | ||||||
|  |         while not condition() and not wasInterrupted[0]: | ||||||
|  |             self.display.window.dispatch_events() | ||||||
|  |             pyglet.clock.tick() | ||||||
|  |          | ||||||
|  |         self.display.window.remove_handlers() | ||||||
|  |         return wasInterrupted[0] | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								display.py
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								display.py
									
									
									
									
									
								
							| @@ -114,19 +114,39 @@ class Display: | |||||||
|              |              | ||||||
|         self.display_text(info, speech) |         self.display_text(info, speech) | ||||||
|  |  | ||||||
|     def get_input(self, prompt="Enter text:", default_text=""): | def messagebox(self, text): | ||||||
|  |     """Display a simple message box with text. | ||||||
|  |      | ||||||
|  |     Shows a message that can be repeated until the user chooses to continue. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         text (str): Message to display | ||||||
|  |     """ | ||||||
|  |     text = text + "\nPress any key to repeat or enter to continue." | ||||||
|  |     while True: | ||||||
|  |         # Speak the text | ||||||
|  |         self.game.speech.speak(text) | ||||||
|  |          | ||||||
|  |         # Wait for any key | ||||||
|  |         key = self.game.wait() | ||||||
|  |          | ||||||
|  |         # Exit if enter/escape pressed | ||||||
|  |         if key in (pyglet.window.key.RETURN, pyglet.window.key.ESCAPE): | ||||||
|  |             break | ||||||
|  |  | ||||||
|  |     def get_input(self, prompt="Enter text:", defaultText=""): | ||||||
|         """Display a dialog box for text input. |         """Display a dialog box for text input. | ||||||
|      |      | ||||||
|         Args: |         Args: | ||||||
|             prompt (str): Prompt text to display |             prompt (str): Prompt text to display | ||||||
|             default_text (str): Initial text in input box |             defaultText (str): Initial text in input box | ||||||
|          |          | ||||||
|         Returns: |         Returns: | ||||||
|             str: User input text, or None if cancelled |             str: User input text, or None if cancelled | ||||||
|         """ |         """ | ||||||
|         app = wx.App(False) |         app = wx.App(False) | ||||||
|         dialog = wx.TextEntryDialog(None, prompt, "Input", default_text) |         dialog = wx.TextEntryDialog(None, prompt, "Input", defaultText) | ||||||
|         dialog.SetValue(default_text) |         dialog.SetValue(defaultText) | ||||||
|         if dialog.ShowModal() == wx.ID_OK: |         if dialog.ShowModal() == wx.ID_OK: | ||||||
|             userInput = dialog.GetValue() |             userInput = dialog.GetValue() | ||||||
|         else: |         else: | ||||||
|   | |||||||
| @@ -48,16 +48,16 @@ class Speech: | |||||||
|             text (str): Text to speak and display |             text (str): Text to speak and display | ||||||
|             interrupt (bool): Whether to interrupt current speech |             interrupt (bool): Whether to interrupt current speech | ||||||
|         """ |         """ | ||||||
|         current_time = time.time() * 1000 |         currentTime = time.time() * 1000 | ||||||
|          |          | ||||||
|         # Prevent rapid repeated messages |         # Prevent rapid repeated messages | ||||||
|         if (self._lastSpoken["text"] == text and  |         if (self._lastSpoken["text"] == text and  | ||||||
|             current_time - self._lastSpoken["time"] < self._speechDelay): |             currentTime - self._lastSpoken["time"] < self._speechDelay): | ||||||
|             return |             return | ||||||
|              |              | ||||||
|         # Update last spoken tracking |         # Update last spoken tracking | ||||||
|         self._lastSpoken["text"] = text |         self._lastSpoken["text"] = text | ||||||
|         self._lastSpoken["time"] = current_time |         self._lastSpoken["time"] = currentTime | ||||||
|          |          | ||||||
|         # Handle speech output based on provider |         # Handle speech output based on provider | ||||||
|         if self._provider == "speechd": |         if self._provider == "speechd": | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user