Как мне предварительно загрузить все звуки, которые мне нужны в игре Pygame, динамически в виде древовидной структуры? - PullRequest
0 голосов
/ 27 мая 2019

Pygame не может открывать файлы

Я пытался открыть файлы «с открытым как», с wave.open как «открыть один файл без создания словаря.как sound = Pygame.mixer.Sound('sounds/example.wav') после Pygame.mixer.init()

spy_vs_spy.py

import pygame
import settings
import game_functions as gf
import resources
import sounds
from spy_white import Spy_white
from spy_black import Spy_black
from settings import Settings


def run_game():

    # Initialize pygame, settings, and screen object.
    pygame.mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=4096)
    pygame.init() #turn all of pygame on.
    pygame.mixer.init()
    print(pygame.mixer.get_init())
    ai_settings = Settings()
    screen = pygame.display.set_mode(
            (ai_settings.screen_width, ai_settings.screen_height), 
            pygame.HWSURFACE|pygame.DOUBLEBUF)
    pygame.display.set_caption("Spy vs Spy 2019")
    resources.load_images(ai_settings, screen)
    resources.load_sounds()

    # Make Spy white.
    spy_white = Spy_white(ai_settings, screen)

    # Make Spy black.
    spy_black = Spy_black(ai_settings, screen)

    # Start music
    sounds.play_music()

    # Start the main loop for the game.
    while True:
        gf.check_events(spy_white, spy_black)
        spy_white.update()
        spy_black.update()
        gf.update_screen(ai_settings, screen, spy_white, spy_black)

run_game()

resources.py

sound_library = {}

def load_sounds():

    global sound_library

    """Load all sounds from subdirectories in a dictionary"""
    for dirpath, dirnames, filenames in os.walk('sounds'):
        for name in filenames:
            if name.endswith('.wav'):
                key = name[:-4]
                snd = pygame.mixer.Sound(os.path.join(dirpath, name))
                sound_library[key] = snd

    for sound in sound_library:
        print(sound)

    print(sound_library)

Я намеревался предварительно загрузить все файлы wav как звукв словаре, так что я могу вызвать звук по событию, просто дав ключ в словаре библиотеки звуков.и затем выполните resources.sound_library['sound_to_play'].play()

Traceback (последний вызов был последним): Файл "/Users/ruudkooistra/Desktop/project_folder/spy_vs_spy_2019/spy_vs_spy.py", строка 42, в файле run_game () "/ Users /ruudkooistra / Desktop / project_folder / spy_vs_spy_2019 / spy_vs_spy.py ", строка 24, в файле run_game resources.load_sounds ()"mixer.Sound (os.path.join (dirpath, name)) pygame.error: Невозможно открыть файл 'sounds / spy_fly.wav' [Завершено в 1.3s с кодом выхода 1]
[cmd: ['/ usr/ local / bin / python3 ',' -u ',' /Users/ruudkooistra/Desktop/project_folder/spy_vs_spy_2019/spy_vs_spy.py ']] [dir: / Users / ruudkooistra / Desktop / project_folder / spy_vs_spy_2019]/Frameworks/Python.framework/Versions/3.7/bin:/Users/ruudkooistra/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/bin:/bin:/usr/sbin:/ sbin: / usr / local / bin]

когда я изменяю код, как показано ниже, pygame.mixer.music.load (файл) и .play () работает, но Pygame.mixer.Sound (файл) все еще не работает.Кстати, когда я делаю это, есть ссылки на файл, который хранится в словаре, и я хочу динамически хранить данные в куче в виде структуры дерева.Но я новичок, и, возможно, есть лучшие способы обработки звуков в игре с Pygame.Он отлично работает с изображениями.

def load_sounds ():

global sound_library

"""Load all sounds from subdirectories in a dictionary"""
for dirpath, dirnames, filenames in os.walk('sounds'):
    for name in filenames:
        if name.endswith('.wav'):
            key = name[:-4]
            snd = os.path.join(dirpath, name)
            sound_library[key] = snd

for sound in sound_library:
    print(sound)

print(sound_library)

spy_fly электрифицированное time_bomb_countdown wave_stick search_01 time_bomb_explode beat timer_01 пистолета_трап_сет пистолета_пойнт бомба_эксплоид ходячий spy_spy_spy_spy_spy_spy'sounds / spy_fly.wav', 'electrified': 'sounds / electrified.wav', 'time_bomb_countdown': 'sounds / time_bomb_countdown.wav', 'wave_stick': 'sounds / wave_stick.wav', 'search_01': 'sounds/search_01.wav ',' time_bomb_explode ':' sounds / time_bomb_explode.wav ',' beat ':' sounds / beat.wav ',' timer_01 ':' sounds / timer_01.wav ',' pistol_trap_set ':' sounds / pistol_trap_set.wav ',' pistol_trapped ':' sounds / pistol_trapped.wav ',' hit ':' sounds / hit.wav ',' bomb_explode ':' sounds / bomb_explode.wav ','alking': 'sounds /alking.wav',' spy_vs_spy_theme ':' sounds / spy_vs_spy_theme.wav ',' found_item ':' sounds / found_item.wav ',' trap_set ':' sounds / trap_set.wav ',' lift_off ':' sounds / lift_off.wav ',' sounds / lift_off.wav ','door': 'sounds / door.wav', 'spy_angel ':' sounds / spy_angel.wav '}

1 Ответ

0 голосов
/ 30 мая 2019

Да, я нашел способ, теперь все работает как надо, и я могу использовать pygame.mixer.Sound (). Play () или pygame.mixer.music.load (). Play (), где я хочу:

resources.py import os import pygame as pg

sound_library = {}

def load_sounds ():

global sound_library

"""Load all sounds from subdirectories in a dictionary"""
for dirpath, dirnames, filenames in os.walk('sounds'):
    for name in filenames:
        if name.endswith('.wav'):
            key = name[:-4]
            with open(os.path.join(dirpath, name), "rb") as file:
                buffer = file.read()  
                sound_library[key] = buffer

for sound in sound_library:
    print(sound)
...