gpt4 book ai didi

.net - 播放 Wav 太快会搞砸

转载 作者:行者123 更新时间:2023-12-02 22:35:19 25 4
gpt4 key购买 nike

我正在重新创建一个旧的 16 位游戏。我正在创建通常显示在底部的聊天。每个句子逐个字符转换。

每次添加一个角色时,我都想让它发出一点哔哔声。我有一个 wav 文件,其中包含一个简短的“blip”,听起来恰到好处,问题是,当我每次都让它做 blip 时,它通常会搞砸。

要么:

  • 跳过逐个字符的过程,只显示完整的单词和闪烁一次
  • 滞后并正确地做了几个 bips,然后做上面列出的事情

  • 这就是它变得复杂的地方。我为此使用 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

    谢谢,如果你能帮忙!如果您需要任何澄清,我非常愿意提供帮助!

    最佳答案

    我使用了反射器,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()

    或者,如果您使用 .Net Framework 2.0 和/或更高版本,则只需 Beep()。

    我没有深入研究反射器,但它也可能值得检查 SoundPlayer 是否使用 PlaySound API,以及它是否也没有提供该方法:
        <DllImport("coredll.dll")> _
    Public Shared Function PlaySound(szSound As String, hModule As IntPtr, flags As Integer) As Integer
    End Function

    关于.net - 播放 Wav 太快会搞砸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8469111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com