Project1
标题:
怎样实现存档动画
[打印本页]
作者:
勇敢的馒头
时间:
2010-12-7 17:00
标题:
怎样实现存档动画
本帖最后由 勇敢的馒头 于 2010-12-7 17:02 编辑
很多游戏存档的时候都会提示说,请等待,然后存档上了~~请问除了用事件做存档外
脚本里怎么写可以实现存档动画?
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
# 存档画面及读档画面的超级类。
#==============================================================================
class Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
# help_text : 帮助窗口显示的字符串
#--------------------------------------------------------------------------
def initialize(help_text)
@help_text = help_text
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成帮助窗口
@help_window = Window_Help.new
@help_window.set_text(@help_text)
# 生成存档文件查
@savefile_windows = []
for i in 0..3
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
end
# 选择最后操作的文件
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true
#★★★★★★★★★★★★建立★★★★★★★★★★★★★
@viewportaaa = Viewport.new(0,0,640,480)
@ga = RPG::Sprite.new(@viewportaaa)
@ga.x = 320
@ga.y = 240
#@ga.z = @sprite.z + 1
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果画面被切换的话就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
#★★★★★★★★★★★★消失★★★★★★★★★★★★★
@ga.dispose
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.dispose
for i in @savefile_windows
i.dispose
end
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 刷新窗口
#★★★★★★★★★★★刷新★★★★★★★★★★★★★★
@ga.update
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.update
for i in @savefile_windows
i.update
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 调用过程 on_decision (定义继承目标)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 调用过程 on_cancel (定义继承目标)
on_cancel
return
end
# 按下方向键下的情况下
if Input.repeat?(Input::DOWN)
# 方向键下的按下状态不是重复的情况下、
# 并且光标的位置在 3 以前的情况下
if Input.trigger?(Input::DOWN) or @file_index < 3
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向下移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 1) % 4
@savefile_windows[@file_index].selected = true
return
end
end
# 按下方向键上的情况下
if Input.repeat?(Input::UP)
# 方向键上的按下状态不是重复的情况下、
# 并且光标的位置在 0 以后的情况下
if Input.trigger?(Input::UP) or @file_index > 0
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向上移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 3) % 4
@savefile_windows[@file_index].selected = true
return
end
end
end
#--------------------------------------------------------------------------
# ● 生成文件名
# file_index : 文件名的索引 (0~3)
#--------------------------------------------------------------------------
def make_filename(file_index)
return "Save#{file_index + 1}.rxdata"
end
end
复制代码
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
# 处理存档画面的类。
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super("要保存到这个文件吗?")
end
#--------------------------------------------------------------------------
# ● 确定时的处理
#--------------------------------------------------------------------------
def on_decision(filename)
# 演奏存档 SE
$game_system.se_play($data_system.save_se)
# 写入存档数据
file = File.open(filename, "wb")
write_save_data(file)
file.close
#★★★★★★★★★★★设置动画★★★★★★★★★★★★
@ga.animation($data_animations[1],true)
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
# 如果被事件调用
if $game_temp.save_calling
# 清除存档调用标志
$game_temp.save_calling = false
# 切换到地图画面
$scene = Scene_Map.new
return
end
# 切换到菜单画面
#$scene = Scene_Menu.new(4)
end
#--------------------------------------------------------------------------
# ● 取消时的处理
#--------------------------------------------------------------------------
def on_cancel
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 如果被事件调用
if $game_temp.save_calling
# 清除存档调用标志
$game_temp.save_calling = false
# 切换到地图画面
$scene = Scene_Map.new
return
end
# 切换到菜单画面
$scene = Scene_Menu.new(4)
end
#--------------------------------------------------------------------------
# ● 写入存档数据
# file : 写入用文件对像 (已经打开)
#--------------------------------------------------------------------------
def write_save_data(file)
# 生成描绘存档文件用的角色图形
characters = []
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
characters.push([actor.character_name, actor.character_hue])
end
# 写入描绘存档文件用的角色数据
Marshal.dump(characters, file)
# 写入测量游戏时间用画面计数
Marshal.dump(Graphics.frame_count, file)
# 增加 1 次存档次数
$game_system.save_count += 1
# 保存魔法编号
# (将编辑器保存的值以随机值替换)
$game_system.magic_number = $data_system.magic_number
# 写入各种游戏对像
Marshal.dump($game_system, file)
Marshal.dump($game_switches, file)
Marshal.dump($game_variables, file)
Marshal.dump($game_self_switches, file)
Marshal.dump($game_screen, file)
Marshal.dump($game_actors, file)
Marshal.dump($game_party, file)
Marshal.dump($game_troop, file)
Marshal.dump($game_map, file)
Marshal.dump($game_player, file)
end
end
复制代码
以上是我的修改,更改了Scene_Save 和 Scene_Load 可感觉不是很好用
1,不能返回菜单~(被我屏蔽掉了)
2,存档的时候动画还没播放完毕,键盘却还能操作~
~~BUG很多~~
作者:
银·乌尔
时间:
2010-12-7 21:45
设置一个等待参数变量,初始为0
然后,在按下确定键存档并播放动画的时候,设置一下这个参数,
(应该是动画帧数的2倍吧,银不知道啊不知道~)
然后在update画面刷新里为这个等待参数每一帧减去1
也就是:
if @hhjj > 0
@hhjj -= 1
else
@hhjj = 0
end
如此,然后,
就是窗口的活动,
因为存档窗口只有活动才能使用键盘来控制,
所以,就在刷新里写上相应窗口活动的条件:
当那个等待参数为0的时候活动。
如此,
便可以实现等待动画播放完了再控制键盘了。
作者:
勇敢的馒头
时间:
2010-12-7 23:03
回复
银·乌尔
的帖子
思路能懂,技术跟不上~~:'( 求详细~
作者:
银·乌尔
时间:
2010-12-7 23:14
本帖最后由 银·乌尔 于 2010-12-7 23:15 编辑
可以了,替代原来的相关脚本就好了。
里面的按下C键后的@wait = 20可以自己设置一下
另外,是动画精灵的Z坐标问题?
动画能播放,但是被压在在窗口之下。
好吧,这不是银的事了。
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
# 存档画面及读档画面的超级类。
#==============================================================================
class Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
# help_text : 帮助窗口显示的字符串
#--------------------------------------------------------------------------
def initialize(help_text)
@help_text = help_text
@wait = 0
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成帮助窗口
@help_window = Window_Help.new
@help_window.set_text(@help_text)
# 生成存档文件查
@savefile_windows = []
for i in 0..3
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
end
# 选择最后操作的文件
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true
#★★★★★★★★★★★★建立★★★★★★★★★★★★★
@viewportaaa = Viewport.new(0,0,640,480)
@ga = RPG::Sprite.new(@viewportaaa)
@ga.x = 320
@ga.y = 240
#@ga.z = @sprite.z + 1
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果画面被切换的话就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
#★★★★★★★★★★★★消失★★★★★★★★★★★★★
@ga.dispose
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.dispose
for i in @savefile_windows
i.dispose
end
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
if @wait > 0
@wait -= 1
else
@wait = 0
end
# 刷新窗口
#★★★★★★★★★★★刷新★★★★★★★★★★★★★★
@ga.update
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.update
for i in @savefile_windows
i.update
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
@wait = 20
# 调用过程 on_decision (定义继承目标)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 调用过程 on_cancel (定义继承目标)
on_cancel
return
end
if @wait == 0
# 按下方向键下的情况下
if Input.repeat?(Input::DOWN)
# 方向键下的按下状态不是重复的情况下、
# 并且光标的位置在 3 以前的情况下
if Input.trigger?(Input::DOWN) or @file_index < 3
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向下移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 1) % 4
@savefile_windows[@file_index].selected = true
return
end
end
# 按下方向键上的情况下
if Input.repeat?(Input::UP)
# 方向键上的按下状态不是重复的情况下、
# 并且光标的位置在 0 以后的情况下
if Input.trigger?(Input::UP) or @file_index > 0
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向上移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 3) % 4
@savefile_windows[@file_index].selected = true
return
end
end
end
end
#--------------------------------------------------------------------------
# ● 生成文件名
# file_index : 文件名的索引 (0~3)
#--------------------------------------------------------------------------
def make_filename(file_index)
return "Save#{file_index + 1}.rxdata"
end
end
复制代码
作者:
勇敢的馒头
时间:
2010-12-8 09:50
回复
银·乌尔
的帖子
谢谢大大的回答,保存时候光标还能移动这个问题算是解决了~
可是我下面的
Scene_Save
# 切换到菜单画面
$scene = Scene_Menu.new(4)
这个如果不屏蔽,让他动画播放完毕后返回菜单依然没有办法~~
另:是否能出个框做个提示:记录已保存。。。:P
作者:
银·乌尔
时间:
2010-12-8 19:33
可以了,把Scene_Save里返回菜单的那句给#掉,
银在LZ点评里的那个办法是不对的,惭愧~
把下面的脚本替换原来的Scene_File就好了。
具体搜索“# ar ck”看看添加的地方:
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
# 存档画面及读档画面的超级类。
#==============================================================================
# 新建一个窗口作提示
class Window_Hint < Window_Base
def initialize
super (120,208,200,64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.draw_text(0,0,120,32,"记录已保存!")
self.z = 9999
end
end
class Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
# help_text : 帮助窗口显示的字符串
#--------------------------------------------------------------------------
def initialize(help_text)
@help_text = help_text
@wait = 0
# ar ck 建立提示窗口并不可见
@hint_window = Window_Hint.new # 坐标和长宽可以自己调
@hint_window.visible = false
# ar end
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成帮助窗口
@help_window = Window_Help.new
@help_window.set_text(@help_text)
# 生成存档文件查
@savefile_windows = []
for i in 0..3
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
end
# 选择最后操作的文件
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true
#★★★★★★★★★★★★建立★★★★★★★★★★★★★
@viewportaaa = Viewport.new(0,0,640,480)
@ga = RPG::Sprite.new(@viewportaaa)
@ga.x = 320
@ga.y = 240
#@ga.z = @sprite.z + 1
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果画面被切换的话就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
# ar ck 释放提示窗口
@hint_window.dispose
# ar end
#★★★★★★★★★★★★消失★★★★★★★★★★★★★
@ga.dispose
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.dispose
for i in @savefile_windows
i.dispose
end
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
if @wait > 0
@wait -= 1
else
@wait = 0
end
# 刷新窗口
#★★★★★★★★★★★刷新★★★★★★★★★★★★★★
@ga.update
#★★★★★★★★★★★★★★★★★★★★★★★★★★★
@help_window.update
for i in @savefile_windows
i.update
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
@wait = 40
# ar ck 提示窗口可见
@hint_window.visible = true
# ar end
# 调用过程 on_decision (定义继承目标)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 调用过程 on_cancel (定义继承目标)
on_cancel
return
end
# ar ck 当等待计数归零且提示窗口可见,就让窗口消失并返回菜单
if @wait == 0 and @hint_window.visible == true
@hint_window.visible = false
$scene = Scene_Menu.new(4)
end
# ar end
if @wait == 0
# 按下方向键下的情况下
if Input.repeat?(Input::DOWN)
# 方向键下的按下状态不是重复的情况下、
# 并且光标的位置在 3 以前的情况下
if Input.trigger?(Input::DOWN) or @file_index < 3
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向下移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 1) % 4
@savefile_windows[@file_index].selected = true
return
end
end
# 按下方向键上的情况下
if Input.repeat?(Input::UP)
# 方向键上的按下状态不是重复的情况下、
# 并且光标的位置在 0 以后的情况下
if Input.trigger?(Input::UP) or @file_index > 0
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 光标向上移动
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 3) % 4
@savefile_windows[@file_index].selected = true
return
end
end
end
end
#--------------------------------------------------------------------------
# ● 生成文件名
# file_index : 文件名的索引 (0~3)
#--------------------------------------------------------------------------
def make_filename(file_index)
return "Save#{file_index + 1}.rxdata"
end
end
复制代码
作者:
勇敢的馒头
时间:
2010-12-9 09:43
回复
银·乌尔
的帖子
{:2_39:}
1.还没播放完动画就弹出提示窗口了
2.提示窗口显示了一下子就跳回菜单了~
3.读档也有提示窗口了
作者:
银·乌尔
时间:
2010-12-9 19:44
好吧,银的指导到这里就结束了,
馒头,勇敢地自己看看怎么解决吧,
银不是包办一切的大好人~
PS:小心Argent的随时出现。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1