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

Project1

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

[已经解决] 自写的无法清除内容是什么问题呢?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
跳转到指定楼层
1
发表于 2018-5-12 13:03:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x

已经调用了
  1. def refresh
  2.     self.contents.clear
  3.   end
复制代码

但还是无法清除内容。
不知道是什么问题造成的。
请前辈帮忙看看该脚本出现了什么问题...
RUBY 代码复制
  1. #==============================================================================
  2. # ■ module Angle_Message
  3. #------------------------------------------------------------------------------
  4. module Angle_Message
  5. Window_X = 0
  6. Window_Y = 360
  7. Window_Width = 320
  8. Window_Height = 120
  9. Tips_Se ="Audio/SE/系统"
  10. Angle_Max = 4
  11. Info_Text = "歡迎您進入遊戲!"
  12. $angle = 0
  13. end
  14. #==============================================================================
  15. # ■ Window_Show_Message
  16. #------------------------------------------------------------------------------
  17. #   信息窗口。
  18. #==============================================================================
  19. class Window_Show_Message < Window_Selectable
  20.   include Angle_Message
  21.   #--------------------------------------------------------------------------
  22.   # ● 初始化对像
  23.   #--------------------------------------------------------------------------
  24.   def initialize
  25.     super(Window_X, Window_Y, Window_Width, Window_Height)
  26.     self.contents = Bitmap.new(width - 32, height - 32)
  27.     self.opacity = 0
  28.     refresh
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 设置文本
  32.   #     text  : 窗口显示的字符串
  33.   #--------------------------------------------------------------------------
  34.   def set_text1(text)
  35.       if text != ""
  36.       # 再描绘文本
  37.       self.contents.clear
  38.       self.contents.font.size = 16
  39.       self.contents.font.color = Color.new(-170,-170,-170,255)
  40.       self.contents.draw_text(4, 0 + 1, self.width - 40, 32,text)
  41.       self.contents.font.color = Color.new(255, 128, 128, 255)
  42.       self.contents.draw_text(3, 0, self.width - 40, 32,text)
  43.       @text = text
  44.     end
  45.       self.visible = true
  46.     end
  47.   #--------------------------------------------------------------------------
  48.   # ● 设置文本
  49.   #     text  : 窗口显示的字符串
  50.   #--------------------------------------------------------------------------
  51.   def set_text2(text)
  52.       if text != ""
  53.       # 再描绘文本
  54.       self.contents.clear
  55.       self.contents.font.size = 16
  56.       self.contents.font.color = Color.new(-170,-170,-170,255)
  57.       self.contents.draw_text(4, 20 + 1, self.width - 40, 32,text)
  58.       self.contents.font.color = Color.new(255, 128, 128, 255)
  59.       self.contents.draw_text(3, 20, self.width - 40, 32,text)
  60.       @text = text
  61.     end
  62.       self.visible = true
  63.     end
  64.   #--------------------------------------------------------------------------
  65.   # ● 设置文本
  66.   #     text  : 窗口显示的字符串
  67.   #--------------------------------------------------------------------------
  68.   def set_text3(text)
  69.     if text != ""
  70.       # 再描绘文本
  71.       self.contents.clear
  72.       self.contents.font.size = 16
  73.       self.contents.font.color = Color.new(-170,-170,-170,255)
  74.       self.contents.draw_text(4, 40 + 1, self.width - 40, 32,text)
  75.       self.contents.font.color = Color.new(255, 128, 128, 255)
  76.       self.contents.draw_text(3, 40, self.width - 40, 32,text)
  77.       @text = text
  78.     end
  79.       self.visible = true
  80.     end
  81.   #--------------------------------------------------------------------------
  82.   # ● 设置文本
  83.   #     text  : 窗口显示的字符串
  84.   #--------------------------------------------------------------------------
  85.   def set_text4(text)
  86.     if @text != ""
  87.       # 再描绘文本
  88.       self.contents.clear
  89.       self.contents.font.size = 16
  90.       self.contents.font.color = Color.new(-170,-170,-170,255)
  91.       self.contents.draw_text(4, 60 + 1, self.width - 40, 32,text)
  92.       self.contents.font.color = Color.new(255, 128, 128, 255)
  93.       self.contents.draw_text(3, 60, self.width - 40, 32,text)
  94.       @text = text
  95.     end
  96.       self.visible = true
  97.     end
  98.   #--------------------------------------------------------------------------
  99.   # ● 刷新
  100.   #--------------------------------------------------------------------------
  101.   def refresh
  102.     self.contents.clear
  103.   end
  104. end
  105. #==============================================================================
  106. # ■ Interpreter
  107. #------------------------------------------------------------------------------
  108. #  执行事件命令的解释器。本类在 Game_System 类
  109. # 与 Game_Event 类的内部使用。
  110. #==============================================================================
  111. class Interpreter
  112.   include Angle_Message
  113.   #--------------------------------------------------------------------------
  114.   # ● set_line_text
  115.   #--------------------------------------------------------------------------
  116.   def set_line_text
  117.   @message2_window = Window_Show_Message.new
  118.   if $angle == 0
  119.   @message2_window.set_text1($angle_message)
  120. end
  121.   if $angle == 1
  122.   @message2_window.set_text2($angle_message)
  123. end
  124.   if $angle == 2
  125.   @message2_window.set_text3($angle_message)
  126. end
  127.   if $angle == 3
  128.   @message2_window.set_text4($angle_message)
  129. end
  130.   if $angle > 3
  131.   $angle = 0
  132.   @message2_window.refresh
  133.   @message2_window.set_text1($angle_message)
  134.   end
  135. end
  136.   #--------------------------------------------------------------------------
  137.   # ● 增减金钱
  138.   #--------------------------------------------------------------------------
  139.   def command_125
  140.     value = operate_value(@parameters[0], @parameters[1], @parameters[2])
  141.     $game_party.gain_gold(value)
  142.     if value >= 0
  143.       $angle_message = "#{$game_party.actors[0].name}得到了#{value}#{$data_system.words.gold}"
  144.     else
  145.       $angle_message = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}#{$data_system.words.gold}"
  146.     end  
  147.     set_line_text
  148.     $angle += 1
  149.     Audio.se_play(Tips_Se, 100, 100)
  150.     return true
  151.   end
  152. end
  153. #==============================================================================
  154. # ■ Scene_Map
  155. #------------------------------------------------------------------------------
  156. #  处理地图画面的类。
  157. #==============================================================================
  158. class Scene_Map
  159.   include Angle_Message
  160.   #--------------------------------------------------------------------------
  161.   # ● 主处理
  162.   #--------------------------------------------------------------------------
  163.   def main
  164.     @spriteset = Spriteset_Map.new
  165.     @message_window = Window_Message.new
  166.     Graphics.transition
  167.     if $start
  168.     $angle_message = Info_Text
  169.     set_line_text
  170.     $angle += 1
  171.     Audio.se_play(Tips_Se, 100, 100)
  172.     $start = false
  173.     end
  174.     # 主循环
  175.     loop do
  176.       Graphics.update
  177.       Input.update
  178.       update
  179.       if $scene != self
  180.         break
  181.       end
  182.     end
  183.     Graphics.freeze
  184.     @spriteset.dispose
  185.     @message_window.dispose
  186.     if $scene.is_a?(Scene_Title)
  187.       Graphics.transition
  188.       Graphics.freeze
  189.     end
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● set_line_text
  193.   #--------------------------------------------------------------------------
  194. def set_line_text
  195.   @message2_window = Window_Show_Message.new #if @message2_window == nil
  196.   if $angle == 0
  197.   @message2_window.set_text1($angle_message)
  198.   end
  199.   if $angle == 1
  200.   @message2_window.set_text2($angle_message)
  201.   end
  202.   if $angle == 2
  203.   @message2_window.set_text3($angle_message)
  204.   end
  205.   if $angle == 3
  206.   @message2_window.set_text4($angle_message)
  207.   end
  208.   if $angle > 3
  209.   $angle = 0
  210.   @message2_window.refresh
  211.   @message2_window.set_text1($angle_message)
  212.     end
  213.   end
  214. end
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42446
在线时间
7603 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

