查看: 4359|回复: 11

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

[复制链接]
梦石
0
星屑
470
在线时间
159 小时
注册时间
2013-11-2
回帖
177

开拓者

发表于 2013-11-2 23:33:51 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 飞翔的小鸟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,我连怎么返回上一个窗口都弄了半天...),各位前辈还请多多指教啊!

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 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
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 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 认可答案

查看全部评分

回复

使用道具 举报

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

开拓者

 楼主| 发表于 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 的值去运算了吗?
下面是我的场景类中自己写的脚本:(前辈那个简化的方法有点看不懂...抱歉...)
[pre lang="ruby" line="1"]class Scene_Changebgm<Scene_Base
  $ALLBGMMAX = 5
  $NOWBGM    = 1
#开始处理
  def start
    super
    @changebgm = Bgm_change.new(0,0)
    create_background
    create_command_window
  end
#结束处理
  def terminate
    super
    @changebgm.dispose
    dispose_background
    close_command_window
  end
#生成背景
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(0, 0, 0, 128)
  end
#释放背景
  def dispose_background
    @background_sprite.dispose
  end
#生成窗口指令
  def create_command_window
  @changebgm.set_handler(:biaoti, method(:biaotiback))
  @changebgm.set_handler(:last, method(:last))
  @changebgm.set_handler(:next, method(:next))
  @changebgm.set_handler(:savemusic, method(:savemusic))
  end
#关闭窗口指令
  def close_command_window
    @changebgm.dispose
  end
#返回标题画面
  def biaotiback
    SceneManager.return
  end
#上一首
  def last
    if $NOWBGM != 1
      $NOWBGM - 1
    else $NOWBGM = 1
      $NOWBGM = $ALLBGMMAX
    end
    playbgm
  end
#下一首
  def next
    if $NOWBGM != $ALLBGMMAX
      $NOWBGM + 1
    else $NOWBGM = $ALLBGMMAX
      $NOWBGM = 1
    end
    playbgm
  end
#播放音乐
  def playbgm
    bgmname = [
               "","Audio/BGM/Theme1","Audio/BGM/Theme2","Audio/BGM/Theme3",
               "Audio/BGM/Theme4","Audio/BGM/Theme5"
               ]
    Audio.bgm_stop
    filename = bgmname[$NOWBGM]
    Audio.bgm_play(filename,100,70,0)
    SceneManager.goto(Scene_Changebgm)
  end
#保存当前音乐(这个莫名其妙,好像没用?)
  def savemusic
    @game_system = Game_System.new
    @game_system.save_bgm
    Sound.play_save
    SceneManager.return
  end
end
[/pre]

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

Vocab模块
[pre lang="ruby" line="1"]  module Vocab
############################下面
  Changebgm       = "更换bgm"
  Next            = "下一首"
  Last            = "上一首"
  Backbiaoti      = "返回标题"
  Onbgm           = "选择音乐"
  Savemusic       = "保存音乐"
##############################上面
end
[/pre]


Window_TitleCommand类
[pre lang="ruby" line="1"]class Window_TitleCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
    update_placement
    select_symbol(:continue) if continue_enabled
    self.openness = 0
    open
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # ● 更新窗口的位置
  #--------------------------------------------------------------------------
  def update_placement
    self.x = (Graphics.width - width) / 2
    self.y = (Graphics.height * 1.6 - height) / 2
  end
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(Vocab::new_game, :new_game)
    add_command(Vocab::continue, :continue, continue_enabled)
#############################################下面
    add_command(Vocab::Changebgm,:changebgm)
###############################################上面
    add_command(Vocab::shutdown, :shutdown)
  end
  #--------------------------------------------------------------------------
  # ● 获取“继续游戏”选项是否有效
  #--------------------------------------------------------------------------
  def continue_enabled
    DataManager.save_file_exists?
  end
end
[/pre]



一个window类的简单窗口
[pre lang="ruby" line="1"]class Bgm_change<Window_Command
#####################################下面
  def initialize(x,y)
    super
    self.openness = 0
    open
  end
  def make_command_list
    add_command(Vocab::Backbiaoti, :biaoti)
    add_command(Vocab::Last, :last)
    add_command(Vocab::Next, :next)
    add_command(Vocab::Savemusic, :savemusic)
  end
end
##########################################上面
[/pre]



