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默认的那些 :mid ogg wav mp3 wma
(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 initialize def initialize @bgm_boolean = false new_initialize end #-------------------------------------------------------------------------- # ● 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 nil end #-------------------------------------------------------------------------- # ● 演奏 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_reset end #-------------------------------------------------------------------------- # ● BGM 的淡出 (NOTE:此时也会影响到ME) # time : 淡出时间 (秒) #-------------------------------------------------------------------------- def bgm_fade(time) @playing_bgm = nil Audio.bgm_fade(time * 1000) Audio.me_fade(time * 1000) @bgm_boolean = false end #-------------------------------------------------------------------------- # ● 还原 BGM #-------------------------------------------------------------------------- def bgm_restore bgm_play(@memorized_bgm) @bgm_boolean = false end #-------------------------------------------------------------------------- # ● 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_reset endend复制代码
复制代码工程范例:
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在线咨询功能删除,谢谢。