Project1

标题: 单独停止播放某个SE [打印本页]

作者: fux2    时间: 2014-9-8 23:13
标题: 单独停止播放某个SE
应某坛友需求而发,希望有人用得上。

使用Fux2.stop_se(文件名)即可停止播放同名文件的se。

简要分析,VA实际上最多只能同时播放32个se音频,播放时找到第一个未被使用或者已经播放完毕的se序号
参看下列代码各位也可以改成精确的按编号停止播放se,而不是按文件名。

(请不要与本人其他奇怪的脚本混合使用)
RUBY 代码复制
  1. module Fux2
  2.   GM = Win32API.new('kernel32','GetModuleHandle','p','l')
  3.   PSP = Win32API.new('kernel32','RtlMoveMemory','pll','v')
  4.   PPSP = Win32API.new('kernel32','RtlMoveMemory','ppl','v')
  5.   U2S = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  6.   STOP_SE = Win32API.new('RGSS300','RGSSGetInt','v','v')
  7.  
  8.   BASE_ADDR = GM.call("RGSS300.dll")
  9.  
  10.   buf = "\0"*4
  11.   PSP.call(buf,BASE_ADDR + 0x25EB04,4)
  12.   SE_LIST_ADDR = buf.unpack("L")[0]+0x14
  13.  
  14.   SE_STOP_CALL_ADDR = 0x1171C3
  15.   CODE_ADDR = BASE_ADDR+0x37A0
  16.  
  17.   CODE =  [0x55].pack("C*")
  18.   CODE += [0x8B,0xEC].pack("C*")
  19.   CODE += [0xB9,0,0,0,0].pack("C*")
  20.   CODE += [0xE8].pack("C")+[SE_STOP_CALL_ADDR].pack("L")
  21.   CODE += [0x33,0xC0,0x8B,0xE5,0x5D,0xC3].pack("C*")
  22.  
  23.   PPSP.call(CODE_ADDR,CODE,CODE.size)
  24.  
  25.   def self.set_addr(num)
  26.     tn = [num].pack("L")
  27.     PPSP.call(CODE_ADDR+4,tn,4)
  28.   end
  29.  
  30.   def self.stop_se(filename=nil)
  31.     unless filename
  32.       Audio.se_stop
  33.       return false
  34.     end
  35.     buf = "\0"*4
  36.     (0...32).each do |i|
  37.       PSP.call(buf,SE_LIST_ADDR+i*4,4)
  38.       p_this_se = buf.unpack("L")[0]
  39.       p_this_se_name = p_this_se+0x70
  40.       namebuf = "\0"*0x220
  41.       PSP.call(namebuf,p_this_se_name,0x220)
  42.       p_this_se_name = "\0"*220
  43.       if U2S.call(0,0,namebuf,-1,p_this_se_name,0x110,nil,nil)>0
  44.         p_this_se_name = p_this_se_name.unpack("A*")[0]
  45.         if p_this_se_name==filename
  46.           set_addr(p_this_se)
  47.           STOP_SE.call
  48.         end
  49.       end
  50.     end
  51.     return true
  52.   end
  53.  
  54. end
  55.  
  56. #Audio.se_play("Audio/SE/ui_unique_get.wav")
  57. #Fux2.stop_se("Audio/SE/ui_unique_get.wav")

作者: Im剑侠客    时间: 2014-9-9 12:37
移植控,希望Xp也有如此细腻的功能。
作者: taroxd    时间: 2014-9-9 12:46
鸡触黑DLL已经成为一种日常任务了么
作者: myownroc    时间: 2014-9-12 23:24
SE(Sound Effect 音效)这种东西的长度不会非常长吧=_=
播完简直秒秒钟的事情,暂停的意义是啥?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1