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

Project1

 找回密码
 注册会员
搜索

自写的无法清除内容是什么问题呢?

查看数: 2438 | 评论数: 6 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-5-12 13:03

正文摘要:

已经调用了 def refresh     self.contents.clear   end复制代码 但还是无法清除内容。 不知道是什么问题造成的。 请前辈帮忙看看该脚本出现了什么问题... RUBY 代码复Ò ...

回复

文雅夕露 发表于 2018-5-13 09:26:34
RyanBern 发表于 2018-5-13 09:04
出错的原因同楼上讲的,不再重复。

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

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

关于angle_message变量名。原以为angle有角度的意思就随其自然写了。
其实当初的想法是写 angel_message,即笨蛋天使夕露的信息窗口。
然后单词拼错了就懒得改了...
RyanBern 发表于 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 十分感谢帮助前辈的指导

查看全部评分

yang1zhi 发表于 2018-5-12 17:12:17
本帖最后由 yang1zhi 于 2018-5-12 17:13 编辑

我觉得问题应该是,每次都出一个new
这样你要用变量来记下这些新建立的窗口们,之后释放。
可以用数组,每次一个NEW就加到这个数组里
只要在一开始new一下就好了啊
你想要4行就建个变量,按不同的Y坐标来显示这个变量里的字符串们就行了。
FOR 循环这个变量里的每个字符串,然后显示出来。
灯笼菜刀王 发表于 2018-5-12 16:41:53
略乱.....

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

soulsaga 发表于 2018-5-12 16:19:27
本帖最后由 soulsaga 于 2018-5-12 16:27 编辑

在初始化消除信息有什么意义..
而且第2次文章显示的SELF应该不是同一个了?
fux2 发表于 2018-5-12 16:16:57
写的很乱……但是逻辑上好像没什么问题,确认一下refresh被执行到了,加个p试试
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-11-27 18:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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