查看: 3681|回复: 6

[RMVA发布] 【VA新手向】坏男子教你简单粗暴地改脚本第一弹

[复制链接]
梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
回帖
3
发表于 2015-8-23 14:43:18 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 坏男子 于 2015-8-23 14:43 编辑

首先,新人报道下下,我叫坏男子。
大家都知道有一个LOGO脚本,如下就是[pre lang="ruby" line="01"]#--------------------------------------------------------------------------
# ● 显示图片
#-------------------------------------------------------------------------
filename = "Graphics/Pictures/Logo" # 图片文件名
time0 = 60 # 渐显所需时间(单位:帧)
time1 = 120 # 渐显完毕后等待时间(单位:帧)
time2 = 60 # 渐隐所需时间(单位:帧)
time3 = 60 # 渐隐完毕后等待时间(单位:帧)
@show_logo = Sprite.new
@show_logo.opacity = 0
@show_logo.bitmap = Bitmap.new(filename)
v0 = 255 / time0
v2 = 255 / time2
for i in 1..time0 #渐显
@show_logo.opacity = i * v0
Graphics.update
end
@show_logo.opacity = 255
Graphics.wait time1 # 等待
for i in 1..time2 #渐隐
@show_logo.opacity = 255 - i * v2
Graphics.update
end
@show_logo.dispose
Graphics.wait time3 #[/pre]来一个标题界面的脚本。[pre lang="ruby" line="01"]#encoding:utf-8
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  标题画面
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    SceneManager.clear
    Graphics.freeze
    create_background
    create_foreground
    create_command_window
    play_title_music
  end
  #--------------------------------------------------------------------------
  # ● 获取渐变速度
  #--------------------------------------------------------------------------
  def transition_speed
    return 20
  end
  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    SceneManager.snapshot_for_background
    dispose_background
    dispose_foreground
  end
  #--------------------------------------------------------------------------
  # ● 生成背景
  #--------------------------------------------------------------------------
  def create_background
    @sprite1 = Sprite.new
    @sprite1.bitmap = Cache.title1($data_system.title1_name)
    @sprite2 = Sprite.new
    @sprite2.bitmap = Cache.title2($data_system.title2_name)
    center_sprite(@sprite1)
    center_sprite(@sprite2)
  end
  #--------------------------------------------------------------------------
  # ● 生成前景
  #--------------------------------------------------------------------------
  def create_foreground
    @foreground_sprite = Sprite.new
    @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
    @foreground_sprite.z = 100
    draw_game_title if $data_system.opt_draw_title
  end
  #--------------------------------------------------------------------------
  # ● 绘制游戏标题
  #--------------------------------------------------------------------------
  def draw_game_title
    @foreground_sprite.bitmap.font.size = 48
    rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
    @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  end
  #--------------------------------------------------------------------------
  # ● 释放背景
  #--------------------------------------------------------------------------
  def dispose_background
    @sprite1.bitmap.dispose
    @sprite1.dispose
    @sprite2.bitmap.dispose
    @sprite2.dispose
  end
  #--------------------------------------------------------------------------
  # ● 释放前景
  #--------------------------------------------------------------------------
  def dispose_foreground
    @foreground_sprite.bitmap.dispose
    @foreground_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 执行精灵居中
  #--------------------------------------------------------------------------
  def center_sprite(sprite)
    sprite.ox = sprite.bitmap.width / 2
    sprite.oy = sprite.bitmap.height / 2
    sprite.x = Graphics.width / 2
    sprite.y = Graphics.height / 2
  end
  #--------------------------------------------------------------------------
  # ● 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_TitleCommand.new
    @command_window.set_handler(:new_game, method(:command_new_game))
    @command_window.set_handler(:continue, method(:command_continue))
    @command_window.set_handler(:shutdown, method(:command_shutdown))
  end
  #--------------------------------------------------------------------------
  # ● 关闭指令窗口
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    update until @command_window.close?
  end
  #--------------------------------------------------------------------------
  # ● 指令“开始游戏”
  #--------------------------------------------------------------------------
  def command_new_game
    DataManager.setup_new_game
    close_command_window
    fadeout_all
    $game_map.autoplay
    SceneManager.goto(Scene_Map)
  end
  #--------------------------------------------------------------------------
  # ● 指令“继续游戏”
  #--------------------------------------------------------------------------
  def command_continue
    close_command_window
    SceneManager.call(Scene_Load)
  end
  #--------------------------------------------------------------------------
  # ● 指令“退出游戏”
  #--------------------------------------------------------------------------
  def command_shutdown
    close_command_window
    fadeout_all
    SceneManager.exit
  end
  #--------------------------------------------------------------------------
  # ● 播放标题画面音乐
  #--------------------------------------------------------------------------
  def play_title_music
    $data_system.title_bgm.play
    RPG::BGS.stop
    RPG::ME.stop
  end
