1

libPd (Pure Data のラッパー) と組み合わせて使用​​している Python で単純なテキスト ベースのゲームを作成しました。すべてのゲーム コードは、オーディオが実装される前に記述されており、意図したとおりに動作します。同様に、libPd スクリプト自体も単独で完全に機能します。しかし、彼らを一緒にうまくプレイさせるのは難しいことがわかっています.

while ループとそれらの使用法に関係していると思います。

以下はゲームコードからの抜粋です -

    while True:

command = raw_input().lower()

    if command == "commands":
        print '"look around"'
        print '"explore"'
        print '"inventory"'
        print '"examine"'
        print '"take"'
        print '"combine"'
        print '"quit"'
    elif command == "look" or command == "look around":
        char.look()

...など... ...など...

libPd スクリプト自体は次のようになりますが、

    while True:

if not ch.get_queue():
    for x in range(BUFFERSIZE):
            if x % BLOCKSIZE == 0:
                outbuf = m.process(inbuf)
            samples[selector][x][0] = outbuf[(x % BLOCKSIZE) * 2]
            samples[selector][x][1] = outbuf[(x % BLOCKSIZE) * 2 + 1]
    ch.queue(sounds[selector])
    selector = int(not selector)
libpd_release()

私は当初、libPd セクション内のゲーム コード全体をインデントしようとしましたが、コマンドが入力されるとオーディオが再生され、印刷メッセージが返されると停止しました。

プレーヤーが残りのコマンド/ゲームを自由に実行できる間、音楽が一定になるように、2 つを組み合わせるにはどうすればよいですか?

4

2 に答える 2

1

あなたの問題は、raw_input()戻ってくるのをじっと待っていなければならないことですが、同時に、音声メッセージが入ってくるとすぐにキューから処理し続けなければならないことです.どうすれば両方を同時に行うことができますか?


まず、現在使用しているイベント ループ スタイルがあります。

入力メッセージまたは音声メッセージのいずれか先に来る方を待機する関数を作成できる場合は、その関数を待機するループの周りでプログラムを書き直すことができます。これは一般的には難しいことです。(GUI フレームワークとネットワーク サーバー フレームワークは役に立ちますが、どちらもテキスト ゲームには少しばかげています。)

たとえば、短いタイムアウトselect.selectで onを使用するなど、各行を短時間だけ待機することで偽造できます。sys.stdinしかし、これは大変な作業であり、そのような設計で応答性とパフォーマンスのバランスを取るのは困難です.


または、スレッドを使用することもできます。これは次のようになります。

def play_music():
    while True:
        if not ch.get_queue():
            for x in range(BUFFERSIZE):
                    if x % BLOCKSIZE == 0:
                        outbuf = m.process(inbuf)
                    samples[selector][x][0] = outbuf[(x % BLOCKSIZE) * 2]
                    samples[selector][x][1] = outbuf[(x % BLOCKSIZE) * 2 + 1]
            ch.queue(sounds[selector])
            selector = int(not selector)
        libpd_release()

play_music_thread = threading.Thread(target=play_music)
play_music_thread.daemon = True
play_music_thread.start()

while True:
    command = raw_input().lower()

    if command == "commands":
        print '"look around"'
        print '"explore"'
        print '"inventory"'
        print '"examine"'
        print '"take"'
        print '"combine"'
        print '"quit"'
    elif command == "look" or command == "look around":
        char.look()

終了時に音楽スレッドを途中で強制終了するのではなく、クリーン シャットダウンを実行できるようにしたい場合は、もう少し複雑になりますが、それほどではありません。基本的に、ConditionEventQueue、または単にブール変数と を使用するとLock、メイン スレッドからバックグラウンド ミュージック スレッドに信号を送る方法を簡単に構築できます。

于 2013-07-12T20:34:28.957 に答える