From bf5cdb1b99cc08853a36eac2e5d93fdfa284c93d Mon Sep 17 00:00:00 2001 From: MrZ626 <1046101471@qq.com> Date: Thu, 21 Oct 2021 02:53:50 +0800 Subject: [PATCH] =?UTF-8?q?SFX=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=87=87=E6=A0=B7=E5=8A=9F=E8=83=BD=EF=BC=88=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=EF=BC=89=20=E6=B7=BB=E5=8A=A0loadSample=E5=92=8CplaySample?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zframework/sfx.lua | 68 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/Zframework/sfx.lua b/Zframework/sfx.lua index e4de0ad2..f2dd64e6 100644 --- a/Zframework/sfx.lua +++ b/Zframework/sfx.lua @@ -1,30 +1,68 @@ -local rem=table.remove +local type,assert=type,assert +local ins,rem=table.insert,table.remove local sfxList={} +local packSetting={} local Sources={} local volume=1 local stereo=1 +local noteName={ + C=1,c=1, + D=3,d=3, + E=5,e=5, + F=6,f=6, + G=8,g=8, + A=10,a=10, + B=12,b=12, +} +local function _getTuneHeight(tune) + local octave=tonumber(tune:sub(-1,-1)) + if octave then + local tuneHeight=noteName[tune:sub(1,1)] + if tuneHeight then + tuneHeight=tuneHeight+(octave-1)*12 + local s=tune:sub(2,2) + if s=='s'or s=='#'then + tuneHeight=tuneHeight+1 + elseif s=='f'or s=='b'then + tuneHeight=tuneHeight-1 + end + return tuneHeight + end + end +end + local SFX={} function SFX.init(list) assert(type(list)=='table',"Initialize SFX lib with a list of filenames!") - sfxList=list + for i=1,#list do ins(sfxList,list[i])end end function SFX.load(path) - if not sfxList then - error("Cannot load before init!") - else - for i=1,#sfxList do - local fullPath=path..sfxList[i]..'.ogg' - if love.filesystem.getInfo(fullPath)then - Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')} - else - LOG("No SFX: "..sfxList[i]..'.ogg',.1) - end + for i=1,#sfxList do + local fullPath=path..sfxList[i]..'.ogg' + if love.filesystem.getInfo(fullPath)then + Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')} + else + LOG("No SFX: "..sfxList[i]..'.ogg',.1) end end end +function SFX.loadSample(pack) + assert(type(pack)=='table',"Usage: SFX.loadsample([table])") + assert(pack.name,"No field: name") + assert(pack.path,"No field: path") + packSetting[pack.name]={ + base=_getTuneHeight(pack.base)or 37, + } + local num=1 + while love.filesystem.getInfo(pack.path..'/'..num..'.ogg')do + Sources[pack.name..num]={love.audio.newSource(pack.path..'/'..num..'.ogg','static')} + num=num+1 + end + LOG("Pack "..pack.name.." loaded, "..(num-1).." files") +end function SFX.getCount() return #sfxList @@ -38,6 +76,12 @@ function SFX.setStereo(v) stereo=v end +function SFX.playSample(pack,tune,vol) + if type(tune)=='string'then + tune=_getTuneHeight(tune)-packSetting[pack].base+1 + SFX.play(pack..tune,vol) + end +end function SFX.play(name,vol,pos) if volume==0 or vol==0 then return end local S=Sources[name]--Source list