end[/pre]那么问题来了,能不能使用LOGO脚本把标题改为LOGO的效果呢?我们直接把LOGO脚本放在标题界面的脚本的start函数的end的前面,如下[pre lang="ruby" line="01"]#encoding:utf-8
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  标题画面
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    SceneManager.clear
    Graphics.freeze
    create_background
    create_foreground
    create_command_window
    play_title_music
    filename = "Graphics/Pictures/Logo" # 图片文件名
    time0 = 60 # 渐显所需时间(单位:帧)
    time1 = 120 # 渐显完毕后等待时间(单位:帧)
    time2 = 60 # 渐隐所需时间(单位:帧)
    time3 = 60 # 渐隐完毕后等待时间(单位:帧)
    @show_logo = Sprite.new
    @show_logo.opacity = 0
    @show_logo.bitmap = Bitmap.new(filename)
    v0 = 255 / time0
    v2 = 255 / time2
    for i in 1..time0 #渐显
       @show_logo.opacity = i * v0
       Graphics.update
    end
    @show_logo.opacity = 255
    Graphics.wait time1 # 等待
    for i in 1..time2 #渐隐
       @show_logo.opacity = 255 - i * v2
       Graphics.update
    end
    @show_logo.dispose
    Graphics.wait time3
  end
  #--------------------------------------------------------------------------
  # ● 获取渐变速度
  #--------------------------------------------------------------------------
  def transition_speed
    return 20
  end
  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    SceneManager.snapshot_for_background
    dispose_background
    dispose_foreground
  end
  #--------------------------------------------------------------------------
  # ● 生成背景
  #--------------------------------------------------------------------------
  def create_background
    @sprite1 = Sprite.new
    @sprite1.bitmap = Cache.title1($data_system.title1_name)
    @sprite2 = Sprite.new
    @sprite2.bitmap = Cache.title2($data_system.title2_name)
    center_sprite(@sprite1)
    center_sprite(@sprite2)
  end
  #--------------------------------------------------------------------------
  # ● 生成前景
  #--------------------------------------------------------------------------
  def create_foreground
    @foreground_sprite = Sprite.new
    @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
    @foreground_sprite.z = 100
    draw_game_title if $data_system.opt_draw_title
  end
  #--------------------------------------------------------------------------
  # ● 绘制游戏标题
  #--------------------------------------------------------------------------
  def draw_game_title
    @foreground_sprite.bitmap.font.size = 48
    rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
    @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  end
  #--------------------------------------------------------------------------
  # ● 释放背景
  #--------------------------------------------------------------------------
  def dispose_background
    @sprite1.bitmap.dispose
    @sprite1.dispose
    @sprite2.bitmap.dispose
    @sprite2.dispose
  end
  #--------------------------------------------------------------------------
  # ● 释放前景
  #--------------------------------------------------------------------------
  def dispose_foreground
    @foreground_sprite.bitmap.dispose
    @foreground_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 执行精灵居中
  #--------------------------------------------------------------------------
  def center_sprite(sprite)
    sprite.ox = sprite.bitmap.width / 2
    sprite.oy = sprite.bitmap.height / 2
    sprite.x = Graphics.width / 2
    sprite.y = Graphics.height / 2
  end
  #--------------------------------------------------------------------------
  # ● 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_TitleCommand.new
    @command_window.set_handler(:new_game, method(:command_new_game))
    @command_window.set_handler(:continue, method(:command_continue))
    @command_window.set_handler(:shutdown, method(:command_shutdown))
  end
  #--------------------------------------------------------------------------
  # ● 关闭指令窗口
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    update until @command_window.close?
  end
  #--------------------------------------------------------------------------
  # ● 指令“开始游戏”
  #--------------------------------------------------------------------------
  def command_new_game
    DataManager.setup_new_game
    close_command_window
    fadeout_all
    $game_map.autoplay
    SceneManager.goto(Scene_Map)
  end
  #--------------------------------------------------------------------------
  # ● 指令“继续游戏”
  #--------------------------------------------------------------------------
  def command_continue
    close_command_window
    SceneManager.call(Scene_Load)
  end
  #--------------------------------------------------------------------------
  # ● 指令“退出游戏”
  #--------------------------------------------------------------------------
  def command_shutdown
    close_command_window
    fadeout_all
    SceneManager.exit
  end
  #--------------------------------------------------------------------------
  # ● 播放标题画面音乐
  #--------------------------------------------------------------------------
  def play_title_music
    $data_system.title_bgm.play
    RPG::BGS.stop
    RPG::ME.stop
  end
