查看: 2700|回复: 5

[RMVA发布] MusicRoom 音乐房

[复制链接]
梦石
0
星屑
1902
在线时间
959 小时
注册时间
2012-7-5
回帖
225
发表于 2017-1-9 15:28:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 浮云半仙 于 2018-7-8 14:08 编辑

QQ截图20170109151908.png

场景是 Scene_MusicRoom

这里只放脚本好了...

因为音乐什么也许会有版权问题?我就不放样例工程了...

需要添加音乐的话修改脚本第28行那个数组。(你需要看看F1文档里面ruby的数组和哈希表)

背景图片脚本里默认写nil了(无背景图片)需要的话修改 MUSIC_ROOM_BACKGROUND ,例如 MUSIC_ROOM_BACKGROUND = "./Graphics/Pictures/background.png"

音乐目录钦定为/Audio/BGM,不滋瓷有中文/空格(解决办法可以用某EasyConv脚本转码,文件名带空格可以用GetShortPathName这个API。。这里懒得弄了)

播放音乐用的是windows api,也可以用Audio.bgm_play (后者支持的格式貌似更多,懒得改了....)(

就这样吧,有需要用的请便...暂时并没有更新的想法..

这个代码框还是不能正确显示@开头的东西,导致显示的脚本不正确。这里也以txt文件的形式给出脚本 MusicRoom.zip (2.06 KB, 下载次数: 84)

[pre lang="ruby" file="MusicRoom"]# 音乐室系统
# 沉迷叶子姐姐的半云献给叶子姐姐...(逃)

# 实现了音乐播放功能(废话。。。)
# 界面还需要再美观一些呢

#音乐室的背景图片,如果不需要背景图片把这个赋值为nil
MUSIC_ROOM_BACKGROUND = nil

#这段就是音乐的定义啦
class MusicItem
  attr_reader :name, :author, :filename, :note, :from
  def initialize(info)
      @name = info[:name]?info[:name]:"music"
      @author = info[:author]?info[:author]:"Violacea"
      @note = info[:note]?info[:note]:"Nothing"
      @from = info[:from]?info[:from]:"不懂乐理瞎哼组"
      throw ArgumentError, "音乐(MusicItem)的文件名是必要的" if !info[:filename]
      @filename = info[:filename]
  end
end

#音乐列表,默认(其实是钦定)音乐的源文件在Audio/BGM下
#曲子的说明(note)可以有换行,需要自行处理换行符\n
#不要忘了有转义的字符串要用双引号...
#文件名是可以是中文的(但是现在还没支持..最近两天6r上不去找不到兰兰姐姐那篇解决
# api调用里面中文路径名的问题的文章了..
MUSIC_LIST = [
    MusicItem.new(:name => '上海红茶馆', :filename => "th06_06.wav",
              :from => '上海爱丽丝幻乐团', :author => 'ZUN',
        :note => "  东方红魔乡第三面道中曲,浓\n浓中国风")
  ]

#下面是主要的实现
class Window_MusicChoose < Window_Command
   
  attr_reader :music
  def initialize(ms)  #
    super(0, Graphics.height/6)
    self.back_opacity = 0
    @Music = ms
    create_music_list
  end
  def window_width
    Graphics.width/3
  end
  def window_height
    Graphics.height/6*5
  end
  
  def create_music_list  #绘制项目
    @music.each do |m|
      add_command(m.name, m.filename.to_sym, true) #就这样懒省事啦~
    end
    (0...@music.size).each{|i| draw_item(i)}
  end
  
end

class Window_MusicInfo < Window_Base
  def initialize
    super(Graphics.width/3, 0, Graphics.width/3*2, Graphics.height)
    self.back_opacity = 0
  end
  
  def show_title(music)  #绘制音乐的名字
    contents.font.size = 32
    draw_text(4, 0, width, 40, music.name, 0)
  end
  def show_from(music)   #来源
    contents.font.size = 22
    draw_text(0, 40, width, 40, "From #{music.from}  ", 2)
  end
  def show_author(music) #作者
    contents.font.size = 22
    draw_text(0, 70, width, 40, "By #{music.author}  ", 2)
  end
  def show_note(music) #备注
    draw_text_ex(0, 140, music.note)
  end
end

class Scene_MusicRoom < Scene_Base
  def start
    super
    create_music_window #音乐室标题
    create_music_choose_window #音乐选择窗口
    create_music_info_window  #音乐信息窗口
    create_background #加载背景图片
  end
  
  def create_music_window
    w = Graphics.width/3
    h = Graphics.height/6
    @music_window = Window_Base.new(0, 0, w, h)
    @music_window.contents.font.size = 32
    @music_window.draw_text(0, -10, w, h, "音乐室  ", 1) #居中显示
  end
  def create_music_choose_window
    @choose_window = Window_MusicChoose.new(load_music_list)
    @choose_window.set_handler(:cancel, method(:on_cancel))
    @choose_window.set_handler(:ok, method(:on_choose_music))
    @choose_window.back_opacity = 0
  end
  def create_music_info_window
    @info_window = Window_MusicInfo.new
    show_music_info(0)
  end
  def create_background
    return if !MUSIC_ROOM_BACKGROUND
    @background = Sprite.new
    @background.bitmap = Bitmap.new(MUSIC_ROOM_BACKGROUND)
    @background.x = 0
    @background.y = 0
    @background.z = -233
  end
  def destroy_background
    @background.dispose if @background.is_a?(Sprite)
  end
  
  def load_music_list #注:文件名是可以支持中文的,解决方法在兰触的文章里面...
    MUSIC_LIST
  end
  
  #展示音乐信息
  def show_music_info(id)
    m = @choose_window.music[id]
    @info_window.contents.clear
    @info_window.show_title(m)
    @info_window.show_from(m)
    @info_window.show_author(m)
    @info_window.show_note(m)
  end
  
  MSS = Win32API.new("winmm", "mciSendString", "plll", "l") #这个神奇的api
  MARK = "music_233"  #这个名字不要在意啦
  def stop_music  #停止正在播放的音乐
    MSS.call "stop #{MARK}", 0, 0, 0
    MSS.call "close #{MARK}", 0, 0, 0
  end
  def play_music(id) #播放音乐(参数,列表中的id)
    stop_music
    MSS.call sprintf("open ./Audio/BGM/%s alias %s", @choose_window.music[id].filename, MARK), 0, 0, 0
    MSS.call "play #{MARK}", 0, 0, 0
  end
  
  def on_choose_music #选择一个音乐时的处理
    show_music_info(@choose_window.index)
    play_music(@choose_window.index)
    @choose_window.activate
  end
  def on_cancel  #退出音乐室
    stop_music   #退出前要stop_music
    destroy_background
    SceneManager.return
  end
end[/pre]

评分

参与人数 4星屑 +499 收起 理由
zaiy2863 + 266 好死不死的弄个wav
VIPArcher + 67 妙
kuerlulu + 100 喵
OldtreeLethe + 66 啧半云

查看全部评分

tan(pi/2)

花匠

梦石
64
星屑
16710
在线时间
4205 小时
注册时间
2016-6-17
回帖
1004

极短26获奖极短24参与开拓者

发表于 2017-1-9 15:56:20 | 显示全部楼层
只要不做商用,那个什么……供学习交流使用,应该……就不会造成侵权把?
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45699
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-1-9 18:56:43 | 显示全部楼层
用默认的包装好的播放不好吗……api又没有优势。

点评

因为叶子姐姐触啊  发表于 2017-1-9 20:58
叶子姐姐要影响全世界了!  发表于 2017-1-9 18:59
嘛,其实是我RGSS很小白的啦,用了API后来查F1才知道Audio里面直接用的方法。 而且叶子姐姐也用不到了我也就懒得改了  发表于 2017-1-9 18:58
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部