Слишком быстрая игра в Wav испортила - PullRequest
2 голосов
/ 12 декабря 2011

Я воссоздаю старую 16-битную игру.Я создаю чат, который обычно отображается внизу.Каждое предложение переходит в посимвольное.

Каждый раз, когда добавляется символ, я хотел, чтобы он издавал этот небольшой гудок.У меня есть WAV-файл, который содержит короткий «всплывающее» сообщение, которое звучит просто правильно, проблема в том, что когда я делаю это каждый раз, он обычно портится.

Либо это:

  • Пропускает посимвольный процесс и просто показывает полное слово и всплывает один раз
  • Отстает и делает пару байт правильно, а затем делает то, что указано выше

Здесь все становится сложнее.Я использую Lua и VB.net для этого.Движок, который я написал на VB.net, в то время как игровая механика и сюжетная линия контролируются Lua.

Вот основной фрагмент Lua:

RegisterEvent("ready", function()
    _G.Chat={}
    _G.Chat["busy"]=false
    _G.Chat.Say=(function(from,msg,done)
        if _G.Chat["busy"] then return end
        _G.Chat["busy"]=true
        local x,y=getRelativePositionOpposite(1024,192)
        --Draw
        local chatPanel=engine:AddSprite("chat.png",0,0,1024,192,x,y,1024,192,5)
        local fromText=engine:AddString(from..":",x+25,y+25,"#FFFFFF",16,0,0)
        local msgText=nil
        local mx=string.len(msg)
        --Chat Cleanup
        setupCleanup=(function()
            local g=true
            RegisterEvent("keyup", function(key)
                if not g then return end
                if key=="Space" then
                    engine:RemoveSprite(chatPanel)
                    engine:RemoveString(fromText)
                    engine:RemoveString(msgText)
                    _G.Chat["busy"]=false
                    done()
                    g=false
                end
            end)
        end)
        doText=(function(i)
            if msgText then
                engine:RemoveString(msgText)
            end
            msgText=engine:AddString(string.sub(msg,1,i),x,y+75,"#FFFFFF",14,1,0)
            engine:PlaySound("chatblip.wav")
            if i>=mx then setupCleanup() return end
            pause(.75,(function() doText(i+1) end))
        end)
        doText(1)
    end)
end)

ВотФункция паузы, просто для справки (в Lua):

_G.pause=(function(t,f)
    if t and f then
        local tt=engine.timer.ElapsedMilliseconds/1000+t 
        local lcc=true
        engine.event_tick:add(function(nt)
            if nt>=tt and lcc then
                f()
                lcc=false
            end
        end)
    end
end)

Вот фрагмент, который фактически воспроизводит шум в VB.net:

Public Sub PlaySound(ByVal fileFullPath As String)
    My.Computer.Audio.Play(My.Computer.FileSystem.CurrentDirectory & "\bin\sounds\" & fileFullPath, AudioPlayMode.Background)
End Sub

Спасибо, если вы можете помочь!Если вам нужны какие-либо разъяснения, я более чем готов помочь!

1 Ответ

1 голос
/ 13 декабря 2011

Я использовал отражатель, а внутренняя реализация Audio.Play использует SoundPlayer:

Public Sub Play(ByVal location As String, ByVal playMode As AudioPlayMode)
    Me.ValidateAudioPlayModeEnum(playMode, "playMode")
    Dim sound As New SoundPlayer(Me.ValidateFilename(location))
    Me.Play(sound, playMode)
End Sub

Чтение звукового файла для каждого персонажа будет довольно интенсивным в IO.

преодолеть перф. Узким местом можно попробовать добавить ссылку на сборку Microsoft.VisualBasic.dll и использовать:

Microsoft.VisualBasic.Interaction.Beep ()

Или просто Beep (), если вы используете .Net Framework 2.0 и / или выше.

Я не очень детализировал рефлектор, но, возможно, также стоит проверить, использует ли SoundPlayer API PlaySound и не дает ли он этот метод также:

    <DllImport("coredll.dll")> _
Public Shared Function PlaySound(szSound As String, hModule As IntPtr, flags As Integer) As Integer
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...