end[/pre]结果出现了好多BUG,这下怎么办了呢?尚请期待第二弹。

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-8-23 14:52:44 | 显示全部楼层
logo脚本本身不就是在标题显示的么…………为什么还要多次一举再扔进标题界面里……

扔就扔吧……但是正常来说不都是扔到方法最开始的么……扔到最后不出bug反而不科学…………

最后吐槽这个logo脚本的缩进,以及 @show_logo.bitmap 没有释放
  1. def m51552logo
  2.   sprite = Sprite.new
  3.   sprite.opacity = 0
  4.   sprite.bitmap = Cache.picture("logo")
  5.   while sprite.opacity != 255
  6.     sprite.opacity += 8
  7.     Graphics.update
  8.   end
  9.   loop do
  10.     Input.update
  11.     break if Input.trigger?(:C)
  12.   end
  13.   while sprite.opacity != 0
  14.     sprite.opacity-=8
  15.     Graphics.update
  16.   end
  17.   sprite.bitmap.dispose
  18.   sprite.dispose
  19. end
  20. m51552logo
复制代码

点评

噗 我只是来看喵喵喵吐槽  发表于 2015-8-23 15:22
回复

使用道具 举报

梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
回帖
3
 楼主| 发表于 2015-8-23 14:57:28 | 显示全部楼层
喵呜喵5 发表于 2015-8-23 14:52
logo脚本本身不就是在标题显示的么…………为什么还要多次一举再扔进标题界面里……

扔就扔吧……但是正常 ...

有释放呀
  1. @show_logo.dispose
复制代码

点评

@show_logo.bitmap.dispose  发表于 2015-8-23 15:02
回复

使用道具 举报

梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
回帖
3
 楼主| 发表于 2015-8-23 15:14:14 | 显示全部楼层
喵呜喵5 发表于 2015-8-23 14:52
logo脚本本身不就是在标题显示的么…………为什么还要多次一举再扔进标题界面里……

扔就扔吧……但是正常 ...

在
  1. Graphics.wait time3
复制代码
的前面

点评

释放精灵并不会将精灵的位图也释放掉,你只释放了精灵,没释放位图  发表于 2015-8-23 15:26
回复

使用道具 举报

梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
回帖
3
 楼主| 发表于 2015-8-23 15:33:54 | 显示全部楼层
喵呜喵5 发表于 2015-8-23 14:52
logo脚本本身不就是在标题显示的么…………为什么还要多次一举再扔进标题界面里……

扔就扔吧……但是正常 ...

在37行,精灵的透明度是255-i乘以v2,i乘以v2达到255的时候,精灵的透明度为0了
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-8-23 16:16:01 | 显示全部楼层
坏男子 发表于 2015-8-23 15:33
在37行,精灵的透明度是255-i乘以v2,i乘以v2达到255的时候,精灵的透明度为0了 ...

……这和只释放sprite没释放bitmap有什么关系么

评分

参与人数 6星屑 +31 收起 理由
gonglinyuan + 6 专业拆队形
莫言别离 + 5 此事喵呜喵5发现自己的腿上多了个挂件.
KB.Driver + 5 此时喵呜喵5发现chd的理由是最奇怪的.
VIPArcher + 5 此时喵呜喵5的精神是崩溃的
chd114 + 5 此时喵呜喵5需要去微博收集更多的福利.
taroxd + 5 此时喵呜喵5的精神是崩溃的

查看全部评分

回复

使用道具 举报

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
回帖
809
发表于 2015-8-24 10:38:13 | 显示全部楼层
本帖最后由 gonglinyuan 于 2015-8-24 10:41 编辑

想你这样写脚本,游戏玩了一两个小时就爆内存了吧。。

虽然看起来效果是正确的,但是bitmap还占用了内存空间没有被释放啊。

学脚本是绝对不能“简单粗暴”的,尤其是应用广泛的外挂脚本,每个功能的实现都要精准细致才好

不然BUG的累积是十分恐怖的

不知道第二弹会怎么样。。要一直这样下去不知有多少新手会被误导。。
买了正版RMMV的同学进来看一下,谢谢~
https://rpg.blue/thread-393237-1-1.html
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部