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

Project1

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

[已经解决] [已解决]如何让单个人的状态栏进行刷新?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14626
在线时间
2197 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2020-4-3 18:54:12 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2020-4-6 18:15 编辑

直接上图吧,敌人用的是群攻,是逐个攻击,但是现在有个问题就是,瞬间所有人的HP血槽,直接刷新出来了。
我需要的是,攻击-出现伤害-血槽扣血这个顺序依次执行。
后来我发现个问题原因可能是因为,
如 生成特技行动结果、和物品效果里面,都是直接把所有人的伤害、恢复值计算好了,造成,我一刷新状态栏直接暴血管了(默认的脚本系统肯定不会有这个问题,因为没有逐个攻击)。
RUBY 代码复制
  1. # 应用特技效果
  2.     for target in @target_battlers
  3.       target.skill_effect(@active_battler, @skill)
  4.     end


RUBY 代码复制
  1. # 应用物品效果
  2.     for target in @target_battlers
  3.       target.item_effect(@item)
  4.     end


我目前就有一个想法,是把Window_BattleStatus中的refresh改造成能够独自刷新。。。
如果大家有别的更好地方法请帮助下

1.gif (393 KB, 下载次数: 19)

1.gif

Lv1.梦旅人

梦石
0
星屑
237
在线时间
36 小时
注册时间
2017-12-4
帖子
21
5
发表于 2020-8-9 19:27:01 | 只看该作者
涨知识了
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39028
在线时间
5722 小时
注册时间
2006-11-10
帖子
6621
4
发表于 2020-4-6 15:13:15 | 只看该作者
本帖最后由 灯笼菜刀王 于 2020-4-6 15:21 编辑
  1.   def refresh
  2.     @item_max = $game_party.actors.size
  3.     for i in 0...@item_max
  4.       if (actor = $game_party.actors[i]).状态窗口刷新开关
  5.         actor.状态窗口刷新开关 = false
  6.         actor_x = i * 160 + 4
  7.         self.contents.fill_rect(Rect.new(actor_x-4,0,160,160),Color.new(0,0,0,0))
  8.         draw_actor_hp(actor, actor_x, 32, 120)
  9.         draw_actor_sp(actor, actor_x, 64, 120)
  10.         if @level_up_flags[i]
  11.           self.contents.font.color = normal_color
  12.           self.contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")
  13.         else
  14.           draw_actor_state(actor, actor_x, 96)
  15.         end
  16.       end
  17.     end
  18.   end
复制代码

点评

我今天又优化了下就在用的地方用这个新的刷新方法,其他地方都用以前的,还在优化中  发表于 2020-4-7 15:48
没那么高端, 默认脚本就有使用, 而且你也曾经提问过相关问题-.-  发表于 2020-4-6 18:57
fill_rect的意思是写之前,覆盖一层透明的盖住,再写,如此往复,真是巧妙啊,能解决这个问题,估计以后我这个游戏脚本即使别人拿去也整不明白...  发表于 2020-4-6 18:34
生怕哪个地方漏了,造成故障  发表于 2020-4-6 18:23
好了成功了,现在多出都加了这个开关凡是有@status_window.refresh处都加了,感觉像插了浑身的管子....  发表于 2020-4-6 18:06

评分

参与人数 2星屑 +100 +2 收起 理由
RyanBern + 100 + 1 认可答案
miantouchi + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14626
在线时间
2197 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

3
 楼主| 发表于 2020-4-6 14:56:08 | 只看该作者
本帖最后由 miantouchi 于 2020-4-6 15:01 编辑
灯笼菜刀王 发表于 2020-4-4 20:01
最简单的方法就是把Window_BattleStatu分四份,自己刷新自己的, 刷新时机为伤害显示结束,反正你已经有这个开 ...


根据你的提示,我先发下,我写的,已经成功建了4个窗口,接下来不太会弄了。
如果在    战斗场景调用@status_window.refresh还是一样的
我想把@status_window.refresh(@target)这样的形式传入进去。
就也是,目标是谁,就刷新谁的窗口
但是感觉把def refresh(target) ,这样定义加个参数有点怪怪的。
我这段是用数组的办法
  1. #==============================================================================
  2. # ■ Window_BattleStatus
  3. #------------------------------------------------------------------------------
  4. #  显示战斗画面同伴状态的窗口。
  5. #==============================================================================

  6. class Window_BattleStatus < Window_Base
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.     super(0, 320, 640, 160)
  12.     @w = []
  13.     (0..$game_party.actors.size - 1).each do|i|
  14.       @w[i] = Window_Base.new(320 - $game_party.actors.size * 80 + i*160, 100, 160, 160)
  15.       @w[i].back_opacity = 0
  16.       @w[i].contents = Bitmap.new(width - 32, height - 32)
  17.     end
  18.     self.contents = Bitmap.new(width - 32, height - 32)
  19.     @actor = actor
  20.     @level_up_flags = [false, false, false, false]
  21.     refresh
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 释放
  25.   #--------------------------------------------------------------------------
  26.   def dispose
  27.     super
  28.     @w.each {|w|w.dispose}
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 设置升级标志
  32.   #     actor_index : 角色索引
  33.   #--------------------------------------------------------------------------
  34.   def level_up(actor_index)
  35.     @level_up_flags[actor_index] = true
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 刷新
  39.   #--------------------------------------------------------------------------
  40.   def refresh
  41.     (0...$game_party.actors.size).each {|i| @w[i].contents.clear}
  42.     @item_max = $game_party.actors.size
  43.     for i in 0...$game_party.actors.size
  44.       actor = $game_party.actors[i]
  45.       actor_x = 4#i * 160 + 4
  46.       @w[i].draw_actor_name(actor, actor_x, 0)
  47.       @w[i].draw_actor_hp(actor, actor_x, 32, 120)
  48.       @w[i].draw_actor_sp(actor, actor_x, 64, 120)
  49.       if @level_up_flags[i]
  50.         @w[i].contents.font.color = normal_color
  51.         @w[i].contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")
  52.       else
  53.         @w[i].draw_actor_state(actor, actor_x, 96)
  54.       end
  55.     end
  56.   end
  57. end
复制代码
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39028
在线时间
5722 小时
注册时间
2006-11-10
帖子
6621
2
发表于 2020-4-4 20:01:24 | 只看该作者
最简单的方法就是把Window_BattleStatu分四份,自己刷新自己的, 刷新时机为伤害显示结束,反正你已经有这个开关了

2,改造refresh, 不直接把整个contents.clear, 而是分成4部分, 用contents.fill_rect去一个一个清除并重写, 刷新条件一样为伤害显示结束

3,把扣HP的操作挪到伤害显示结束来处理,然后同步刷新窗口, 不过这时self.damage是已经清零了,数值要另外记录就是了比较麻烦

注意以上的方法都可能和你用的脚本会有冲突(比如血条之类的), 自己多多排查吧

点评

如果会用数组建窗口,这个是最方便的做法,因为不用考虑更改刷新条件,只不过是把单变量刷新变成数组循环刷新而已  发表于 2020-4-4 21:22
当然不用,只不过是把本来一个窗口分成4个,每个窗口显示单独的角色而已,做法同window state, 分别带入$game_party.actors[0-3]就是了  发表于 2020-4-4 21:21
第3个方法感觉难度太大,肯定要对战斗流程有充分理解才敢改,冲突能最大,已现有的流程 。  发表于 2020-4-4 20:25
好的,我先试试第2个方法,第1个方法感觉如果角色多了10多个角色的话那岂不是要建10个Window_BattleStatu。  发表于 2020-4-4 20:25
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-29 05:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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