查看: 2835|回复: 17

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

[复制链接]
梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
发表于 2018-5-12 13:03:30 | 显示全部楼层 |阅读模式

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

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

×
360截图20180512121713625.png
已经调用了
  1. def refresh
  2.     self.contents.clear
  3.   end
复制代码

但还是无法清除内容。
不知道是什么问题造成的。
请前辈帮忙看看该脚本出现了什么问题...
[pre lang="ruby"]#==============================================================================
# ■ module Angle_Message
#------------------------------------------------------------------------------
module Angle_Message
Window_X = 0
Window_Y = 360
Window_Width = 320
Window_Height = 120
Tips_Se ="Audio/SE/系统"
Angle_Max = 4
Info_Text = "歡迎您進入遊戲!"
$angle = 0
end
#==============================================================================
# ■ Window_Show_Message
#------------------------------------------------------------------------------
#   信息窗口。
#==============================================================================
class Window_Show_Message < Window_Selectable
  include Angle_Message
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(Window_X, Window_Y, Window_Width, Window_Height)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 设置文本
  #     text  : 窗口显示的字符串
  #--------------------------------------------------------------------------
  def set_text1(text)
      if text != ""
      # 再描绘文本
      self.contents.clear
      self.contents.font.size = 16
      self.contents.font.color = Color.new(-170,-170,-170,255)
      self.contents.draw_text(4, 0 + 1, self.width - 40, 32,text)
      self.contents.font.color = Color.new(255, 128, 128, 255)
      self.contents.draw_text(3, 0, self.width - 40, 32,text)
      @text = text
    end
      self.visible = true
    end
  #--------------------------------------------------------------------------
  # ● 设置文本
  #     text  : 窗口显示的字符串
  #--------------------------------------------------------------------------
  def set_text2(text)
      if text != ""
      # 再描绘文本
      self.contents.clear
      self.contents.font.size = 16
      self.contents.font.color = Color.new(-170,-170,-170,255)
      self.contents.draw_text(4, 20 + 1, self.width - 40, 32,text)
      self.contents.font.color = Color.new(255, 128, 128, 255)
      self.contents.draw_text(3, 20, self.width - 40, 32,text)
      @text = text
    end
      self.visible = true
    end
  #--------------------------------------------------------------------------
  # ● 设置文本
  #     text  : 窗口显示的字符串
  #--------------------------------------------------------------------------
  def set_text3(text)
    if text != ""
      # 再描绘文本
      self.contents.clear
      self.contents.font.size = 16
      self.contents.font.color = Color.new(-170,-170,-170,255)
      self.contents.draw_text(4, 40 + 1, self.width - 40, 32,text)
      self.contents.font.color = Color.new(255, 128, 128, 255)
      self.contents.draw_text(3, 40, self.width - 40, 32,text)
      @text = text
    end
      self.visible = true
    end
  #--------------------------------------------------------------------------
  # ● 设置文本
  #     text  : 窗口显示的字符串
  #--------------------------------------------------------------------------
  def set_text4(text)
    if @text != ""
      # 再描绘文本
      self.contents.clear
      self.contents.font.size = 16
      self.contents.font.color = Color.new(-170,-170,-170,255)
      self.contents.draw_text(4, 60 + 1, self.width - 40, 32,text)
      self.contents.font.color = Color.new(255, 128, 128, 255)
      self.contents.draw_text(3, 60, self.width - 40, 32,text)
      @text = text
    end
      self.visible = true
    end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
  end
end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Interpreter
  include Angle_Message
  #--------------------------------------------------------------------------
  # ● set_line_text
  #--------------------------------------------------------------------------
  def set_line_text
  @message2_window = Window_Show_Message.new
  if $angle == 0
  @message2_window.set_text1($angle_message)
end
  if $angle == 1
  @message2_window.set_text2($angle_message)
end
  if $angle == 2
  @message2_window.set_text3($angle_message)
end
  if $angle == 3
  @message2_window.set_text4($angle_message)
end
  if $angle > 3
  $angle = 0
  @message2_window.refresh
  @message2_window.set_text1($angle_message)
  end
