Project1
标题:
音乐盒脚本卡顿,读取问题
[打印本页]
作者:
1181770261
时间:
2014-11-9 15:56
标题:
音乐盒脚本卡顿,读取问题
本帖最后由 1181770261 于 2014-11-9 15:57 编辑
#==============================================================================
# +++ MOG - MUSIC BOX (v1.2) +++ (音乐盒)
#==============================================================================
# 原作 Moghunter
# http://www.atelier-rgss.com/
# 翻译 heiwang1997
#==============================================================================
# 这个系统可以让你听游戏中的背景音乐
#==============================================================================
#==============================================================================
# 使用说明
#
# 1 - 创建名为 MUSIC COVER 的文件夹
# /Graphics/Music_Cover/
#
# 2 - 从范例中拷贝以下文件:
# Layout.png
# Layout2.png
#
#==============================================================================
# 可选操作
#
# 添加歌曲的链接图片如下命名:
#
# FILE_NAME + _B1
# FILE_NAME + _B2
#
# 例如:
#
# 歌曲名称
# Theme5.MP3 (Ogg/mid/etc...)
#
# 那么你就可以把以下图片拷贝到 /Graphics/Music_Cover/ 文件夹中作为歌曲封面
# Theme5_B1.png 或
# Theme5_B2.png
#
# 注意 - 后缀是_B1则意味着图片有滚动效果,只是显示图片的话就把它的后缀改为_B2
#
#==============================================================================
# 调用这个类:
#
# SceneManager.call(Scene_Music_Box)
#
#==============================================================================
module MOG_MUSIC_BOX
# 播放列表窗口的位置
MUSIC_LIST_POSITION_TEXT = [0, 200]
MUSIC_LIST_POSITION_LAYOUT = [0, 195]
# 隐藏歌曲列表窗口的时间
MUSICLIST_FADE_TIME = 2#(秒)
# 滚动图象的速度设置 [X,Y]
BACKGROUND_SCROLL_SPEED = [2,0]
# 动态角色(右下角有一个听音乐的萝莉)
CHARACTER_SPRITE = false
# 角色动画速度
CHARACTER_ANIMATION_SPEED = 30
# 角色位置
CHARACTER_POSITION = [300,140]
# 播放完毕后的提示语
COMPLETED_WORD = "完成"
# 信息窗口的位置
INFO_POSITION = [0,373]
# 音乐列表中是否包含RTP自带音乐
INCLUDE_RTP = false
# RTP安装地址(不同操作系统是不同的)
# 下面的RTP路径基于 Windows7
RTP_PATH = "Audio/BGM/"
# 在主菜单中打开音乐盒命令
MENU_COMMAND = true
# 菜单名称
MENU_COMMAND_NAME = "音乐盒"
end
#===============================================================================
# ■ Game System
#===============================================================================
class Game_System
attr_accessor :music_book_list
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_music_book_initialize initialize
def initialize
mog_music_book_initialize
music_book_setup
end
#--------------------------------------------------------------------------
# ● Music Book Setup
#--------------------------------------------------------------------------
def music_book_setup
return if !SceneManager.scene_is?(Scene_Title)
@music_book_list = []
@music_book_list.push([$data_system.title_bgm.name,true]) if $data_system.title_bgm.name != ""
path = "Audio/BGM/"
make_music_list(path)
if MOG_MUSIC_BOX::INCLUDE_RTP
path = MOG_MUSIC_BOX::RTP_PATH
make_music_list(path)
end
end
#--------------------------------------------------------------------------
# ● Make_Music_List
#--------------------------------------------------------------------------
def make_music_list(path)
return if !File.directory?(path)
list = Dir.entries(path)
for i in 2...list.size
file_name = File.basename(list[i].to_s, ".*")
@music_book_list.push([file_name,false]) unless repeated_song?(file_name)
end
end
#--------------------------------------------------------------------------
# ● Repeated Song?
#--------------------------------------------------------------------------
def repeated_song?(file_name)
for i in 0...@music_book_list.size
return true if @music_book_list[i].include?(file_name)
end
return false
end
end
#===============================================================================
# ■ RPG AudioFile
#===============================================================================
class RPG::BGM < RPG::AudioFile
#--------------------------------------------------------------------------
# ● Play
#--------------------------------------------------------------------------
alias mog_music_book_play play
def play(pos = 0)
mog_music_book_play(pos)
check_music_book
end
#--------------------------------------------------------------------------
# ● Check Music Book
#--------------------------------------------------------------------------
def check_music_book
return if $game_system.music_book_list == nil
return if @name.empty?
for i in 0...$game_system.music_book_list.size
if $game_system.music_book_list[i][0] == @name
$game_system.music_book_list[i][1] = true
break
end
end
end
end
#===============================================================================
# ■ RPG Cache
#===============================================================================
module Cache
#--------------------------------------------------------------------------
# ● Music Cover
#--------------------------------------------------------------------------
def self.music_cover(filename)
load_bitmap("Graphics/Music_Cover/", filename)
end
end
#===============================================================================
# ■ RPG_FileTest
#===============================================================================
module RPG_FileTest
#--------------------------------------------------------------------------
# ● RPG_FileTest.music_cover_exist?
#--------------------------------------------------------------------------
def RPG_FileTest.music_cover_exist?(filename)
return Cache.music_cover(filename) rescue return false
end
end
#==============================================================================
# ■ Window_Picture
#==============================================================================
class Window_Music_List < Window_Selectable
#------------------------------------------------------------------------------
# ● Initialize
#------------------------------------------------------------------------------
def initialize
super(0, 0, 544, 160)
self.opacity = 0
@index = -1
@item_max = $game_system.music_book_list.size
refresh
select(0)
activate
end
#------------------------------------------------------------------------------
# ● Refresh
#------------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
if @item_max > 0
self.contents = Bitmap.new(width - 32, 24 * @item_max)
for i in 0...@item_max
draw_item(i)
end
return
end
self.contents = Bitmap.new(width - 32, 24)
self.contents.draw_text(x,y,440,32,"没有数据",0)
end
#------------------------------------------------------------------------------
# ● draw_item
#------------------------------------------------------------------------------
def draw_item(index)
x = 0
y = 24 * index
if $game_system.music_book_list[index][1]
change_color(normal_color,true)
music = "N" + sprintf("%02d", index + 1).to_s + " - "+ $game_system.music_book_list[index][0].to_s
else
change_color(normal_color,false)
music = "N" + sprintf("%02d", index + 1).to_s + " - 未开放"
end
self.contents.draw_text(x,y,440,32,music,0)
end
#------------------------------------------------------------------------------
# ● Col Max
#------------------------------------------------------------------------------
def col_max
return 1
end
#------------------------------------------------------------------------------
# ● Item Max
#------------------------------------------------------------------------------
def item_max
return @item_max == nil ? 0 : @item_max
end
end
#===============================================================================
# ■ Scene Music Box
#===============================================================================
class Scene_Music_Box
include MOG_MUSIC_BOX
#--------------------------------------------------------------------------
# ● Main
#--------------------------------------------------------------------------
def main
execute_dispose
create_music_list
create_layout
create_sprite_now_playing
create_character
execute_loop
execute_dispose
end
#--------------------------------------------------------------------------
# ● Execute Loop
#--------------------------------------------------------------------------
def execute_loop
Graphics.transition
loop do
Graphics.update
Input.update
update
break if SceneManager.scene != self
end
end
#--------------------------------------------------------------------------
# ● Create Layout
#--------------------------------------------------------------------------
def create_layout
@background = Plane.new
@background.z = 1
@background2 = Sprite.new
@background2.z = 2
@layout = Sprite.new
@layout.bitmap = Cache.music_cover("Layout")
@layout.z = 90
@old_index = -1
end
#--------------------------------------------------------------------------
# ● create Sprite now Playing
#--------------------------------------------------------------------------
def create_sprite_now_playing
@now_playing = Plane.new
@now_playing.bitmap = Bitmap.new(544,416)
@now_playing.z = 100
check_completion
make_now_playing(true)
end
#--------------------------------------------------------------------------
# ● Check Completion
#--------------------------------------------------------------------------
def check_completion
comp = 0
for i in 0...$game_system.music_book_list.size
comp += 1 if $game_system.music_book_list[i][1]
end
if $game_system.music_book_list.size > 0
@completed = "( " + COMPLETED_WORD + " " + (comp.to_f / $game_system.music_book_list.size * 100).truncate.to_s + "% )"
else
@completed = "( " + COMPLETED_WORD + " )"
end
end
#--------------------------------------------------------------------------
# ● Create_Character
#--------------------------------------------------------------------------
def create_character
return if !CHARACTER_SPRITE
@character_index = 0
@character_animation_speed = 0
[url=home.php?mod=space&uid=2631396]@character[/url] = Sprite.new
@character.z = 80
@character_image = Cache.music_cover("Character")
@character_frame_max = @character_image.width / @character_image.height
@character_width = @character_image.width / @character_frame_max
@character.bitmap = Bitmap.new(@character_width,@character_image.height)
@character.x = CHARACTER_POSITION[0]
@character.y = CHARACTER_POSITION[1]
make_character_bitmap
end
#--------------------------------------------------------------------------
# ● Make Now Playing
#--------------------------------------------------------------------------
def make_now_playing(init = false)
@now_playing.bitmap.clear
@now_playing.bitmap.font.size = 20
@now_playing.bitmap.font.bold = true
text = song_name + " " + @completed
text = @completed if init
@now_playing.bitmap.draw_text(INFO_POSITION[0],INFO_POSITION[1], 544, 32, text.to_s,1)
@now_playing.opacity = 0
end
#--------------------------------------------------------------------------
# ● Make Background
#--------------------------------------------------------------------------
def make_background
if @background.bitmap != nil
@background.bitmap.dispose
@background.bitmap = nil
end
if RPG_FileTest.music_cover_exist?(song_name + "_B1")
@background.bitmap = Cache.music_cover(song_name + "_B1")
else
@background.bitmap = Cache.music_cover("")
end
@background.opacity = 0
if @background2.bitmap != nil
@background2.bitmap.dispose
@background2.bitmap = nil
end
if RPG_FileTest.music_cover_exist?(song_name + "_B2")
@background2.bitmap = Cache.music_cover(song_name + "_B2")
else
@background2.bitmap = Cache.music_cover("")
end
@background2.opacity = 0
end
#--------------------------------------------------------------------------
# ● Song Name
#--------------------------------------------------------------------------
def song_name
if $game_system.music_book_list.size == 0
return ""
end
return $game_system.music_book_list[@music_list_window.index][0].to_s
end
#--------------------------------------------------------------------------
# ● Create_Music_List
#--------------------------------------------------------------------------
def create_music_list
[url=home.php?mod=space&uid=76426]@stop[/url] = true
@layout2 = Sprite.new
@layout2.bitmap = Cache.music_cover("Layout2")
@layout_org_position = [MUSIC_LIST_POSITION_LAYOUT[0],MUSIC_LIST_POSITION_LAYOUT[1]]
@layout2.y = @layout_org_position[1]
@layout2.z = 90
@music_list_window = Window_Music_List.new
@music_list_window.z = 100
@music_list_window_org = [MUSIC_LIST_POSITION_TEXT[0],MUSIC_LIST_POSITION_TEXT[1]]
@music_list_window.y = @music_list_window_org[1]
@music_index = @music_list_window.index
@fade_max = 60 + 60 * MUSICLIST_FADE_TIME
@fade_time = @fade_max
@music_list_window.x = -544
@music_list_window.contents_opacity = 0
@layout2.x = -544
@layout2.opacity = 0
end
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
BattleManager.save_bgm_and_bgs
RPG::BGM.fade(2 * 1000)
RPG::BGS.fade(2 * 1000)
@w_visible = true
end
#--------------------------------------------------------------------------
# ● Execute Dispose
#--------------------------------------------------------------------------
def execute_dispose
return if @layout == nil
Graphics.freeze
@music_list_window.dispose
if @background.bitmap != nil
@background.bitmap.dispose
end
@background.dispose
if @background2.bitmap != nil
@background2.bitmap.dispose
end
@background2.dispose
@layout.bitmap.dispose
@layout.dispose
@layout = nil
@layout2.bitmap.dispose
@layout2.dispose
@now_playing.bitmap.dispose
@now_playing.dispose
if CHARACTER_SPRITE
@character.bitmap.dispose
@character.dispose
@character_image.dispose
end
RPG::BGM.stop
BattleManager.replay_bgm_and_bgs
end
#--------------------------------------------------------------------------
# ● Hide_Layout
#--------------------------------------------------------------------------
def hide_layout
Sound.play_ok
@w_visible = @w_visible == true ? false : true
@fade_time = @w_visible ? @fade_max : 0
@layout.visible = @w_visible
if CHARACTER_SPRITE
@character.visible = @w_visible
end
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
update_commands
update_animation
end
#--------------------------------------------------------------------------
# ● Update Animation
#--------------------------------------------------------------------------
def update_animation
@now_playing.opacity += 2
@now_playing.ox += 1
update_list_fade
update_character_animation
update_background_animation
end
#--------------------------------------------------------------------------
# ● Update Background Animation
#--------------------------------------------------------------------------
def update_background_animation
@background.opacity += 1
@background2.opacity += 1
@background.ox += BACKGROUND_SCROLL_SPEED[0]
@background.oy += BACKGROUND_SCROLL_SPEED[1]
end
#--------------------------------------------------------------------------
# ● Update Character Animation
#--------------------------------------------------------------------------
def update_character_animation
return if !CHARACTER_SPRITE or @stop
@character_animation_speed += 1
if @character_animation_speed > CHARACTER_ANIMATION_SPEED
@character_animation_speed = 0
@character_index += 1
@character_index = 0 if @character_index >= @character_frame_max
make_character_bitmap
end
end
#--------------------------------------------------------------------------
# ● Make Character_bitmap
#--------------------------------------------------------------------------
def make_character_bitmap
@character.bitmap.clear
src_rect_back = Rect.new(@character_width * @character_index, 0,@character_width,@character_image.height)
@character.bitmap.blt(0,0, @character_image, src_rect_back)
end
#--------------------------------------------------------------------------
# ● Update List Fade
#--------------------------------------------------------------------------
def update_list_fade
@fade_time = @fade_max if moved?
slide_speed = 5
fade_speed = 3
if @fade_time > 0
@fade_time -= 1
@layout2.opacity += fade_speed * 2
@music_list_window.contents_opacity += fade_speed * 2
if @music_list_window.x < @music_list_window_org[0]
@music_list_window.x += slide_speed * 2
@layout2.x += slide_speed * 2
if @music_list_window.x >= @music_list_window_org[0]
@music_list_window.x = @music_list_window_org[0]
@layout2.x = @layout_org_position[0]
end
end
else
@music_list_window.x -= slide_speed
@music_list_window.contents_opacity -= fade_speed
@layout2.x -= slide_speed
@layout2.opacity -= fade_speed
if @music_list_window.x < -544
@music_list_window.x = -544
@music_list_window.contents_opacity = 0
@layout2.x = -544
@layout2.opacity = 0
end
end
end
#--------------------------------------------------------------------------
# ● Moved?
#--------------------------------------------------------------------------
def moved?
return true if Input.trigger?(:C)
return true if Input.trigger?(:B)
return true if Input.trigger?(:X)
return true if Input.trigger?(:R)
return true if Input.trigger?(:L)
return true if Input.press?(Input.dir4)
return false
end
#--------------------------------------------------------------------------
# ● Update Commands
#--------------------------------------------------------------------------
def update_commands
@music_list_window.update
if Input.trigger?(:B)
return_to_scene
elsif Input.trigger?(:C)
play_song
elsif Input.trigger?(:X)
stop_song
elsif Input.trigger?(:Y)
hide_layout
end
end
#--------------------------------------------------------------------------
# ● Return to Scene
#--------------------------------------------------------------------------
def return_to_scene
return if @fade_time == 0 and @layout2.opacity == 0
Sound.play_cancel
SceneManager.return
end
#--------------------------------------------------------------------------
# ● index_changed?
#--------------------------------------------------------------------------
def index_changed?
if @old_index != @music_list_window.index
@old_index = @music_list_window.index
return true
end
return false
end
#--------------------------------------------------------------------------
# ● Play Song
#--------------------------------------------------------------------------
def play_song
return if $game_system.music_book_list.size == 0
return if @fade_time == 0 and @layout2.opacity == 0
if $game_system.music_book_list[@music_list_window.index][1]
if index_changed? or @stop
Sound.play_ok
@stop = false
Audio.bgm_play("Audio/BGM/" + song_name, 100, 100) rescue nil
make_background
make_now_playing
end
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# ● Stop Song
#--------------------------------------------------------------------------
def stop_song
Sound.play_ok
@stop = true
RPG::BGM.fade(3 * 1000)
make_now_playing(true)
end
end
if MOG_MUSIC_BOX::MENU_COMMAND
#==============================================================================
# ■ Window Menu Command
#==============================================================================
class Window_MenuCommand < Window_Command
#------------------------------------------------------------------------------
# ● Add Main Commands
#------------------------------------------------------------------------------
alias mog_musicbox_add_main_commands add_main_commands
def add_main_commands
mog_musicbox_add_main_commands
add_command(MOG_MUSIC_BOX::MENU_COMMAND_NAME, :musicbox, main_commands_enabled)
end
end
#==============================================================================
# ■ Scene Menu
#==============================================================================
class Scene_Menu < Scene_MenuBase
#------------------------------------------------------------------------------
# ● Create Command Windows
#------------------------------------------------------------------------------
alias mog_musicbox_create_command_window create_command_window
def create_command_window
mog_musicbox_create_command_window
@command_window.set_handler(:musicbox, method(:Music_Box))
end
#------------------------------------------------------------------------------
# ● Music Box
#------------------------------------------------------------------------------
def Music_Box
SceneManager.call(Scene_Music_Box)
end
end
end
$mog_rgss3_music_box = true
复制代码
用过了,功能很不错。就是......很卡。不管我怎么设置图片,改变图片格式,削减BGM数量,但是就是很卡,估计压根没有几帧。
音乐格式也一样,OGG,MP3等等,功能说可以用,但是试过,也转码过,就是不能解决卡顿的问题,连退出都需要响应一段时间慢动作,不知道有没有什么办法可以解决。
另外这个脚本有一点我不是很明白,就是音乐永远只有标题画面那一首,问题很多很罗嗦。(捂脸_(:з」∠)_
作者:
落月小天魔
时间:
2014-11-9 16:11
可能是用了其他脚本导致卡的,我用的时候不卡,而且这个音乐盒是解锁的,听过哪首歌就有哪首歌,所以只有标题画面...
另外,这个和歌曲格式没啥关系吧...
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1