Difference between revisions of "Minimalist Sound Manager (日本語)"

(Created page with "minimalist sound manager (最小音声管理器) はライブラリを丸ごと追加せずに音声の再生をより容易にします: <source lang='lua'> do     -- 現...")
 
m
 
Line 69: Line 69:
  
 
[[Category:Snippets (日本語)]]
 
[[Category:Snippets (日本語)]]
 +
{{#set:LOVE Version=any}}
 +
{{#set:Description=音声 Source オブジェクトを管理するためのコードです。}}

Latest revision as of 00:55, 15 November 2016

minimalist sound manager (最小音声管理器) はライブラリを丸ごと追加せずに音声の再生をより容易にします:

do
    -- 現在再生中のソースを保持します
    local sources = {}

    -- ソースの再生終了および削除されたか確認します
    -- love.update へ追加します
    function love.audio.update()
        local remove = {}
        for _,s in pairs(sources) do
            if s:isStopped() then
                remove[#remove + 1] = s
            end
        end

        for i,s in ipairs(remove) do
            sources[s] = nil
        end
    end

    -- 必要であればソースの作成および登録を行い love.audio.play を上書きします
    local play = love.audio.play
    function love.audio.play(what, how, loop)
        local src = what
        if type(what) ~= "userdata" or not what:typeOf("Source") then
            src = love.audio.newSource(what, how)
            src:setLooping(loop or false)
        end

        play(src)
        sources[src] = src
        return src
    end

    -- ソースの停止
    local stop = love.audio.stop
    function love.audio.stop(src)
        if not src then return end
        stop(src)
        sources[src] = nil
    end
end

さて、実際のソース・オブジェクトに関して心配をせずに効果音および背景音楽を再生することができます:

function love.load()
    -- 必要であればソースのハンドルを取得したままにします
    bgm = love.audio.play("background-music.ogg", "stream", true) -- 背景音楽の段階復号化およびループ
end

function love.update(dt)
    love.audio.update()
end

function love.keypressed(key)
    if key == 's' then
        love.audio.stop(bgm)
    elseif key == 'p' then
        love.audio.play(bgm) -- ストリーミングおよびループしたままにします
    else
        love.audio.play("explosion.ogg") -- 爆発音を一回再生します
    end
end