# 音乐室系统
# 沉迷叶子姐姐的半云献给叶子姐姐...(逃)
# 实现了音乐播放功能(废话。。。)
# 界面还需要再美观一些呢
#音乐室的背景图片,如果不需要背景图片把这个赋值为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
[url=home.php?mod=space&uid=267691]@Music[/url] = 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
([email]0...@music.size[/email]).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