end
  #--------------------------------------------------------------------------
  # ● 增减金钱
  #--------------------------------------------------------------------------
  def command_125
    value = operate_value(@parameters[0], @parameters[1], @parameters[2])
    $game_party.gain_gold(value)
    if value >= 0
      $angle_message = "#{$game_party.actors[0].name}得到了#{value}#{$data_system.words.gold}"
    else
      $angle_message = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}#{$data_system.words.gold}"
    end  
    set_line_text
    $angle += 1
    Audio.se_play(Tips_Se, 100, 100)
    return true
  end
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  处理地图画面的类。
#==============================================================================
class Scene_Map
  include Angle_Message
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    @spriteset = Spriteset_Map.new
    @message_window = Window_Message.new
    Graphics.transition
    if $start
    $angle_message = Info_Text
    set_line_text
    $angle += 1
    Audio.se_play(Tips_Se, 100, 100)
    $start = false
    end
    # 主循环
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @spriteset.dispose
    @message_window.dispose
    if $scene.is_a?(Scene_Title)
      Graphics.transition
      Graphics.freeze
    end
  end
  #--------------------------------------------------------------------------
  # ● set_line_text
  #--------------------------------------------------------------------------
def set_line_text
  @message2_window = Window_Show_Message.new #if @message2_window == nil
  if $angle == 0
  @message2_window.set_text1($angle_message)
  end
  if $angle == 1
  @message2_window.set_text2($angle_message)
  end
  if $angle == 2
  @message2_window.set_text3($angle_message)
  end
  if $angle == 3
  @message2_window.set_text4($angle_message)
  end
  if $angle > 3
  $angle = 0
  @message2_window.refresh
  @message2_window.set_text1($angle_message)
    end
  end
end[/pre]
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。

老黄鸡

梦石
4
星屑
45700
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2018-5-12 16:16:57 | 显示全部楼层
写的很乱……但是逻辑上好像没什么问题,确认一下refresh被执行到了,加个p试试

点评

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

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2018-5-12 16:19:27 | 显示全部楼层
本帖最后由 soulsaga 于 2018-5-12 16:27 编辑

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

点评

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

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 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
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2018-5-12 17:12:17 | 显示全部楼层
本帖最后由 yang1zhi 于 2018-5-12 17:13 编辑

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

点评

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

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 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 里只执行一次。

综上所述,这个功能可以写成这样(下面的代码只是展示结构,不能直接运行)
[pre lang="Ruby"]class Window_Show_Message < Window_Base
  def initialize(...)
    # 设置大小,位置等
    # ....
    @pos = 0 # 设置初始位置
  end
  def update_text
    # 只在第一次描绘清除
    if @pos == 0
      self.contents.clear
    end
    # 设置文字内容
    self.contents.font.size = 16
    self.contents.font.color = Color.new(-170,-170,-170,255)
    self.contents.draw_text(4, 20 * @pos + 1, self.width - 40, 32, $angle_message)
    self.contents.font.color = Color.new(255, 128, 128, 255)
    self.contents.draw_text(3, 20 * @pos, self.width - 40, 32, $angle_message)
    # 推进位置
    @pos += 1
    @pos = 0 if @pos > 3
  end
  def update
    super
    if $angle_message
      update_text
      $angle_message = nil
    end
  end
end

class Interpreter
  def command_125
    # 如上定义
    $angle_message = "...."
  end
end

class Scene_Map
  # 只需要生成 - 刷新 - 释放
  def main
    # 生成窗口
    # ....
    @show_message = Window_Show_Message.new
    # 初次开启显示欢迎信息
    if $start
      $angle_message = "欢迎信息"
      $start = false
    end
    # ....
    loop do
      # 主循环
    end
    # 释放
    @show_message.dispose
  end
  def update
    @show_message.update
    # 其他部分的更新
    # ...
  end
end
[/pre]

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

评分

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

查看全部评分

回复

使用道具 举报

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
 楼主| 发表于 2018-5-13 09:26:34 | 显示全部楼层
RyanBern 发表于 2018-5-13 09:04
出错的原因同楼上讲的,不再重复。

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

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

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部