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

Project1

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

[已经解决] 新人请教一个问题:播放任意bgm音乐的脚本代码是什么?

[复制链接]

Lv2.观梦者

梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
帖子
205

开拓者

跳转到指定楼层
1
发表于 2013-11-2 23:33:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 飞翔的小鸟3 于 2013-11-3 00:46 编辑

各位前辈,是这样的:
前几天在ACE的提问区偶然发现有人提问“ 怎么在游戏中更换标题bgm? ”(地址,这位的问题已经解决了:http://rpg.blue/thread-336928-1-2.html
于是我就忽然来了兴致,我可以说是脚本还没入门(那个VX的脚本入门已经看完了,可还不怎么熟练。ACE的是日文,看也看不懂...),所以写脚本一路磕磕碰碰的。

下面来说一下我的思路吧:

外观上:
我想在游戏标题加一个”更换Bgm“按钮,按下去弹出一个窗口:标有”下一首“,”上一首“,”保存当前音乐“,”返回“。
这就是基本的窗口框架了。


脚本上:
(窗口,按键什么的就不说了...)
1.设定$a为所要供玩家选择播放的BGM音乐总数量
2.设定@b为当前所播放音乐序号
3.”下一首“分歧:
  当玩家按下”下一首“时,若@b不为1,即不等于第一首BGM,
    那么@b+1,即播放第二首;
  当玩家按下”下一首“时,若@b为$a,即最后一首BGM,
    那么@b的值变为1,即播放第一首BGM。
4.”上一首“分歧:
  当玩家按下“上一首”时,若@b不为1,即第一首BGM,
    那么@b-1,即播放上一首BGM;
  当玩家按下”上一首“时,若@b为1,即第一首BGM,
    那么@b的值变为$a,即播放最后一首BGM 。

现在问题来了,上述脚本很容易实现,但是要怎么才能播放 BGM 呢?
最初我是用: Audio.bgm_play(filename[, volume[, pitch[, pos]]]) 方法。
我先用数组建一个要播放的所有BGM文件名称总汇,如下:
  1.     bgmname = [
  2.                "Theme1","Theme2","Theme3","Theme4","Theme5"
  3.                ]
复制代码
然后,由于我想在VX中,数组可以这样用:
  1. a=[
  2.    "b","c","d"
  3.    ]
  4. p a[0] --->显示b
复制代码
所以我想是不是可以把BGM名称写入一个数组,然后使用
  1. a[@a]
复制代码
来得到音乐名称呢?
于是我就如下写了:
  1.     filename = a[@a]
  2.     Audio.bgm_play(filename,[ 100,[ 70,[ 0]]])
复制代码
可是结果...报错...
图片等我升级了就上传......
嗯,就是问这个代码要怎么弄?顺便问一下思路对不对?顺便说一下,那个”保存当前BGM“是偶然看到:
Game_System的
  1.   #--------------------------------------------------------------------------
  2.   # ● 保存 BGM
  3.   #--------------------------------------------------------------------------
  4.   def save_bgm
  5.     @saved_bgm = RPG::BGM.last
  6.   end
复制代码
我想这个是保存当前BGM到存档的 吧?这样下次打开游戏就不用再换一次了?(所以我就顺便写下来了)
额,就这样了。
也许这个脚本在前辈们看来是太幼稚了,但鉴于我是刚入门(刚开始 写这个脚本的时候由于不熟悉ACE,我连怎么返回上一个窗口都弄了半天...),各位前辈还请多多指教啊!

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

2
发表于 2013-11-3 00:35:41 | 只看该作者
本帖最后由 喵呜喵5 于 2013-11-3 00:37 编辑

Audio.bgm_play(filename,100,70,0)即可
大括号的意思表示后面几个参数已经有了默认的定义值所以偷懒的话这几个参数可省略…………
因此使用Audio.bgm_play(filename)也是可以播放BGM的(只是音量、音调默认设置成了100,BGM从头开始播放而已……)

点评

又被你抢先了……我只想说【[]】这是方括号/中括号,大括号是【{}】…………  发表于 2013-11-3 07:47
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
发表于 2013-11-3 00:49:25 | 只看该作者
顺便说一下,你那个换歌窗口利用取余可以做的更简便一些:
脚本上:
1.设定@a为所要供玩家选择播放的BGM文件名数组包含的元素个数(Array.size)
2.设定@b = 0 为当前所播放音乐序号
3.按键分歧:
  当玩家按下”下一首“时,@b += 1
       当玩家按下“上一首”时,@b -= 1
       @b %= @a
4.播放音乐      
       播放数组索引中文件名为@b的BGM

评分

参与人数 1星屑 +150 收起 理由
Sion + 150 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
帖子
205

开拓者

4
 楼主| 发表于 2013-11-3 09:13:38 | 只看该作者
本帖最后由 飞翔的小鸟3 于 2013-11-3 09:25 编辑
喵呜喵5 发表于 2013-11-3 00:35
Audio.bgm_play(filename,100,70,0)即可
大括号的意思表示后面几个参数已经有了默认的定义值所以偷懒的话这 ...


谢谢这位前辈了,我弄好了。
但想问问为什么播放后一直是第一首和最后一首?
我想可能也就只有@b的值被固定为1了?这个是怎么回事?我不是把@ b 的值去运算了吗?
下面是我的场景类中自己写的脚本:(前辈那个简化的方法有点看不懂...抱歉...)
RUBY 代码复制
  1. class Scene_Changebgm<Scene_Base
  2.   $ALLBGMMAX = 5
  3.   $NOWBGM    = 1
  4. #开始处理
  5.   def start
  6.     super
  7.     @changebgm = Bgm_change.new(0,0)
  8.     create_background
  9.     create_command_window
  10.   end
  11. #结束处理
  12.   def terminate
  13.     super
  14.     @changebgm.dispose
  15.     dispose_background
  16.     close_command_window
  17.   end
  18. #生成背景
  19.   def create_background
  20.     @background_sprite = Sprite.new
  21.     @background_sprite.bitmap = SceneManager.background_bitmap
  22.     @background_sprite.color.set(0, 0, 0, 128)
  23.   end
  24. #释放背景
  25.   def dispose_background
  26.     @background_sprite.dispose
  27.   end
  28. #生成窗口指令
  29.   def create_command_window
  30.   @changebgm.set_handler(:biaoti, method(:biaotiback))
  31.   @changebgm.set_handler(:last, method(:last))
  32.   @changebgm.set_handler(:next, method(:next))
  33.   @changebgm.set_handler(:savemusic, method(:savemusic))
  34.   end
  35. #关闭窗口指令
  36.   def close_command_window
  37.     @changebgm.dispose
  38.   end
  39. #返回标题画面
  40.   def biaotiback
  41.     SceneManager.return
  42.   end
  43. #上一首
  44.   def last
  45.     if $NOWBGM != 1
  46.       $NOWBGM - 1
  47.     else $NOWBGM = 1
  48.       $NOWBGM = $ALLBGMMAX
  49.     end
  50.     playbgm
  51.   end
  52. #下一首
  53.   def next
  54.     if $NOWBGM != $ALLBGMMAX
  55.       $NOWBGM + 1
  56.     else $NOWBGM = $ALLBGMMAX
  57.       $NOWBGM = 1
  58.     end
  59.     playbgm
  60.   end
  61. #播放音乐
  62.   def playbgm
  63.     bgmname = [
  64.                "","Audio/BGM/Theme1","Audio/BGM/Theme2","Audio/BGM/Theme3",
  65.                "Audio/BGM/Theme4","Audio/BGM/Theme5"
  66.                ]
  67.     Audio.bgm_stop
  68.     filename = bgmname[$NOWBGM]
  69.     Audio.bgm_play(filename,100,70,0)
  70.     SceneManager.goto(Scene_Changebgm)
  71.   end
  72. #保存当前音乐(这个莫名其妙,好像没用?)
  73.   def savemusic
  74.     @game_system = Game_System.new
  75.     @game_system.save_bgm
  76.     Sound.play_save
  77.     SceneManager.return
  78.   end
  79. end


注:
我的脚本大多是在原脚本上修改的,所以下面是我在原脚本中定义的一些代码(用###夹起来的代码):

Vocab模块
RUBY 代码复制
  1. module Vocab
  2. ############################下面
  3.   Changebgm       = "更换bgm"
  4.   Next            = "下一首"
  5.   Last            = "上一首"
  6.   Backbiaoti      = "返回标题"
  7.   Onbgm           = "选择音乐"
  8.   Savemusic       = "保存音乐"
  9. ##############################上面
  10. end



Window_TitleCommand类
RUBY 代码复制
  1. class Window_TitleCommand < Window_Command
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化对象
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     super(0, 0)
  7.     update_placement
  8.     select_symbol(:continue) if continue_enabled
  9.     self.openness = 0
  10.     open
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取窗口的宽度
  14.   #--------------------------------------------------------------------------
  15.   def window_width
  16.     return 160
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 更新窗口的位置
  20.   #--------------------------------------------------------------------------
  21.   def update_placement
  22.     self.x = (Graphics.width - width) / 2
  23.     self.y = (Graphics.height * 1.6 - height) / 2
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 生成指令列表
  27.   #--------------------------------------------------------------------------
  28.   def make_command_list
  29.     add_command(Vocab::new_game, :new_game)
  30.     add_command(Vocab::continue, :continue, continue_enabled)
  31. #############################################下面
  32.     add_command(Vocab::Changebgm,:changebgm)
  33. ###############################################上面
  34.     add_command(Vocab::shutdown, :shutdown)
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 获取“继续游戏”选项是否有效
  38.   #--------------------------------------------------------------------------
  39.   def continue_enabled
  40.     DataManager.save_file_exists?
  41.   end
  42. end




一个window类的简单窗口
RUBY 代码复制
  1. class Bgm_change<Window_Command
  2. #####################################下面
  3.   def initialize(x,y)
  4.     super
  5.     self.openness = 0
  6.     open
  7.   end
  8.   def make_command_list
  9.     add_command(Vocab::Backbiaoti, :biaoti)
  10.     add_command(Vocab::Last, :last)
  11.     add_command(Vocab::Next, :next)
  12.     add_command(Vocab::Savemusic, :savemusic)
  13.   end
  14. end
  15. ##########################################上面




Scene_Title类
RUBY 代码复制
  1. class Scene_Title < Scene_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 开始处理
  4.   #--------------------------------------------------------------------------
  5.   def start
  6.     super
  7.     SceneManager.clear
  8.     Graphics.freeze
  9.     create_background
  10.     create_foreground
  11.     create_command_window
  12.     play_title_music
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取渐变速度
  16.   #--------------------------------------------------------------------------
  17.   def transition_speed
  18.     return 20
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 结束处理
  22.   #--------------------------------------------------------------------------
  23.   def terminate
  24.     super
  25.     SceneManager.snapshot_for_background
  26.     dispose_background
  27.     dispose_foreground
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 生成背景
  31.   #--------------------------------------------------------------------------
  32.   def create_background
  33.     @sprite1 = Sprite.new
  34.     @sprite1.bitmap = Cache.title1($data_system.title1_name)
  35.     @sprite2 = Sprite.new
  36.     @sprite2.bitmap = Cache.title2($data_system.title2_name)
  37.     center_sprite(@sprite1)
  38.     center_sprite(@sprite2)
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 生成背景(gai)
  42.   #--------------------------------------------------------------------------
  43.   def create_background
  44.     beijing = rand(3)
  45.     case beijing
  46.       when 0
  47.         @beijingtwo = "Book"
  48.       when 1
  49.         @beijingtwo = "Castle"
  50.       when 2
  51.         @beijingtwo = "CrossedSwords"
  52.     end
  53.     @sprite1 = Sprite.new
  54.     @sprite1.bitmap = Cache.title1($data_system.title1_name)
  55.     @sprite1.bitmap = Cache.title1(@beijingtwo)
  56.     @sprite2 = Sprite.new
  57.     @sprite2.bitmap = Cache.title2($data_system.title2_name)
  58.     center_sprite(@sprite1)
  59.     center_sprite(@sprite2)
  60.   end
  61.  
  62.   #--------------------------------------------------------------------------
  63.   # ● 生成前景
  64.   #--------------------------------------------------------------------------
  65.   def create_foreground
  66.     @foreground_sprite = Sprite.new
  67.     @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  68.     @foreground_sprite.z = 100
  69.     draw_game_title if $data_system.opt_draw_title
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 绘制游戏标题
  73.   #--------------------------------------------------------------------------
  74.   def draw_game_title
  75.     @foreground_sprite.bitmap.font.size = 48
  76.     rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
  77.     @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 释放背景
  81.   #--------------------------------------------------------------------------
  82.   def dispose_background
  83.     @sprite1.bitmap.dispose
  84.     @sprite1.dispose
  85.     @sprite2.bitmap.dispose
  86.     @sprite2.dispose
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 释放前景
  90.   #--------------------------------------------------------------------------
  91.   def dispose_foreground
  92.     @foreground_sprite.bitmap.dispose
  93.     @foreground_sprite.dispose
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 执行精灵居中
  97.   #--------------------------------------------------------------------------
  98.   def center_sprite(sprite)
  99.     sprite.ox = sprite.bitmap.width / 2
  100.     sprite.oy = sprite.bitmap.height / 2
  101.     sprite.x = Graphics.width / 2
  102.     sprite.y = Graphics.height / 2
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● 生成指令窗口
  106.   #--------------------------------------------------------------------------
  107.   def create_command_window
  108.     @command_window = Window_TitleCommand.new
  109.     @command_window.set_handler(:new_game, method(:command_new_game))
  110.     @command_window.set_handler(:continue, method(:command_continue))
  111.     @command_window.set_handler(:shutdown, method(:command_shutdown))
  112. #################################################下面
  113.    @command_window.set_handler(:changebgm, method(:command_changebgm_open))
  114. ################################################上面
  115.   end
  116. #################################################下面
  117.   def command_changebgm_open
  118.     SceneManager.call(Scene_Changebgm)
  119.     @command_window.close
  120.   end
  121. ##################################################上面
  122.   #--------------------------------------------------------------------------
  123.   # ● 关闭指令窗口
  124.   #--------------------------------------------------------------------------
  125.   def close_command_window
  126.     @command_window.close
  127.     update until @command_window.close?
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   #
  131.   def command_changebgm
  132.     @changebgm = Bgm_change.new(0,0)
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● 指令“开始游戏”
  136.   #--------------------------------------------------------------------------
  137.   def command_new_game
  138.     DataManager.setup_new_game
  139.     close_command_window
  140.     fadeout_all
  141.     $game_map.autoplay
  142.     SceneManager.goto(Scene_Map)
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● 指令“继续游戏”
  146.   #--------------------------------------------------------------------------
  147.   def command_continue
  148.     close_command_window
  149.     SceneManager.call(Scene_Load)
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 指令“退出游戏”
  153.   #--------------------------------------------------------------------------
  154.   def command_shutdown
  155.     close_command_window
  156.     fadeout_all
  157.     SceneManager.exit
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 播放标题画面音乐
  161.   #--------------------------------------------------------------------------
  162.   def play_title_music
  163.     $data_system.title_bgm.play
  164.     RPG::BGS.stop
  165.     RPG::ME.stop
  166.   end
  167. end




可能有点乱....我等等看看再改改排版....

点评

0对3取余为0, 1对3取余为1,2对3取余为2,3对3取余为0,4对3取余为1……取余主要就是让你不需要判断当前数字是几也能在一串数字中循环  发表于 2013-11-3 10:16
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

5
发表于 2013-11-3 09:27:28 | 只看该作者
飞翔的小鸟3 发表于 2013-11-3 09:13
谢谢这位前辈了,我弄好了。
但想问问为什么播放后一直是第一首和最后一首?
我想可能也就只有@b的值被固 ...

Scene_Changebgm 46行和55行
类似于$NOWBGM + 1的地方
改为$NOWBGM += 1
之前你只是加上,表达式的值改变了,变量还是原来的样子
要赋值

Scene_Title 177
RUBY 代码复制
  1. def command_changebgm_open
  2.     SceneManager.call(Scene_Changebgm)
  3.     @command_window.close
  4.   end

改为
RUBY 代码复制
  1. def command_changebgm_open
  2.     SceneManager.call(Scene_Changebgm)
  3.   end

场景转换不需要关闭窗口

Vocab不建议使用Next
next好像就是一个保留字还是关键字什么的…………
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
帖子
205

开拓者

6
 楼主| 发表于 2013-11-3 10:07:26 | 只看该作者
余烬之中 发表于 2013-11-3 09:27
Scene_Changebgm 46行和55行
类似于$NOWBGM + 1的地方
改为$NOWBGM += 1

谢谢前辈的不吝赐教,又弄好了。
再厚脸皮问一个问题:怎么实现保存当前背景音乐呢?我那个不是保存的方法......
这个要用像存档这样的方式吗?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

7
发表于 2013-11-3 10:12:38 | 只看该作者
这个具体要看你想要实现怎样的保存效果,请描述的清楚一些……
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
帖子
205

开拓者

8
 楼主| 发表于 2013-11-3 10:19:36 | 只看该作者
喵呜喵5 发表于 2013-11-3 10:12
这个具体要看你想要实现怎样的保存效果,请描述的清楚一些……

前辈你好,我是想按下“保存BGM”键时,把当前播放的背景音乐保存到数据库里面,这样当下一次打开游戏时,播放的就是上一次自己选的BGM了。类似于在按F9弹出的数据库中----->系统------>改标题画面的音乐。

点评

按楼下的方式来,之后load_data一下就好了  发表于 2013-11-3 10:31
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

9
发表于 2013-11-3 10:26:10 | 只看该作者
飞翔的小鸟3 发表于 2013-11-3 10:07
谢谢前辈的不吝赐教,又弄好了。
再厚脸皮问一个问题:怎么实现保存当前背景音乐呢?我那个不是保存的方 ...

  • Scene_Changebgm
    • RUBY 代码复制
      1. def playbgm
      2.     bgmname = [
      3.                "","Audio/BGM/Theme1","Audio/BGM/Theme2","Audio/BGM/Theme3",
      4.                "Audio/BGM/Theme4","Audio/BGM/Theme5"
      5.                ]
      6.     Audio.bgm_stop
      7.     filename = bgmname[$NOWBGM]
      8.     Audio.bgm_play(filename,100,70,0)
      9.     SceneManager.goto(Scene_Changebgm)
      10.   end

      不需要SceneManager.goto(Scene_Changebgm)
    • RUBY 代码复制
      1. def savemusic
      2.     @game_system = Game_System.new
      3.     @game_system.save_bgm
      4.     Sound.play_save
      5.     SceneManager.return
      6.   end

      改为
      RUBY 代码复制
      1. def savemusic
      2.     $data_system.title_bgm = bgmname[$NOWBGM]
      3.     save_data($data_system, "Data/System.rvdata2")

萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
帖子
205

开拓者

10
 楼主| 发表于 2013-11-3 10:40:21 | 只看该作者
本帖最后由 飞翔的小鸟3 于 2013-11-3 10:41 编辑
余烬之中 发表于 2013-11-3 10:26
  • Scene_Changebgm
  •   def playbgm


  • 前辈,这里要做个说明:
    1.
    1. SceneManager.goto(Scene_Changebgm)
    复制代码
    我本来也没用,但是结果BGM音乐播放出来了,窗口却卡住了。如下:

    2.
    1. $data_system.title_bgm = bgmname[$NOWBGM]
    复制代码
    这个代码最初我也是想到了并且用了,但是:

    报错...上图是用前辈给的代码结果报错的情况。

    点评

    我是直接在论坛里打的……也没有试验,你等我一下  发表于 2013-11-3 10:42
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

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

    GMT+8, 2024-11-17 09:55

    Powered by Discuz! X3.1

    © 2001-2013 Comsenz Inc.

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