2
发表于 2018-5-12 16:16:57 | 只看该作者
写的很乱……但是逻辑上好像没什么问题,确认一下refresh被执行到了,加个p试试

点评

写的很乱=>逻辑上有重大问题以至于醋鸡看不出来了  发表于 2018-5-13 08:33
检查发现一直被执行到的所以才看不出哪里设置有问题...  发表于 2018-5-12 16:45
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36462
在线时间
10800 小时
注册时间
2009-3-15
帖子
4815
3
发表于 2018-5-12 16:19:27 | 只看该作者
本帖最后由 soulsaga 于 2018-5-12 16:27 编辑

在初始化消除信息有什么意义..
而且第2次文章显示的SELF应该不是同一个了?

点评

的确不是同一个,因为分四段显示的。但不是在同一个window内吗?  发表于 2018-5-12 16:49
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39021
在线时间
5719 小时
注册时间
2006-11-10
帖子
6619
4
发表于 2018-5-12 16:41:53 | 只看该作者
略乱.....

感觉出问题的原因是你不停的赋予窗口实例造成的吧, 这样refresh清除的是新窗口的contents, 而不是旧窗口的contents.......

点评

好的,谢谢前辈指点。我去修改一下自己的写法。  发表于 2018-5-12 18:59
PS:建立窗口的变量也可以用全局变量哦, 所以没必要一定要把窗口建到你要调用的地方  发表于 2018-5-12 17:36
具体显示算法全部放到窗口的refresh里,然后在需要的时候调用一下refresh就好了,这样不仅是获得金钱,道具等可以显示提示,任何地方都可以简单调用了  发表于 2018-5-12 17:35
窗口直接建到map, 获得金钱只是打开个开关, 当开关打开的时候调用刷新内容就好了,可以参考老版的道具获得提示的刷新方法  发表于 2018-5-12 17:33
而且你这样写,scene map里的那句也没必要存在,因为相当于是用事件建的窗口了. 试试别用这种方法, 把窗口内容刷新放到map里,  发表于 2018-5-12 17:31
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

