Various bug fixes. Intro sound working correctly.
This commit is contained in:
parent
d7199f499f
commit
bce918166d
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":
|
||||||
|
Loading…
x
Reference in New Issue
Block a user