设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3226|回复: 6
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
帖子
4
跳转到指定楼层
1
发表于 2015-8-23 14:43:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

首先,新人报道下下,我叫坏男子。
大家都知道有一个LOGO脚本,如下就是
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● 显示图片
  3. #-------------------------------------------------------------------------
  4. filename = "Graphics/Pictures/Logo" # 图片文件名
  5. time0 = 60 # 渐显所需时间(单位:帧)
  6. time1 = 120 # 渐显完毕后等待时间(单位:帧)
  7. time2 = 60 # 渐隐所需时间(单位:帧)
  8. time3 = 60 # 渐隐完毕后等待时间(单位:帧)
  9. @show_logo = Sprite.new
  10. @show_logo.opacity = 0
  11. @show_logo.bitmap = Bitmap.new(filename)
  12. v0 = 255 / time0
  13. v2 = 255 / time2
  14. for i in 1..time0 #渐显
  15. @show_logo.opacity = i * v0
  16. Graphics.update
  17. end
  18. @show_logo.opacity = 255
  19. Graphics.wait time1 # 等待
  20. for i in 1..time2 #渐隐
  21. @show_logo.opacity = 255 - i * v2
  22. Graphics.update
  23. end
  24. @show_logo.dispose
  25. Graphics.wait time3 #
来一个标题界面的脚本。
RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Scene_Title
  4. #------------------------------------------------------------------------------
  5. #  标题画面
  6. #==============================================================================
  7.  
  8. class Scene_Title < Scene_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● 开始处理
  11.   #--------------------------------------------------------------------------
  12.   def start
  13.     super
  14.     SceneManager.clear
  15.     Graphics.freeze
  16.     create_background
  17.     create_foreground
  18.     create_command_window
  19.     play_title_music
  20.   end
  21.   #--------------------------------------------------------------------------
  22.   # ● 获取渐变速度
  23.   #--------------------------------------------------------------------------
  24.   def transition_speed
  25.     return 20
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 结束处理
  29.   #--------------------------------------------------------------------------
  30.   def terminate
  31.     super
  32.     SceneManager.snapshot_for_background
  33.     dispose_background
  34.     dispose_foreground
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 生成背景
  38.   #--------------------------------------------------------------------------
  39.   def create_background
  40.     @sprite1 = Sprite.new
  41.     @sprite1.bitmap = Cache.title1($data_system.title1_name)
  42.     @sprite2 = Sprite.new
  43.     @sprite2.bitmap = Cache.title2($data_system.title2_name)
  44.     center_sprite(@sprite1)
  45.     center_sprite(@sprite2)
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 生成前景
  49.   #--------------------------------------------------------------------------
  50.   def create_foreground
  51.     @foreground_sprite = Sprite.new
  52.     @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  53.     @foreground_sprite.z = 100
  54.     draw_game_title if $data_system.opt_draw_title
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 绘制游戏标题
  58.   #--------------------------------------------------------------------------
  59.   def draw_game_title
  60.     @foreground_sprite.bitmap.font.size = 48
  61.     rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
  62.     @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 释放背景
  66.   #--------------------------------------------------------------------------
  67.   def dispose_background
  68.     @sprite1.bitmap.dispose
  69.     @sprite1.dispose
  70.     @sprite2.bitmap.dispose
  71.     @sprite2.dispose
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 释放前景
  75.   #--------------------------------------------------------------------------
  76.   def dispose_foreground
  77.     @foreground_sprite.bitmap.dispose
  78.     @foreground_sprite.dispose
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 执行精灵居中
  82.   #--------------------------------------------------------------------------
  83.   def center_sprite(sprite)
  84.     sprite.ox = sprite.bitmap.width / 2
  85.     sprite.oy = sprite.bitmap.height / 2
  86.     sprite.x = Graphics.width / 2
  87.     sprite.y = Graphics.height / 2
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 生成指令窗口
  91.   #--------------------------------------------------------------------------
  92.   def create_command_window
  93.     @command_window = Window_TitleCommand.new
  94.     @command_window.set_handler(:new_game, method(:command_new_game))
  95.     @command_window.set_handler(:continue, method(:command_continue))
  96.     @command_window.set_handler(:shutdown, method(:command_shutdown))
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 关闭指令窗口
  100.   #--------------------------------------------------------------------------
  101.   def close_command_window
  102.     @command_window.close
  103.     update until @command_window.close?
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 指令“开始游戏”
  107.   #--------------------------------------------------------------------------
  108.   def command_new_game
  109.     DataManager.setup_new_game
  110.     close_command_window
  111.     fadeout_all
  112.     $game_map.autoplay
  113.     SceneManager.goto(Scene_Map)
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 指令“继续游戏”
  117.   #--------------------------------------------------------------------------
  118.   def command_continue
  119.     close_command_window
  120.     SceneManager.call(Scene_Load)
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 指令“退出游戏”
  124.   #--------------------------------------------------------------------------
  125.   def command_shutdown
  126.     close_command_window
  127.     fadeout_all
  128.     SceneManager.exit
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 播放标题画面音乐
  132.   #--------------------------------------------------------------------------
  133.   def play_title_music
  134.     $data_system.title_bgm.play
  135.     RPG::BGS.stop
  136.     RPG::ME.stop
  137.   end
  138. end
