Project1

标题: 变化窗口皮肤 [打印本页]

作者: 黑米馒头    时间: 2022-6-17 22:12
标题: 变化窗口皮肤
本帖最后由 黑米馒头 于 2022-6-17 22:15 编辑

self.windowskin = RPG::Cache.windowskin('皮肤窗口')
这样可以改窗口皮肤,可是战斗场景的皮肤窗口怎么换皮肤?

想把这个选人的光标箭头换了
(, 下载次数: 138)

攻击的时候显示一种
(, 下载次数: 136)
法术的时候又换一种
(, 下载次数: 126)
捕捉的时候又换一种~
(, 下载次数: 134)

这里是生成箭头的窗口,
@actor_arrow.windowskin = RPG::Cache.windowskin('箭头')这应该竟然不行~
(, 下载次数: 128)


作者: guoxiaomi    时间: 2022-6-18 01:00
本帖最后由 guoxiaomi 于 2022-6-18 01:02 编辑

实际上要修改的是 @actor_arrow 的 bitmap,参见 Arrow_Base 类的 initialize 方法。
如果想修改,还需要加上
  1. attr_accessor :bitmap
复制代码

作者: 黑米馒头    时间: 2022-6-18 10:27
guoxiaomi 发表于 2022-6-18 01:00
实际上要修改的是 @actor_arrow 的 bitmap,参见 Arrow_Base 类的 initialize 方法。
如果想修改,还需要加 ...

我试着这么改好像不行,完全就不显示箭头了。。。

[pre lang="ruby"]#==============================================================================
# ■ Arrow_Base
#------------------------------------------------------------------------------
#  在战斗画面使用的箭头光标的活动块。本类作为
# Arrow_Enemy 类与 Arrow_Actor 类的超级类使用。
#==============================================================================

class Arrow_Base < Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :index                    # 光标位置
  attr_reader   :help_window              # 帮助窗口
  
  attr_accessor :bitmap                   # 位图
  
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口
  #--------------------------------------------------------------------------
  def initialize(viewport)
    super(viewport)
    self.bitmap = RPG::Cache.windowskin($game_system.windowskin_name)
    self.ox = 16
    self.oy = 64
    self.z = 2500
    @blink_count = 0
    @index = 0
    @help_window = nil
   
    @bitmap = nil
   
    update
  end
  #--------------------------------------------------------------------------
  # ● 设置光标位置
  #     index : 新的光标位置
  #--------------------------------------------------------------------------
  def index=(index)
    @index = index
    update
  end
  #--------------------------------------------------------------------------
  # ● 设置帮助窗口
  #     help_window : 新的帮助窗口
  #--------------------------------------------------------------------------
  def help_window=(help_window)
    @help_window = help_window
    # 刷新帮助文本 (update_help 定义了继承目标)
    if @help_window != nil
      update_help
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 设置皮肤位图
  #     bitmap : 新的皮肤位图
  #--------------------------------------------------------------------------
  def bitmap(bitmap)
    @bitmap = bitmap
    # 刷新帮助文本 (update_bitmap 定义了继承目标)
    if @bitmap != nil
      update_bitmap
    end
  end  
  
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新闪烁记数
    @blink_count = (@blink_count + 1) % 8
    # 设置传送源矩形
    if @blink_count < 4
      self.src_rect.set(128, 96, 32, 32)
    else
      self.src_rect.set(160, 96, 32, 32)
    end
    # 刷新帮助文本 (update_help 定义了继承目标)
    if @help_window != nil
      update_help
    end
  end
end
[/pre]

(, 下载次数: 134)
作者: 黑米馒头    时间: 2022-6-18 22:55
guoxiaomi 发表于 2022-6-18 01:00
实际上要修改的是 @actor_arrow 的 bitmap,参见 Arrow_Base 类的 initialize 方法。
如果想修改,还需要加 ...

(, 下载次数: 7)   不知道哪里错了。。反正就是跳出脚本错误~~~
作者: guoxiaomi    时间: 2022-6-19 00:44
本帖最后由 guoxiaomi 于 2022-6-19 00:47 编辑

都是些写法上的小问题,你具体想做什么?把你写的这个 bitmap 函数直接删了不就不报错了。你只修改了 Arrow_Actor 的位图,并且默认 Bitmap = nil,当然就不显示敌人的箭头了。

而且直接操作继承自 Sprite 的 @bitmap 对象可能会有问题,建议跟上面保持一致,使用 self.bitmap 操作
作者: 黑米馒头    时间: 2022-6-19 11:37
guoxiaomi 发表于 2022-6-19 00:44
都是些写法上的小问题,你具体想做什么?把你写的这个 bitmap 函数直接删了不就不报错了。你只修改了 Arrow ...

可能我表达不清楚。。。

问题是这样的,就是修改选择敌人时的箭头,比如,攻击的时候显示1种,法术的时候1种,捕捉的时候又换1种,

然后其实啥都不用改,只需要在

(, 下载次数: 138)

这里加上下面这句改变图片就行,

可是又出现1个BUG了,就是当选择敌人的时候,

箭头皮肤改变的一刹那,会出现显示出整个窗口皮肤的情况(有时候会卡皮肤窗口,有时候又不会卡),

如图:

(, 下载次数: 134)

然后大概1秒左右,恢复正常

(, 下载次数: 119)

不知道啥情况~
作者: guoxiaomi    时间: 2022-6-19 17:28
本帖最后由 guoxiaomi 于 2022-6-19 17:45 编辑
黑米馒头 发表于 2022-6-19 11:37
可能我表达不清楚。。。

问题是这样的,就是修改选择敌人时的箭头,比如,攻击的时候显示1种,法术的时 ...


试一下不要重定义 bitmap= 方法,改成定义 set_bitmap 然后调用。因为 Arrow_Enemy < Arrow_Base < Sprite 继承链的存在,Sprite 里定义的 bitmap= 方法被继承下来了,就可能导致一些问题。对于内置的可绘制类,重定义属性名称相关的方法(bitmap 和 bitmap=),以及访问或操作相关的属性(@bitmap)在 RGSS 中属于未定义行为(UB)。RGSS 的默认脚本里也没有任何这样的写法,除非你很了解 RGSS 内置类是如何实现的,否则不要尝试去操作。
  1.   #--------------------------------------------------------------------------
  2.   # ● 设置皮肤位图
  3.   #     bitmap : 新的皮肤位图
  4.   #--------------------------------------------------------------------------
  5.   def set_bitmap(bitmap)
  6.     # 用 self.bitmap 设置 bitamap,不要用 @bitmap
  7.     self.bitmap = bitmap
  8.     # 如果 bitmap 不为 nil,则刷新 src_rect
  9.     update if bitmap
  10.   end
复制代码

调用时写:
  1. @enemy_arrow.set_bitmap(RPG::Cache.windowskin('皮肤窗口'))
复制代码


另,如果想写的比较花,可以把方法名写为 windowskin=:
  1. class Arrow_Base
  2.   def windowskin=(w)
  3.     self.bitmap = w
  4.     update if w
  5.   end
  6. end
复制代码

然后你就可以写:
  1. @enemy_arrow.windowskin = RPG::Cache.windowskin('皮肤窗口')
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X5.0