设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 11643|回复: 25
打印 上一主题 下一主题

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

 关闭 [复制链接]

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
跳转到指定楼层
1
发表于 2009-4-22 08:51:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 精灵使者 于 2012-10-4 19:20 编辑

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,前奏沒播完就播放主循环,
  原因不明......= =
  1. #==============================================================================
  2. # ■ BGM含前奏后无限循环系统
  3. # §§  (无DLL即可实现,90%模拟)
  4. #------------------------------------------------------------------------------
  5. # 作者:TERENCE (龙皇)
  6. #==============================================================================
  7. class Game_System
  8.   #--------------------------------------------------------------------------
  9.   # ● 前奏布林代数控制初始化
  10.   #--------------------------------------------------------------------------
  11.   alias new_initialize initialize
  12.   def initialize
  13.     @bgm_boolean = false
  14.     new_initialize
  15.   end
  16.   #--------------------------------------------------------------------------
  17.   # ● BGM 前奏 副档名 判断
  18.   #--------------------------------------------------------------------------
  19.   def music_extname(bgm)
  20.     return ".mid" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mid")
  21.     return ".ogg" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".ogg")
  22.     return ".wav" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wav")
  23.     return ".mp3" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mp3")
  24.     return ".wma" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wma")
  25.     return nil
  26.   end  
  27.   #--------------------------------------------------------------------------
  28.   # ● 演奏 BGM
  29.   #     bgm : 演奏的 BGM
  30.   #--------------------------------------------------------------------------
  31.   def bgm_play(bgm)
  32.     @playing_bgm = bgm
  33.     if bgm != nil and bgm.name != ""
  34.       # 提取前奏命名
  35.       if @prelude_me == nil
  36.         prelude_name = nil
  37.       else
  38.         prelude_name = @prelude_me.name
  39.       end
  40.       # 播放前奏前判定是否同首BGM
  41.       if @playing_bgm.name != prelude_name
  42.         @bgm_boolean = false
  43.         Audio.me_stop
  44.       end
  45.       # 前奏判定播放
  46.       if music_extname(bgm) != nil and @bgm_boolean == false
  47.         prelude_play(bgm)
  48.         @bgm_boolean = true
  49.       end
  50.       Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)
  51.     else
  52.       Audio.bgm_stop
  53.       Audio.me_stop
  54.     end
  55.     Graphics.frame_reset
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● BGM 的淡出  (NOTE:此时也会影响到ME)
  59.   #     time : 淡出时间 (秒)
  60.   #--------------------------------------------------------------------------
  61.   def bgm_fade(time)
  62.     @playing_bgm = nil
  63.     Audio.bgm_fade(time * 1000)
  64.     Audio.me_fade(time * 1000)
  65.     @bgm_boolean = false
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 还原 BGM
  69.   #--------------------------------------------------------------------------
  70.   def bgm_restore
  71.     bgm_play(@memorized_bgm)
  72.     @bgm_boolean = false
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● PRELUDE 的演奏
  76.   #     me : 演奏的 ME
  77.   #--------------------------------------------------------------------------
  78.   def prelude_play(me)
  79.     @prelude_me = me
  80.     if me != nil and me.name != ""
  81.       Audio.me_play("Audio/PRELUDE/" + me.name, me.volume, me.pitch)
  82.     else
  83.       Audio.me_stop
  84.     end
  85.     Graphics.frame_reset
  86.   end
  87. end
复制代码
工程范例:
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= §

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说

Lv1.梦旅人

梦石
0
星屑
50
在线时间
60 小时
注册时间
2008-8-27
帖子
531
2
发表于 2009-4-22 15:35:20 | 只看该作者
抢个沙发,看起来不错

回复 支持 反对

使用道具 举报

Lv4.逐梦者

ST戰士

梦石
11
星屑
82
在线时间
1155 小时
注册时间
2007-5-5
帖子
3489

第5届短篇游戏比赛季军

3
发表于 2009-4-22 17:03:38 | 只看该作者
绝对是一个好东西!!! {/se} {/se}
小弟不客气收下了~
我是昵称 JIN 的迅雷進,是一位以日本特攝講解爲主的馬來西亞 YouTuber。

歡迎瀏覽我的頻道:JinRaiXin -迅雷進-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
87 小时
注册时间
2006-1-3
帖子
227
4
发表于 2009-4-22 21:45:12 | 只看该作者
XP现在也实现了..感谢龙哥{/qiang}
抱走,期待完善
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1964
在线时间
287 小时
注册时间
2008-7-11
帖子
659
5
发表于 2009-4-23 02:56:37 | 只看该作者
额……  占个位置 我有预感 不知道哪天 说不定会用上  {/qiang}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
6
 楼主| 发表于 2009-4-24 06:16:04 | 只看该作者
以下引用swabwind于2009-4-22 13:45:12的发言:

XP现在也实现了..感谢龙哥
抱走,期待完善

谢谢支持先~


100%模拟完善,纯脚本实现 基本上万分困难
要配合DLL才有可能,


可惜的是本龙仔完全没接触过DLL制作的领域
所以根本也不会用RUBY条用DLL。。。

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
7
 楼主| 发表于 2009-4-28 04:55:43 | 只看该作者
虽然没比紫苏发的  扩展音频模块  来的强悍....


但至少此种前奏+后循环思路
可以解决OGG播放播放位置的指针

於是副标题改了一下.....

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-2-25
帖子
32
8
发表于 2009-6-1 22:04:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6865
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

9
发表于 2009-6-2 00:58:04 | 只看该作者
龙皇做得不错哈~~!{/qiang}{/hx}

为什么我清理帖子的时候没有看到这个帖子啊{/fd}
怪事{/fd}











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
10
 楼主| 发表于 2009-6-2 05:03:10 | 只看该作者
以下引用后知后觉于2009-6-1 16:58:04的发言:

龙皇做得不错哈~~!

为什么我清理帖子的时候没有看到这个帖子啊
怪事

呵呵.....过奖了!


其实龙仔还发了一篇教程帖.....
http://rpg.blue/viewthread.php?tid=114571


(↑众:其实你是来打广告的吧!...PIA)

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-25 10:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表