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

Project1

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

[已经解决] 自己写的选项脚本,但是不知道如何释放

[复制链接]

Lv1.梦旅人

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

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

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

x
本帖最后由 gaofei677 于 2015-1-15 00:14 编辑
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_ChoiceList
  4. #------------------------------------------------------------------------------
  5. #  此窗口使用于事件指令中的“显示选项”的功能。
  6. #==============================================================================

  7. class Window_ChoiceList < Window_Command
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   alias old_initialize initialize
  12.   def initialize(message_window)
  13.     @choice_closed = false
  14.     old_initialize(message_window)
  15.     self.opacity = 0
  16.     creat_choicelist_bg
  17.     update
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   # ● 更新窗口的位置
  21.   #--------------------------------------------------------------------------
  22.   def update_placement
  23.     self.width = [max_choice_width + 12, 96].max + padding * 2
  24.     self.width = [width, Graphics.width].min
  25.     self.width = self.width*2
  26.     self.height = fitting_height($game_message.choices.size)*2-22
  27.     self.x = Graphics.width/2-300#Graphics.width - width
  28.     if @message_window.y >= Graphics.height / 2
  29.       self.y = @message_window.y - height-150
  30.     else
  31.       self.y = @message_window.y + @message_window.height-150
  32.     end
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 绘制带有控制符的文本内容
  36.   #--------------------------------------------------------------------------
  37.   def draw_text_ex(x, y, text)
  38.     reset_font_settings
  39.     text = convert_escape_characters(text)
  40.     x = (self.width-text_size(text).width)/2 -15
  41.     pos = {:x => x, :y => y, :new_x => x, :height => calc_line_height(text)*2}
  42.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 显示选项条
  46.   #--------------------------------------------------------------------------
  47.   def show_choice_pad(x,x_2,y,y_2)
  48.     return if @choice_closed == true
  49.     @choice_pad_open = [] unless @choice_pad_open.is_a?(Array)
  50.     if mouse_in?(x,x_2,y,y_2)
  51.       return if @choice_pad_sprite[@index] == nil
  52.       return if @index_last == @index
  53.       @choice_pad_sprite[@index].bitmap = Cache.ui("dialog_select_1").clone
  54.       Sound.play_cursor unless item_max == 1
  55.       if (item_max == 1) and (@choice_pad_only_one != true)
  56.         Sound.play_cursor
  57.         @choice_pad_only_one = true
  58.       end
  59.       @index_last = 1 if @index_last == nil
  60.       return if item_max == 1
  61.       if @index_last != @index
  62.         @choice_pad_sprite[@index_last].bitmap = Cache.ui("dialog_select_2").clone
  63.         @index_last = @index
  64.       end
  65.     elsif item_max == 1
  66.       return if @choice_pad_sprite == nil
  67.       return if @choice_pad_sprite[@index] == nil
  68.       return if @index_last == nil
  69.       @choice_pad_sprite[@index].bitmap = Cache.ui("dialog_select_2").clone
  70.       @choice_pad_only_one = false
  71.     end
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 检查光标是否在选项内
  75.   #--------------------------------------------------------------------------
  76.   def mouse_in?(x,x_2,y,y_2)
  77.     if (Mouse.x>=x) and (Mouse.x<=x_2)
  78.       if (Mouse.y>=y) and (Mouse.y<=y_2)
  79.         return true
  80.       end
  81.     end
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 获取项目的高度
  85.   #--------------------------------------------------------------------------
  86.   def item_height
  87.     line_height*2
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 更新画面
  91.   #--------------------------------------------------------------------------
  92.   alias old_update update
  93.   def update
  94.     old_update
  95.     return if @choice_closed == true
  96.     a = item_rect_for_text(@index)
  97.     #show_choice_pad((a.x+110),(a.x+a.width+110),(a.y+70),(a.y+a.height+70))
  98.     #rect = item_rect_for_text(@index)
  99.       case item_max
  100.       when 4
  101.         #sprite.x = rect.x+60
  102.         #sprite.y = rect.y+70
  103.         show_choice_pad((a.x+110),(a.x+a.width+110),(a.y+70),(a.y+a.height+70))
  104.       when 3
  105.         #sprite.x = rect.x+60
  106.         #sprite.y = rect.y+70
  107.         show_choice_pad((a.x+110),(a.x+a.width+110),(a.y+70+48),(a.y+a.height+70+48))
  108.       when 2
  109.         #sprite.x = rect.x+60
  110.         #sprite.y = rect.y+165
  111.         show_choice_pad((a.x+110),(a.x+a.width+110),(a.y+70+96),(a.y+a.height+70+96))
  112.       when 1
  113.         #sprite.x = rect.x+60
  114.         #sprite.y = rect.y+70
  115.         show_choice_pad((a.x+110),(a.x+a.width+110),(a.y+70+144),(a.y+a.height+70+144))
  116.       end
  117.     creat_choicelist_bg
  118.     clear_selected_flash
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ● 清除选择框的闪烁
  122.   #--------------------------------------------------------------------------
  123.   def clear_selected_flash
  124.     return if cursor_rect == Rect.new
  125.     @backup_cursor_rect = cursor_rect.clone
  126.     cursor_rect.empty
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 判断鼠标是位于光标矩形处
  130.   #--------------------------------------------------------------------------
  131.   def mouse_out_rect?
  132.     if viewport.nil?
  133.       vp_x, vp_y = 0, 0
  134.     else
  135.       vp_x = viewport.rect.x - viewport.ox
  136.       vp_y = viewport.rect.y - viewport.oy
  137.     end
  138.     mouse_rx = ox + Mouse.x - (x + vp_x + standard_padding )
  139.     mouse_ry = oy + Mouse.y - (y + vp_y + standard_padding )
  140.     return if @backup_cursor_rect == Rect.new
  141.     return @backup_cursor_rect.x > mouse_rx ||
  142.            @backup_cursor_rect.y > mouse_ry ||
  143.            @backup_cursor_rect.x + @backup_cursor_rect.width < mouse_rx ||
  144.            @backup_cursor_rect.y + @backup_cursor_rect.height< mouse_ry
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 创建选项背景
  148.   #--------------------------------------------------------------------------
  149.   def creat_choicelist_bg
  150.     return if @choice_closed == true
  151.     return if item_max == 0 or item_max==nil
  152.     return if @choice_pad_sprite.is_a?(Array)
  153.     @choice_pad_sprite = Array.new(item_max)
  154.     for x in 0..(item_max-1)
  155.       @choice_pad_sprite[x] = Sprite.new
  156.     end
  157.     i = -1
  158.     @choice_pad_sprite.each {|sprite|
  159.       i+=1
  160.       rect = item_rect_for_text(i)
  161.       case item_max
  162.       when 4
  163.         sprite.x = rect.x+60
  164.         sprite.y = rect.y+70
  165.       when 3
  166.         sprite.x = rect.x+60
  167.         sprite.y = rect.y+70+48
  168.       when 2
  169.         sprite.x = rect.x+60
  170.         sprite.y = rect.y+165
  171.       when 1
  172.         sprite.x = rect.x+60
  173.         sprite.y = rect.y+70+144
  174.       end
  175.       sprite.bitmap = Cache.ui("dialog_select_2").clone
  176.     }
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 关闭窗口
  180.   #--------------------------------------------------------------------------
  181.   alias old_close close
  182.   def close
  183.     @choice_pad_sprite.each {|sprite|
  184.       sprite.bitmap.dispose
  185.       sprite.dispose
  186.     }
  187.     @choice_pad_sprite = nil
  188.     @choice_pad_open = nil
  189.     @index_last = nil
  190.     @choice_pad_only_one = nil
  191.     @backup_cursor_rect = nil
  192.     @choice_closed = true
  193.     old_close
  194.   end
  195. end
