| 
 
| 赞 | 481 |  
| VIP | 56 |  
| 好人卡 | 75 |  
| 积分 | 471 |  
| 经验 | 124650 |  
| 最后登录 | 2025-10-31 |  
| 在线时间 | 7737 小时 |  
 Lv5.捕梦者 (管理员) 老黄鸡 
	梦石4 星屑43076 在线时间7737 小时注册时间2009-7-6帖子13548    
 | 
| 
应某坛友需求而发,希望有人用得上。
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 使用Fux2.stop_se(文件名)即可停止播放同名文件的se。
 
 简要分析,VA实际上最多只能同时播放32个se音频,播放时找到第一个未被使用或者已经播放完毕的se序号
 参看下列代码各位也可以改成精确的按编号停止播放se,而不是按文件名。
 
 (请不要与本人其他奇怪的脚本混合使用)
 
 module Fux2  GM = Win32API.new('kernel32','GetModuleHandle','p','l')  PSP = Win32API.new('kernel32','RtlMoveMemory','pll','v')  PPSP = Win32API.new('kernel32','RtlMoveMemory','ppl','v')  U2S = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')  STOP_SE = Win32API.new('RGSS300','RGSSGetInt','v','v')   BASE_ADDR = GM.call("RGSS300.dll")   buf = "\0"*4  PSP.call(buf,BASE_ADDR + 0x25EB04,4)  SE_LIST_ADDR = buf.unpack("L")[0]+0x14   SE_STOP_CALL_ADDR = 0x1171C3  CODE_ADDR = BASE_ADDR+0x37A0   CODE =  [0x55].pack("C*")  CODE += [0x8B,0xEC].pack("C*")  CODE += [0xB9,0,0,0,0].pack("C*")  CODE += [0xE8].pack("C")+[SE_STOP_CALL_ADDR].pack("L")  CODE += [0x33,0xC0,0x8B,0xE5,0x5D,0xC3].pack("C*")   PPSP.call(CODE_ADDR,CODE,CODE.size)   def self.set_addr(num)    tn = [num].pack("L")    PPSP.call(CODE_ADDR+4,tn,4)  end   def self.stop_se(filename=nil)    unless filename      Audio.se_stop      return false    end    buf = "\0"*4    (0...32).each do |i|      PSP.call(buf,SE_LIST_ADDR+i*4,4)      p_this_se = buf.unpack("L")[0]      p_this_se_name = p_this_se+0x70      namebuf = "\0"*0x220      PSP.call(namebuf,p_this_se_name,0x220)      p_this_se_name = "\0"*220      if U2S.call(0,0,namebuf,-1,p_this_se_name,0x110,nil,nil)>0        p_this_se_name = p_this_se_name.unpack("A*")[0]        if p_this_se_name==filename          set_addr(p_this_se)          STOP_SE.call        end      end    end    return true  end end #Audio.se_play("Audio/SE/ui_unique_get.wav")#Fux2.stop_se("Audio/SE/ui_unique_get.wav")
module Fux2 
  GM = Win32API.new('kernel32','GetModuleHandle','p','l') 
  PSP = Win32API.new('kernel32','RtlMoveMemory','pll','v') 
  PPSP = Win32API.new('kernel32','RtlMoveMemory','ppl','v') 
  U2S = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i') 
  STOP_SE = Win32API.new('RGSS300','RGSSGetInt','v','v') 
  
  BASE_ADDR = GM.call("RGSS300.dll") 
  
  buf = "\0"*4 
  PSP.call(buf,BASE_ADDR + 0x25EB04,4) 
  SE_LIST_ADDR = buf.unpack("L")[0]+0x14 
  
  SE_STOP_CALL_ADDR = 0x1171C3 
  CODE_ADDR = BASE_ADDR+0x37A0 
  
  CODE =  [0x55].pack("C*") 
  CODE += [0x8B,0xEC].pack("C*") 
  CODE += [0xB9,0,0,0,0].pack("C*") 
  CODE += [0xE8].pack("C")+[SE_STOP_CALL_ADDR].pack("L") 
  CODE += [0x33,0xC0,0x8B,0xE5,0x5D,0xC3].pack("C*") 
  
  PPSP.call(CODE_ADDR,CODE,CODE.size) 
  
  def self.set_addr(num) 
    tn = [num].pack("L") 
    PPSP.call(CODE_ADDR+4,tn,4) 
  end 
  
  def self.stop_se(filename=nil) 
    unless filename 
      Audio.se_stop 
      return false 
    end 
    buf = "\0"*4 
    (0...32).each do |i| 
      PSP.call(buf,SE_LIST_ADDR+i*4,4) 
      p_this_se = buf.unpack("L")[0] 
      p_this_se_name = p_this_se+0x70 
      namebuf = "\0"*0x220 
      PSP.call(namebuf,p_this_se_name,0x220) 
      p_this_se_name = "\0"*220 
      if U2S.call(0,0,namebuf,-1,p_this_se_name,0x110,nil,nil)>0 
        p_this_se_name = p_this_se_name.unpack("A*")[0] 
        if p_this_se_name==filename 
          set_addr(p_this_se) 
          STOP_SE.call 
        end 
      end 
    end 
    return true 
  end 
  
end 
  
#Audio.se_play("Audio/SE/ui_unique_get.wav") 
#Fux2.stop_se("Audio/SE/ui_unique_get.wav") 
 | 
 |