5
发表于 2018-5-12 17:12:17 | 只看该作者
本帖最后由 yang1zhi 于 2018-5-12 17:13 编辑

我觉得问题应该是,每次都出一个new
这样你要用变量来记下这些新建立的窗口们,之后释放。
可以用数组,每次一个NEW就加到这个数组里
只要在一开始new一下就好了啊
你想要4行就建个变量,按不同的Y坐标来显示这个变量里的字符串们就行了。
FOR 循环这个变量里的每个字符串,然后显示出来。

点评

明白了,我尝试修改一下自己的写法。  发表于 2018-5-12 18:59
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

6
发表于 2018-5-13 09:04:44 | 只看该作者
本帖最后由 RyanBern 于 2018-5-13 09:12 编辑

出错的原因同楼上讲的,不再重复。

这段代码有几个很严重的问题。
1. 所有 Window_Show_Message 实例只有创建没有释放。这会导致它在该消失的时候没有消失。
2. 按照楼主的意思,对一个窗口进行 set_text,如果位置不重叠应该是叠加显示。但是在实现的时候明显看到一句 self.contents.clear,因此对同一个窗口实例不断进行 set_text,应该只有一个位置有字。楼主的截图是多行有字,其实是生成了多个窗口,旧窗口没被清除而造成的错觉。
3. 不是很明白为什么要设置 4 个 set_text 方法,把位置作为一个参数写在方法里,或者是给 Window_Show_Message 加个实变量记录目前的位置可能会更好。
4. 为什么要有两个 set_line_text?仅仅因为它们出现在两个不同类里因此就定义了两个?程序编写切忌在不同位置出现一模一样的代码,如果这种事情真发生了,肯定有一个是多余的。一个常用的做法是设置与显示分离,即在 Interpreter 里只设置好要显示的东西,至于显示在哪,怎么显示,是由 Window_Show_Message 类控制。连接这两个方面只要一个全局变量。
5. Module 里最好不要出现全局变量的赋值。没有规定说这个赋值在反复 include 里只执行一次。