Scene_Title类
[pre lang="ruby" line="1"]class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    SceneManager.clear
    Graphics.freeze
    create_background
    create_foreground
    create_command_window
    play_title_music
  end
  #--------------------------------------------------------------------------
  # ● 获取渐变速度
  #--------------------------------------------------------------------------
  def transition_speed
    return 20
  end
  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    SceneManager.snapshot_for_background
    dispose_background
    dispose_foreground
  end
  #--------------------------------------------------------------------------
  # ● 生成背景
  #--------------------------------------------------------------------------
  def create_background
    @sprite1 = Sprite.new
    @sprite1.bitmap = Cache.title1($data_system.title1_name)
    @sprite2 = Sprite.new
    @sprite2.bitmap = Cache.title2($data_system.title2_name)
    center_sprite(@sprite1)
    center_sprite(@sprite2)
  end
  #--------------------------------------------------------------------------
  # ● 生成背景(gai)
  #--------------------------------------------------------------------------
  def create_background
    beijing = rand(3)
    case beijing
      when 0
        @beijingtwo = "Book"
      when 1
        @beijingtwo = "Castle"
      when 2
        @beijingtwo = "CrossedSwords"
    end
    @sprite1 = Sprite.new
    @sprite1.bitmap = Cache.title1($data_system.title1_name)
    @sprite1.bitmap = Cache.title1(@beijingtwo)
    @sprite2 = Sprite.new
    @sprite2.bitmap = Cache.title2($data_system.title2_name)
    center_sprite(@sprite1)
    center_sprite(@sprite2)
  end

  #--------------------------------------------------------------------------
  # ● 生成前景
  #--------------------------------------------------------------------------
  def create_foreground
    @foreground_sprite = Sprite.new
    @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
    @foreground_sprite.z = 100
    draw_game_title if $data_system.opt_draw_title
  end
  #--------------------------------------------------------------------------
  # ● 绘制游戏标题
  #--------------------------------------------------------------------------
  def draw_game_title
    @foreground_sprite.bitmap.font.size = 48
    rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
    @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  end
  #--------------------------------------------------------------------------
  # ● 释放背景
  #--------------------------------------------------------------------------
  def dispose_background
    @sprite1.bitmap.dispose
    @sprite1.dispose
    @sprite2.bitmap.dispose
    @sprite2.dispose
  end
  #--------------------------------------------------------------------------
  # ● 释放前景
  #--------------------------------------------------------------------------
  def dispose_foreground
    @foreground_sprite.bitmap.dispose
    @foreground_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 执行精灵居中
  #--------------------------------------------------------------------------
  def center_sprite(sprite)
    sprite.ox = sprite.bitmap.width / 2
    sprite.oy = sprite.bitmap.height / 2
    sprite.x = Graphics.width / 2
    sprite.y = Graphics.height / 2
  end
  #--------------------------------------------------------------------------
  # ● 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_TitleCommand.new
    @command_window.set_handler(:new_game, method(:command_new_game))
    @command_window.set_handler(:continue, method(:command_continue))
    @command_window.set_handler(:shutdown, method(:command_shutdown))
#################################################下面
   @command_window.set_handler(:changebgm, method(:command_changebgm_open))
################################################上面
  end
#################################################下面
  def command_changebgm_open
    SceneManager.call(Scene_Changebgm)
    @command_window.close
  end
##################################################上面
  #--------------------------------------------------------------------------
  # ● 关闭指令窗口
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    update until @command_window.close?
  end
  #--------------------------------------------------------------------------
  #
  def command_changebgm
    @changebgm = Bgm_change.new(0,0)
  end
  #--------------------------------------------------------------------------
  # ● 指令“开始游戏”
  #--------------------------------------------------------------------------
  def command_new_game
    DataManager.setup_new_game
    close_command_window
    fadeout_all
    $game_map.autoplay
    SceneManager.goto(Scene_Map)
  end
  #--------------------------------------------------------------------------
  # ● 指令“继续游戏”
  #--------------------------------------------------------------------------
  def command_continue
    close_command_window
    SceneManager.call(Scene_Load)
  end
  #--------------------------------------------------------------------------
  # ● 指令“退出游戏”
  #--------------------------------------------------------------------------
  def command_shutdown
    close_command_window
    fadeout_all
    SceneManager.exit
  end
  #--------------------------------------------------------------------------
  # ● 播放标题画面音乐
  #--------------------------------------------------------------------------
  def play_title_music
    $data_system.title_bgm.play
    RPG::BGS.stop
    RPG::ME.stop
  end
end
[/pre]



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

点评

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

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

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

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

Scene_Title 177
[pre lang="ruby" line="177"]def command_changebgm_open
    SceneManager.call(Scene_Changebgm)
    @command_window.close
  end[/pre]
改为
[pre lang="ruby" line="1"]def command_changebgm_open
    SceneManager.call(Scene_Changebgm)
  end[/pre]
场景转换不需要关闭窗口

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

使用道具 举报

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

开拓者

 楼主| 发表于 2013-11-3 10:07:26 | 显示全部楼层
余烬之中 发表于 2013-11-3 09:27
Scene_Changebgm 46行和55行
类似于$NOWBGM + 1的地方
改为$NOWBGM += 1

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

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-11-3 10:12:38 | 显示全部楼层
这个具体要看你想要实现怎样的保存效果,请描述的清楚一些……
回复

使用道具 举报

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

开拓者

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

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

点评

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

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

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

  • Scene_Changebgm
    • [pre lang="ruby" line="1"]  def playbgm
          bgmname = [
                     "","Audio/BGM/Theme1","Audio/BGM/Theme2","Audio/BGM/Theme3",
                     "Audio/BGM/Theme4","Audio/BGM/Theme5"
                     ]
          Audio.bgm_stop
          filename = bgmname[$NOWBGM]
          Audio.bgm_play(filename,100,70,0)
          SceneManager.goto(Scene_Changebgm)
        end[/pre]
      不需要SceneManager.goto(Scene_Changebgm)
    • [pre lang="ruby" line="1"]  def savemusic
          @game_system = Game_System.new
          @game_system.save_bgm
          Sound.play_save
          SceneManager.return
        end[/pre]
      改为
      [pre lang="ruby" line="1"]  def savemusic
          $data_system.title_bgm = bgmname[$NOWBGM]
          save_data($data_system, "Data/System.rvdata2")[/pre]
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

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

开拓者

 楼主| 发表于 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音乐播放出来了,窗口却卡住了。如下:
    2013-11-03 10-37-28.jpg
    2.
    1. $data_system.title_bgm = bgmname[$NOWBGM]
    复制代码
    这个代码最初我也是想到了并且用了,但是:
    2013-11-03 10-32-37.jpg
    报错...上图是用前辈给的代码结果报错的情况。

    点评

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

    使用道具 举报

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

    本版积分规则

    Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

    在本版发帖返回顶部