Project1

标题: Ryusic 音樂播放系統(場景) [打印本页]

作者: YamazakiRyusa    时间: 2011-11-15 15:23
标题: Ryusic 音樂播放系統(場景)
本帖最后由 YamazakiRyusa 于 2011-11-15 18:54 编辑

其實是傻瓜版的音樂播放場景,之前想找帖子,但是都過期了。於是自己寫了一份。
窗口是基於特技窗口修改而來的。
看圖:



腳本如下:
  1. #==============================================================================
  2. # ■ Scene_Ryusic
  3. #------------------------------------------------------------------------------
  4. #  处理音樂播放的類。
  5. #   作者:Yamazaki Ryusa | 調試:SmilP | 版本:1.00 正式版
  6. #   /* 此版本已經由 Yamazaki Ryusa 授權發布在 66RPG.COM */
  7. #==============================================================================
  8. # ■使用說明:曲目的項目以技能的形式設置,需要對應好職業,間接對應到角色
  9. #   曲目播放的判定是技能的 ID,故
  10. #   在 p_ryusic 的定義裡可以自行修改播放的曲目
  11. # ■已經設置窗體透明,不需要則把 @screen 的調用和釋放給註釋掉
  12. # ■使用方法:在事件中調用 @scene = Scene_Ryusic.new 即可
  13. #==============================================================================

  14. class Scene_Ryusic
  15.   #--------------------------------------------------------------------------
  16.   # ● 初始化对像
  17.   #     actor_index : 角色索引
  18.   #--------------------------------------------------------------------------
  19.   def initialize(actor_index = 0, equip_index = 0)
  20.     @actor_index = actor_index
  21.     # 當調用的場景在地圖時
  22.     unless $scene.is_a?(Scene_Map)
  23.       # 记录地图 BGM
  24.       $game_temp.map_bgm = $game_system.playing_bgm
  25.       $game_system.bgm_stop
  26.     else
  27.       return
  28.     end
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 主处理
  32.   #--------------------------------------------------------------------------
  33.   def main
  34.     # DEBUG [email protected] #
  35.     # 上個版本中,场景和场景之间没释放完就调用了下一个场景,造成強退,已修復
  36.     @screen = Spriteset_Map.new
  37.     # ■作為音樂播放的角色編號,自行更改
  38.     @actor = $game_actors[14]
  39.     # 生成帮助窗口、状态窗口、特技窗口
  40.     @help_window = Window_Help.new
  41.     @status_window = Window_RyusicStatus.new
  42.     @skill_window = Window_Music.new(@actor)
  43.     # 关联帮助窗口
  44.     @skill_window.help_window = @help_window
  45.     # 生成目标窗口 (设置为不可见・不活动)
  46.     @target_window = Window_Target.new
  47.     @target_window.visible = false
  48.     @target_window.active = false
  49.     # 执行过渡
  50.     Graphics.transition
  51.     # 主循环
  52.     loop do
  53.       # 刷新游戏画面
  54.       Graphics.update
  55.       # 刷新输入信息
  56.       Input.update
  57.       # 刷新画面
  58.       update
  59.       # 如果画面切换的话就中断循环
  60.       if $scene != self
  61.         break
  62.       end
  63.     end
  64.     # 准备过渡
  65.     Graphics.freeze
  66.     # 释放窗口
  67.     @screen.dispose
  68.     @status_window.dispose
  69.     @help_window.dispose
  70.     @skill_window.dispose
  71.     @target_window.dispose
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 刷新画面
  75.   #--------------------------------------------------------------------------
  76.   def update
  77.     # 刷新窗口
  78.     @help_window.update
  79.     @skill_window.update
  80.     @status_window.update
  81.     @target_window.update
  82.     # 特技窗口被激活的情况下: 调用 update_skill
  83.     if @skill_window.active
  84.       update_skill
  85.       return
  86.     end
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 刷新画面 (特技窗口被激活的情况下)
  90.   #--------------------------------------------------------------------------
  91.   def update_skill
  92.     # 按下 B 键的情况下
  93.     if Input.trigger?(Input::B)
  94.       # 演奏取消 SE
  95.       $game_system.se_play($data_system.cancel_se)
  96.       # ■取消時返回的場景,已經優化,請自行修改返回菜單時光標停留位置
  97.       if $scene.is_a?(Scene_Map)
  98.         $scene = Scene_Map.new
  99.       else
  100.         $scene = Scene_Menu.new(5) #——■參數自設
  101.       end
  102.       # 當調用場景為地圖時,恢復地圖 BGM
  103.       if $scene.is_a?(Scene_Map)
  104.         # 恢复 BGM
  105.         $game_system.bgm_play($game_temp.map_bgm)
  106.       else
  107.         return
  108.       end
  109.       return
  110.     end
  111.     # 按下 C 键的情况下
  112.     if Input.trigger?(Input::C)
  113.       # 获取特技窗口现在选择的特技的数据
  114.       @skill = @skill_window.skill
  115.       # 演奏确定 SE
  116.       $game_system.se_play($data_system.decision_se)
  117.       # 調用播放
  118.       r_play
  119.     end
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 調用播放的設置
  123.   #--------------------------------------------------------------------------
  124.   def r_play
  125.     # ■這個分歧是通過讀取技能編號實現的,請自設技能。一般地,技能使用情況不是
  126.     #   “不能使用”或“戰鬥中”時效果較好
  127.     case @skill.id
  128.       when 110 # 第一主題曲
  129.         Audio.bgm_play("Audio/BGM/012-Theme01",80,100)
  130.       when 111 # 第二主題曲
  131.         Audio.bgm_play("Audio/BGM/013-Theme02",80,100)
  132.       when 112 # 第三主題曲
  133.         Audio.bgm_play("Audio/BGM/014-Theme03",80,100)
  134.       when 113 # 第四主題曲
  135.         Audio.bgm_play("Audio/BGM/015-Theme04",80,100)
  136.       else # 防止出錯
  137.         return 110
  138.     end
  139.   end
  140. end

  141. #==============================================================================
  142. # ■ Window_SkillStatus
  143. #------------------------------------------------------------------------------
  144. #    顯示版權信息
  145. #==============================================================================

  146. class Window_RyusicStatus < Window_Base
  147.   #--------------------------------------------------------------------------
  148.   # ● 初始化对像
  149.   #--------------------------------------------------------------------------
  150.   def initialize
  151.     super(0, 64, 640, 64)
  152.     self.contents = Bitmap.new(width - 32, height - 32)
  153.     refresh
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● 刷新
  157.   #--------------------------------------------------------------------------
  158.   def refresh
  159.     self.contents.clear
  160.     # 第二個窗體顯示的內容,不建議修改
  161.     self.contents.draw_text(0, -16, 640, 64, "Ryusic | 流砂音樂鑑賞器 | 1.00 正式版", 0)
  162.   end
  163. end

  164. #==============================================================================
  165. # ■ Window_Music
  166. #------------------------------------------------------------------------------
  167. #  從 Window_Skill 備份出來的部分,僅僅為了取消掉 SP 花費數的顯示
  168. # 故註釋內容全部沒有修改
  169. #==============================================================================

  170. class Window_Music < Window_Selectable
  171.   #--------------------------------------------------------------------------
  172.   # ● 初始化对像
  173.   #     actor : 角色
  174.   #--------------------------------------------------------------------------
  175.   def initialize(actor)
  176.     super(0, 128, 640, 352)
  177.     @actor = actor
  178.     @column_max = 2
  179.     refresh
  180.     self.index = 0
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 获取特技
  184.   #--------------------------------------------------------------------------
  185.   def skill
  186.     return @data[self.index]
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 刷新
  190.   #--------------------------------------------------------------------------
  191.   def refresh
  192.     if self.contents != nil
  193.       self.contents.dispose
  194.       self.contents = nil
  195.     end
  196.     @data = []
  197.     for i in [email protected]
  198.       skill = $data_skills[@actor.skills[i]]
  199.       if skill != nil
  200.         @data.push(skill)
  201.       end
  202.     end
  203.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  204.     @item_max = @data.size
  205.     if @item_max > 0
  206.       self.contents = Bitmap.new(width - 32, row_max * 32)
  207.       for i in 0...@item_max
  208.         draw_item(i)
  209.       end
  210.     end
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ● 描绘项目
  214.   #     index : 项目编号
  215.   #--------------------------------------------------------------------------
  216.   def draw_item(index)
  217.     skill = @data[index]
  218.     if @actor.skill_can_use?(skill.id)
  219.       self.contents.font.color = normal_color
  220.     else
  221.       self.contents.font.color = disabled_color
  222.     end
  223.     x = 4 + index % 2 * (288 + 32)
  224.     y = index / 2 * 32
  225.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  226.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  227.     bitmap = RPG::Cache.icon(skill.icon_name)
  228.     opacity = self.contents.font.color == normal_color ? 255 : 128
  229.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  230.     self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
  231.     #self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  232.   end
  233.   #--------------------------------------------------------------------------
  234.   # ● 刷新帮助文本
  235.   #--------------------------------------------------------------------------
  236.   def update_help
  237.     @help_window.set_text(self.skill == nil ? "" : self.skill.description)
  238.   end
  239. end
复制代码
使用方法圖:

【1】定義一個角色(編號可改,記得在腳本中也更改)作為音樂播放,該步驟僅用來讀取特技 ID。

【2】設置技能 ID,屬性如下。(已經血肉模糊了……)

【3】最重要的步驟,在職業中增加技能。






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1