综上所述,这个功能可以写成这样(下面的代码只是展示结构,不能直接运行)
RUBY 代码复制
  1. class Window_Show_Message < Window_Base
  2.   def initialize(...)
  3.     # 设置大小,位置等
  4.     # ....
  5.     @pos = 0 # 设置初始位置
  6.   end
  7.   def update_text
  8.     # 只在第一次描绘清除
  9.     if @pos == 0
  10.       self.contents.clear
  11.     end
  12.     # 设置文字内容
  13.     self.contents.font.size = 16
  14.     self.contents.font.color = Color.new(-170,-170,-170,255)
  15.     self.contents.draw_text(4, 20 * @pos + 1, self.width - 40, 32, $angle_message)
  16.     self.contents.font.color = Color.new(255, 128, 128, 255)
  17.     self.contents.draw_text(3, 20 * @pos, self.width - 40, 32, $angle_message)
  18.     # 推进位置
  19.     @pos += 1
  20.     @pos = 0 if @pos > 3
  21.   end
  22.   def update
  23.     super
  24.     if $angle_message
  25.       update_text
  26.       $angle_message = nil
  27.     end
  28.   end
  29. end
  30.  
  31. class Interpreter
  32.   def command_125
  33.     # 如上定义
  34.     $angle_message = "...."
  35.   end
  36. end
  37.  
  38. class Scene_Map
  39.   # 只需要生成 - 刷新 - 释放
  40.   def main
  41.     # 生成窗口
  42.     # ....
  43.     @show_message = Window_Show_Message.new
  44.     # 初次开启显示欢迎信息
  45.     if $start
  46.       $angle_message = "欢迎信息"
  47.       $start = false
  48.     end
  49.     # ....
  50.     loop do
  51.       # 主循环
  52.     end
  53.     # 释放
  54.     @show_message.dispose
  55.   end
  56.   def update
  57.     @show_message.update
  58.     # 其他部分的更新
  59.     # ...
  60.   end
  61. end


另外吐槽一下变量名,angle + message 不是 角落+信息 啊。angle 这词从来就没有“角落”的含义。

评分

参与人数 5星屑 +50 +4 收起 理由
无脑之人 + 1 rb叔叔好
酋长的图腾 + 1 我很赞同
fux2 + 1 精品文章
guoxiaomi + 50 醋虾的总结
文雅夕露 + 1 十分感谢帮助前辈的指导

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
7
 楼主| 发表于 2018-5-13 09:26:34 | 只看该作者
RyanBern 发表于 2018-5-13 09:04
出错的原因同楼上讲的,不再重复。

这段代码有几个很严重的问题。

首先十分感谢版主前辈的耐心说明和指导。
也稍微解释一下自己当初写该脚本的想法。
1.窗口是固定没做释放的,考虑到可以还要做在另外的场景里所以这点没做释放考虑;
2.其实是想生成多个窗口用于显示多行提示文字;
3.同二项,用于多行文字的显示;
4.的确因为在不同类里,不能跨类调用才写两遍;
5.个人习惯问题...

关于angle_message变量名。原以为angle有角度的意思就随其自然写了。
其实当初的想法是写 angel_message,即笨蛋天使夕露的信息窗口。
然后单词拼错了就懒得改了...
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 16:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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