复制代码
使用一次之后,似乎释放得不干净,再用第二次之后,就会出现各种问题,就大大们指点,如何释放干净,使用完之后能还原到 未使用过的状态……  
@喵呜喵5  
漏夏同人
《咱的夏天》
下载地址:http://tieba.baidu.com/p/2681607456
人员招募:http://rpg.blue/thread-339747-1-1.html

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

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

开拓者短篇九导演组冠军

2
发表于 2015-1-15 01:11:09 | 只看该作者
太长懒得看,只说一句:

请把释放的代码写进dispose中
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
帖子
386
3
发表于 2015-1-15 11:02:02 | 只看该作者
你的脚本还是有很多差错的,比如 initialize 没必要用alias,以及善用super。

同上,太长懒得看= =

如果你最近在奋力的学脚本,可以加入下面这个讨论群(见签名档),一起学习。
RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2015-1-15 12:46:44 | 只看该作者
本帖最后由 taroxd 于 2015-1-15 12:48 编辑

直接把位图 blt 到窗口的指定位置就好了,不需要用到 sprite(也就没有了烦人的释放问题)

关于 blt,参考帮助文档的 Bitmap#blt 以及默认脚本的用法(比如绘制脸图)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
1050 小时
注册时间
2006-5-3
帖子
774
5
 楼主| 发表于 2015-1-16 07:07:51 | 只看该作者
谢啦各位,最后发现原来不是没有释放干净,而是@list没有nil
漏夏同人
《咱的夏天》
下载地址:http://tieba.baidu.com/p/2681607456
人员招募:http://rpg.blue/thread-339747-1-1.html
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 12:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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