じ☆ve冰风 发表于 2024-4-19 17:29:50

BGM含前奏后无限循环系统(补丁教程已发布)

BUG已经更正,补丁教程已发布
http://rpg.blue/viewthread.php?tid=130527

前言:
虽然没比紫苏发的扩展音频模块来的强悍....


但至少此种前奏+后循环思路
可以解决OGG播放播放位置的偽指针的问题
很久以前有人在RMVX里提出RMXP是否也能达到该效果
BGM前奏+无限循环主旋律播放
http://rpg.blue/thread-97749-1-1.html

现在RMXP也能90%模拟无DLL即可实现,
若哪裡仍有BUG我没发现请告知(至少现在我还没找到)。

使用本系统时,在Audio资料夹下建立专门放前奏的资料夹PRELUDE

如果要剪辑音频,这裡提供一个简易又容易上手的软件。

Audacity音频编辑软件:(无法编辑MIDI)
可以利用此编辑软件把前奏跟主循环剪辑分開......
http://rpg.blue/thread-106349-1-1.html

# 使用注意事项:
(1) 音频格式就是RM默认的那些 :midoggwavmp3wma
(2) 前奏命名与主循环的音频命名相同
(3) 前奏可有可无,本系统会自动判定
(4) 前奏和后循环音频格式也可以互相搭配无限制
(5) 前奏命名相同但格式不同时,优先级是:mid → ogg → wav → mp3 → wma
(6) 此系统利用ME来播放前奏,所以当淡出BGM时会影响ME

# 本系统缺点:(无法100%完美模拟 BGM前奏+无限循环主旋律播放)
一般原声素材音频剪辑完(含剪辑掉头跟尾的空白期)后,
头跟尾仍会有一小段空白期,每次循环时容易会顿一下,
OGG格式则没有这个问题,所以主循环的音频推荐用OGG格式,
但这也不是完全完美....第一次读入播放OGG档时,
如果主循环太长,播放前,RM读入会耗时(播放前会有空白期)。
目前标题画面无法使用有前奏的BGM,前奏沒播完就播放主循环,
原因不明......= =#==============================================================================# ■ BGM含前奏后无限循环系统# §§(无DLL即可实现,90%模拟)#------------------------------------------------------------------------------# 作者:TERENCE (龙皇)#==============================================================================class Game_System#--------------------------------------------------------------------------# ● 前奏布林代数控制初始化#--------------------------------------------------------------------------alias new_initialize initializedef initialize    @bgm_boolean = false    new_initializeend#--------------------------------------------------------------------------# ● BGM 前奏 副档名 判断#--------------------------------------------------------------------------def music_extname(bgm)    return ".mid" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mid")    return ".ogg" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".ogg")    return ".wav" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wav")    return ".mp3" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mp3")    return ".wma" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wma")    return nilend    #--------------------------------------------------------------------------# ● 演奏 BGM#   bgm : 演奏的 BGM#--------------------------------------------------------------------------def bgm_play(bgm)    @playing_bgm = bgm    if bgm != nil and bgm.name != ""      # 提取前奏命名      if @prelude_me == nil      prelude_name = nil      else      prelude_name = @prelude_me.name       end      # 播放前奏前判定是否同首BGM      if @playing_bgm.name != prelude_name         @bgm_boolean = false      Audio.me_stop      end      # 前奏判定播放      if music_extname(bgm) != nil and @bgm_boolean == false      prelude_play(bgm)      @bgm_boolean = true      end      Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)    else      Audio.bgm_stop      Audio.me_stop    end    Graphics.frame_resetend#--------------------------------------------------------------------------# ● BGM 的淡出(NOTE:此时也会影响到ME)#   time : 淡出时间 (秒)#--------------------------------------------------------------------------def bgm_fade(time)    @playing_bgm = nil    Audio.bgm_fade(time * 1000)    Audio.me_fade(time * 1000)    @bgm_boolean = falseend#--------------------------------------------------------------------------# ● 还原 BGM#--------------------------------------------------------------------------def bgm_restore    bgm_play(@memorized_bgm)    @bgm_boolean = falseend#--------------------------------------------------------------------------# ● PRELUDE 的演奏#   me : 演奏的 ME#--------------------------------------------------------------------------def prelude_play(me)    @prelude_me = me    if me != nil and me.name != ""      Audio.me_play("Audio/PRELUDE/" + me.name, me.volume, me.pitch)    else      Audio.me_stop    end    Graphics.frame_resetendend复制代码工程范例:
http://rpg.blue/upload_prog ... E_BGM_120789438.rar


后知后觉:合并主题的内容

原帖:
http://rpg.blue/viewthread.php?tid=123326

◎前言
首先我必须感谢君迁子大大,
他是第一个发现有这个问题的人,
发了这麼久到现在才有人发现我的漏洞= =
无论怎样我也谢谢他对我脚本如此的支持...


◎此系统思路的本意(这个部份你可以跳过)
在解释BUG发生的原因前,先了解ME的特性跟我的思路。
ME的特性:
当一首BGM播放时,突然播放ME,BGM会暂停,
而ME播放完毕时,BGM会从暂停的地方淡入继续播放(有所谓记忆)


我的思路:
利用这样的特性,(从无音乐)一开始....
如果我们在几短时间内播放BGM和ME会发生什麼事呢??
而且又是先放ME再播放BGM(这之间不放等待),在脚本语句中相当於....
Audio.me_play(...
Audio.bgm_play(...

这时RM就发生了很有趣的现象,如下图

这时就產生了只有当ME播放完毕时,BGM才会自动被播放,
这就是BGM含前奏后无限循环的製作思路


◎BUG发生的原因
BUG现象就是战斗胜利ME根本没有播放直接就播放地图BGM,
而且这种现象只会出现在含有前奏的地图BGM。
这是為什麼呢?让我们看看下面的图

一般来说,RM中所有战斗系统的胜利几乎都有个弊病...
就是在战斗胜利时,播完胜利ME时,会出现地图的BGM(感觉很怪)

又因為利用ME播放做出前奏后无限循环系统,
所以导致当含有前奏的地图BGM,会遮蔽胜利的ME播放,而直接播放地图BGM


◎补丁修改
為了解决这个问题,我们必须把新的BGM播放系统挪到后面,
也就是在切换地图画面时,再播放BGM,如下图

我们又知道
$game_system.bgm_play($game_temp.map_bgm)
长拿来还原為战斗开始前的(地图)BGM,所以....

以下是以默认的战斗系统所做的补丁修改教程,如果使用其他的战斗脚本,请找到相对应的位置,如果在新的战斗脚本裡找不到对应的位置,那大概是某个部份还是採用了默认战斗系统的方法函式,这时候往前一个有关战斗脚本里找就对了

(1)先找到 处理战斗画面的类别 class Scene_Battle

(2)再找开始结束战斗回合的地方,也就是获得经验、金钱、宝物的地方

(3)然后你就会看到附近有一句$game_system.bgm_play($game_temp.map_bgm)

把该句删掉....

(4)同样是class Scene_Battle下,找到战斗结束的地方
def battle_end(result)一般新的战斗系统还是採用默认的函式,
不会重新撰写,使用其他战斗系统的同学,可以直接找默认的地方直接修改=w=

然后根据上图,在切换到地图画面$scene = Scene_Map.new上面做添加

(5)如此一来就挪到后面了><


§ 如果还有什麼问题,请回帖告知=w= §
             本帖来自P1论坛作者TERENCE,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=123326若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: BGM含前奏后无限循环系统(补丁教程已发布)