Project1

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

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

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

想把这个选人的光标箭头换了


攻击的时候显示一种

法术的时候又换一种

捕捉的时候又换一种~


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



作者: 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 方法。
如果想修改,还需要加 ...

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

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Arrow_Base
  3. #------------------------------------------------------------------------------
  4. #  在战斗画面使用的箭头光标的活动块。本类作为
  5. # Arrow_Enemy 类与 Arrow_Actor 类的超级类使用。
  6. #==============================================================================
  7.  
  8. class Arrow_Base < Sprite
  9.   #--------------------------------------------------------------------------
  10.   # ● 定义实例变量
  11.   #--------------------------------------------------------------------------
  12.   attr_reader   :index                    # 光标位置
  13.   attr_reader   :help_window              # 帮助窗口
  14.  
  15.   attr_accessor :bitmap                   # 位图
  16.  
  17.   #--------------------------------------------------------------------------
  18.   # ● 初始化对像
  19.   #     viewport : 显示端口
  20.   #--------------------------------------------------------------------------
  21.   def initialize(viewport)
  22.     super(viewport)
  23.     self.bitmap = RPG::Cache.windowskin($game_system.windowskin_name)
  24.     self.ox = 16
  25.     self.oy = 64
  26.     self.z = 2500
  27.     @blink_count = 0
  28.     @index = 0
  29.     @help_window = nil
  30.  
  31.     @bitmap = nil
  32.  
  33.     update
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 设置光标位置
  37.   #     index : 新的光标位置
  38.   #--------------------------------------------------------------------------
  39.   def index=(index)
  40.     @index = index
  41.     update
  42.   end
  43.   #--------------------------------------------------------------------------
  44.   # ● 设置帮助窗口
  45.   #     help_window : 新的帮助窗口
  46.   #--------------------------------------------------------------------------
  47.   def help_window=(help_window)
  48.     @help_window = help_window
  49.     # 刷新帮助文本 (update_help 定义了继承目标)
  50.     if @help_window != nil
  51.       update_help
  52.     end
  53.   end
  54.  
  55.   #--------------------------------------------------------------------------
  56.   # ● 设置皮肤位图
  57.   #     bitmap : 新的皮肤位图
  58.   #--------------------------------------------------------------------------
  59.   def bitmap(bitmap)
  60.     @bitmap = bitmap
  61.     # 刷新帮助文本 (update_bitmap 定义了继承目标)
  62.     if @bitmap != nil
  63.       update_bitmap
  64.     end
  65.   end  
  66.  
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新画面
  69.   #--------------------------------------------------------------------------
  70.   def update
  71.     # 刷新闪烁记数
  72.     @blink_count = (@blink_count + 1) % 8
  73.     # 设置传送源矩形
  74.     if @blink_count < 4
  75.       self.src_rect.set(128, 96, 32, 32)
  76.     else
  77.       self.src_rect.set(160, 96, 32, 32)
  78.     end
  79.     # 刷新帮助文本 (update_help 定义了继承目标)
  80.     if @help_window != nil
  81.       update_help
  82.     end
  83.   end
  84. end



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

变化窗口皮肤.rar (192.73 KB, 下载次数: 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种,

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



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

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

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

如图:



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



不知道啥情况~
作者: 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! X3.1