那么问题来了,能不能使用LOGO脚本把标题改为LOGO的效果呢?我们直接把LOGO脚本放在标题界面的脚本的start函数的end的前面,如下
RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Scene_Title
  4. #------------------------------------------------------------------------------
  5. #  标题画面
  6. #==============================================================================
  7.  
  8. class Scene_Title < Scene_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● 开始处理
  11.   #--------------------------------------------------------------------------
  12.   def start
  13.     super
  14.     SceneManager.clear
  15.     Graphics.freeze
  16.     create_background
  17.     create_foreground
  18.     create_command_window
  19.     play_title_music
  20.     filename = "Graphics/Pictures/Logo" # 图片文件名
  21.     time0 = 60 # 渐显所需时间(单位:帧)
  22.     time1 = 120 # 渐显完毕后等待时间(单位:帧)
  23.     time2 = 60 # 渐隐所需时间(单位:帧)
  24.     time3 = 60 # 渐隐完毕后等待时间(单位:帧)
  25.     @show_logo = Sprite.new
  26.     @show_logo.opacity = 0
  27.     @show_logo.bitmap = Bitmap.new(filename)
  28.     v0 = 255 / time0
  29.     v2 = 255 / time2
  30.     for i in 1..time0 #渐显
  31.        @show_logo.opacity = i * v0
  32.        Graphics.update
  33.     end
  34.     @show_logo.opacity = 255
  35.     Graphics.wait time1 # 等待
  36.     for i in 1..time2 #渐隐
  37.        @show_logo.opacity = 255 - i * v2
  38.        Graphics.update
  39.     end
  40.     @show_logo.dispose
  41.     Graphics.wait time3
  42.   end
  43.   #--------------------------------------------------------------------------
  44.   # ● 获取渐变速度
  45.   #--------------------------------------------------------------------------
  46.   def transition_speed
  47.     return 20
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 结束处理
  51.   #--------------------------------------------------------------------------
  52.   def terminate
  53.     super
  54.     SceneManager.snapshot_for_background
  55.     dispose_background
  56.     dispose_foreground
  57.   end
  58.   #--------------------------------------------------------------------------
  59.   # ● 生成背景
  60.   #--------------------------------------------------------------------------
  61.   def create_background
  62.     @sprite1 = Sprite.new
  63.     @sprite1.bitmap = Cache.title1($data_system.title1_name)
  64.     @sprite2 = Sprite.new
  65.     @sprite2.bitmap = Cache.title2($data_system.title2_name)
  66.     center_sprite(@sprite1)
  67.     center_sprite(@sprite2)
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 生成前景
  71.   #--------------------------------------------------------------------------
  72.   def create_foreground
  73.     @foreground_sprite = Sprite.new
  74.     @foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  75.     @foreground_sprite.z = 100
  76.     draw_game_title if $data_system.opt_draw_title
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 绘制游戏标题
  80.   #--------------------------------------------------------------------------
  81.   def draw_game_title
  82.     @foreground_sprite.bitmap.font.size = 48
  83.     rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
  84.     @foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 释放背景
  88.   #--------------------------------------------------------------------------
  89.   def dispose_background
  90.     @sprite1.bitmap.dispose
  91.     @sprite1.dispose
  92.     @sprite2.bitmap.dispose
  93.     @sprite2.dispose
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 释放前景
  97.   #--------------------------------------------------------------------------
  98.   def dispose_foreground
  99.     @foreground_sprite.bitmap.dispose
  100.     @foreground_sprite.dispose
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 执行精灵居中
  104.   #--------------------------------------------------------------------------
  105.   def center_sprite(sprite)
  106.     sprite.ox = sprite.bitmap.width / 2
  107.     sprite.oy = sprite.bitmap.height / 2
  108.     sprite.x = Graphics.width / 2
  109.     sprite.y = Graphics.height / 2
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 生成指令窗口
  113.   #--------------------------------------------------------------------------
  114.   def create_command_window
  115.     @command_window = Window_TitleCommand.new
  116.     @command_window.set_handler(:new_game, method(:command_new_game))
  117.     @command_window.set_handler(:continue, method(:command_continue))
  118.     @command_window.set_handler(:shutdown, method(:command_shutdown))
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ● 关闭指令窗口
  122.   #--------------------------------------------------------------------------
  123.   def close_command_window
  124.     @command_window.close
  125.     update until @command_window.close?
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● 指令“开始游戏”
  129.   #--------------------------------------------------------------------------
  130.   def command_new_game
  131.     DataManager.setup_new_game
  132.     close_command_window
  133.     fadeout_all
  134.     $game_map.autoplay
  135.     SceneManager.goto(Scene_Map)
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # ● 指令“继续游戏”
  139.   #--------------------------------------------------------------------------
  140.   def command_continue
  141.     close_command_window
  142.     SceneManager.call(Scene_Load)
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● 指令“退出游戏”
  146.   #--------------------------------------------------------------------------
  147.   def command_shutdown
  148.     close_command_window
  149.     fadeout_all
  150.     SceneManager.exit
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 播放标题画面音乐
  154.   #--------------------------------------------------------------------------
  155.   def play_title_music
  156.     $data_system.title_bgm.play
  157.     RPG::BGS.stop
  158.     RPG::ME.stop
  159.   end
  160. end
结果出现了好多BUG,这下怎么办了呢?尚请期待第二弹。

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21661
在线时间
9417 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

2
发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
983
在线时间
3 小时
注册时间
2015-8-23
帖子
4
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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

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

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

点评

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

使用道具 举报

Lv1.梦旅人

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

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

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

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21661
在线时间
9417 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

6
发表于 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的精神是崩溃的

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
帖子
874
7
发表于 2015-8-24 10:38:13 | 只看该作者
本帖最后由 gonglinyuan 于 2015-8-24 10:41 编辑

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

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

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

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

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 01:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表