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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 89444640
打印 上一主题 下一主题

[已经解决] 异常状态以小图标显示,同时显示N种

[复制链接]

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

11
发表于 2017-3-28 23:58:48 | 只看该作者
本帖最后由 guoxiaomi 于 2017-3-29 00:24 编辑
89444640 发表于 2017-3-28 19:54
我接着画图标清状态,好多杂七杂八的状态,太乱了。
另外对状态上升下降同时中的情况有疑问,比个有攻击上 ...


修改了 7 楼的脚本。注意 11 行和 58~66 行的部分。

这个是防卡,并且不会实时刷新HP/SP。

但是状态图标是每 40 帧刷新的(半实时),由于技能生效在在动画播放前,状态图标会在动画播放的时候发生更新。个人感觉影响不大,暂时就这么做了。

此外,我发现我的那个全图动画的脚本和上面 fux2 写的最后一击者播放胜利动画冲突了。全图动画脚本放在后面是正确的,要兼容 fux2 的脚本的话需要修改第 112 行
  1. sprite.z = 2000
复制代码
  1. sprite.z = 2000+self.z
复制代码

如果没有发现冲突,就不用管了……

还是没有懂敌人的状态图标要怎么摆放,要顺次排列,还是要循环呢?



又想到了一件事是,其实这段脚本就是在 Window_BattleStatus 里绘制图标,其实不一定要附加了状态才需要绘制,可以直接判断角色的攻击力、防御力是否下降,然后绘制对应的图标。
比如可以这样写:
原脚本 14 行后面添加:
RUBY 代码复制
  1. # 第 1 组
  2.     state_group1 = STATE_GROUP_1 & actor.states
  3.     # 攻击力下降时,添加 '状态25' 图标到第一组
  4.     state_group1.push 25 if actor.atk < actor.base_atk
  5.     # --
  6.     if !state_group1.empty?
  7.       ...

这样在角色的攻击力下降时,会在第一组循环的图标里增加 '状态25',因为命名方式是'状态'+2位数字,但实际上跟25号状态是否附加没有关系。为了避免与已经有的25号状态图标冲突,这里可以把 25 改成更大,99以内都行。

其他的各种属性,在 Game_Actor 类搜索 'def base_' 就知道有哪些了:
base_maxhp, base_maxsp, base_str, base_dex, base_agi, base_int, base_atk, base_pdef, base_mdef, base_eva。
还有一个是命中: hit,要判断 actor.hit < 100。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
12
 楼主| 发表于 2017-3-29 09:34:58 | 只看该作者
guoxiaomi 发表于 2017-3-28 23:58
修改了 7 楼的脚本。注意 11 行和 58~66 行的部分。

这个是防卡,并且不会实时刷新HP/SP。

辛苦了,我调下技能试试。
敌人那个就是横向排列就可以了,循环显示不直观。

还有个和这个有关的事情,麻痹效果一般都是不能使用普通攻击,可以使用魔法,
但是默认选项里面没有这个,能想个办法吗?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

13
发表于 2017-3-29 09:52:32 | 只看该作者
本帖最后由 guoxiaomi 于 2017-3-29 17:22 编辑
89444640 发表于 2017-3-29 09:34
辛苦了,我调下技能试试。
敌人那个就是横向排列就可以了,循环显示不直观。


虽然我会管这个叫“缴械”……倒是没有什么困难的地方……

具体实现是这样:
1. 在行动时仍处于“麻痹”状态,攻击会无效
2. 禁用攻击指令(建议不这么做)

问题是:
如果能在给处于“麻痹”的角色下达攻击指令,并选择目标。那么角色可能会被快速行动的队友解除状态,这样不至于用防守空过一轮。

方法在这里的 1 楼:
https://rpg.blue/forum.php?mod=viewthread&tid=399295

行动前的公共事件里插入脚本,判断角色是否有状态 25 ,有的话就清除行动,播放25号动画,并等待25帧(等待动画结束):

RUBY 代码复制
  1. @battler = $scene.active_battler
  2. a = @battler.current_action
  3. if a.kind == 0 && a.basic == 0
  4.   if @battler.state?(25)
  5.     a.clear
  6.     @battler.animation_id = 25
  7.     @wait_count = 25
  8.   end
  9. end
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
14
 楼主| 发表于 2017-3-29 21:54:16 | 只看该作者
guoxiaomi 发表于 2017-3-29 09:52
虽然我会管这个叫“缴械”……倒是没有什么困难的地方……

具体实现是这样:


很好奇,为何禁用攻击不建议呢?

试了一下效果有了,选择攻击不行动,只显示动画,选择特技和魔法依然可以攻击。
然后这个命令后执行公用事件脚本中的
    when 5
      update_phase4_step5
      # 显示伤害数字时 执行 2 号公共事件
      $game_system.battle_interpreter.setup($data_common_events[2].list, 0)
是不是吧需要用到的效果都放在这个公用事件中就可以了?
如果是这样的话,那么麻痹中可以选择攻击,然后执行时显示麻痹中无法攻击的语句。
if @battler.state?(8)
$game_temp.message_text ="麻痹中"
这么写肯定不对- -
求正确写法,当角色处于麻痹状态并且选择攻击指令时,显示文字麻痹中,从而无法攻击。

点评

嗯,后面的可以不要。其实写在原帖里了,修改@help_window  发表于 2017-3-29 23:04
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

15
发表于 2017-3-29 23:15:26 | 只看该作者
本帖最后由 guoxiaomi 于 2017-3-29 23:24 编辑
89444640 发表于 2017-3-29 21:54
很好奇,为何禁用攻击不建议呢?

试了一下效果有了,选择攻击不行动,只显示动画,选择特技和魔法依然 ...


首先脚本里要再添加 attr_reader
RUBY 代码复制
  1. attr_reader   :help_window


然后事件脚本里这么写:
RUBY 代码复制
  1. @battler = $scene.active_battler
  2. a = @battler.current_action
  3. if a.kind == 0 && a.basic == 0
  4.   if @battler.state?(25)
  5.     a.clear
  6.     $scene.help_window.set_text('麻痹中', 1)
  7.     $scene.help_window.visible = true
  8.   end
  9. end


禁用攻击不建议的原因是,实现起来麻烦啊~(并不)

而且我觉得禁用指令本身也没有太多意义吧,我甚至都想把沉默不能下达魔法指令改成可以正常下达,只是行动时仍然被沉默就无效。

还有一点原因是,如果没有处于'麻痹'或是'沉默'状态,正常下达指令后,角色行动前被先行动者加上负面效果,本轮是空过的。所以攻击、魔法是否生效不取决于是否下达指令,而是取决于行动时自己的状态。大概是基于这些原因,我觉得不需要在指令中禁用攻击和魔法。

点评

原来如此,实际效果比禁用还好,“我没说不能选择呀~只不过选择后无法执行罢了XD”那现在还差一个敌人异常状态排列这个图标显示异常就完美了~  发表于 2017-3-30 06:35
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
16
 楼主| 发表于 2017-3-30 15:06:55 | 只看该作者
guoxiaomi 发表于 2017-3-29 23:15
首先脚本里要再添加 attr_reader
attr_reader   :help_window[/pre]

最后还是选择用动画显示了,感觉很欢乐的样子XD

有时间帮我把敌人的状态显示也做一下吧~
非常感谢~

点评

嗯,应该不太困难,等我有空……  发表于 2017-3-30 15:35
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

17
发表于 2017-3-30 20:22:32 | 只看该作者
本帖最后由 guoxiaomi 于 2017-3-30 20:23 编辑
89444640 发表于 2017-3-30 15:06
最后还是选择用动画显示了,感觉很欢乐的样子XD

有时间帮我把敌人的状态显示也做一下吧~


看到你使用了 '战斗时敌HP、MP显示' 脚本,所以这样写的……

以及物品/技能以友方单体为目标的时候,如果想跟跟敌人一样显示状态的话,要把 ENABLE_TO_ACTOR 设置为 true。如果没有Help_Window,就设置为 false。

微调位置在第 99,104,110 行

RUBY 代码复制
  1. #==============================================================================
  2. # ■ 常量定义
  3. #==============================================================================
  4. module SHOW_STATE_ICON
  5.   # 下方角色窗口绘制
  6.   # 三个分组对应三个不同的位置
  7.   STATE_GROUP_1 = [2]
  8.   STATE_GROUP_2 = [3,4,5,6]
  9.   STATE_GROUP_3 = []  
  10.   STATE_REFRESH_TIME = 40 # 刷新时间(帧)
  11.  
  12.   # 上方敌人/角色窗口绘制
  13.   STATE_GROUP_4 = [1,2,3,4,5,6,7,8] # 允许显示的状态
  14.   MAX_STATES = 5 # 最多绘制的图标数
  15.   ENABLE_TO_ACTOR = true # true 对角色也生效,false 只对敌人生效
  16. end
  17. #==============================================================================
  18. # ■ Window_BattleStatus
  19. #==============================================================================
  20. class Window_BattleStatus < Window_Base
  21.   # 常量
  22.   include SHOW_STATE_ICON
  23.  
  24.   def draw_actor_state(actor, x, y)   
  25.     # 清除所有图标
  26.     self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
  27.  
  28.     # 第 1 组
  29.     state_group1 = STATE_GROUP_1 & actor.states
  30.     if !state_group1.empty?
  31.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
  32.       state = state_group1[show_id]
  33.       # 绘制图标      
  34.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  35.       self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  36.     end
  37.  
  38.     # 第 2 组
  39.     state_group2 = STATE_GROUP_2 & actor.states
  40.     if !state_group2.empty?
  41.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
  42.       state = state_group2[show_id]
  43.       # 绘制图标
  44.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  45.       self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  46.     end
  47.  
  48.     # 第 3 组
  49.     state_group3 = STATE_GROUP_3 & actor.states
  50.     if !state_group3.empty?
  51.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
  52.       state = state_group3[show_id]
  53.       # 绘制图标      
  54.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  55.       self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  56.     end
  57.  
  58.     # 不显示状态时显示一段文字
  59.     if state_group1.empty? && state_group2.empty? && state_group3.empty?
  60.       # 显示文字
  61.       self.contents.font.color = normal_color
  62.       self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
  63.     end
  64.   end  
  65.  
  66.   alias _SHOW_STATE_ICON_update update
  67.   def update
  68.     # 继续之前的 update
  69.     _SHOW_STATE_ICON_update
  70.     # 每 40 帧绘制 1 次状态图标
  71.     if Graphics.frame_count % STATE_REFRESH_TIME == 1
  72.       for i in 0...$game_party.actors.size
  73.         actor = $game_party.actors[i]
  74.         actor_x = i * 160 + 4      
  75.         if !@level_up_flags[i]         
  76.           draw_actor_state(actor, actor_x, 96)
  77.         end
  78.       end
  79.     end
  80.   end  
  81. end
  82.  
  83. #==============================================================================
  84. # ■ Window_Help
  85. #------------------------------------------------------------------------------
  86. # 追加定义的内容,可以显示角色和敌人的状态图标
  87. # * 需要配合 '战斗时敌HP、MP显示' 脚本使用
  88. #==============================================================================
  89. class Window_Help < Window_Base  
  90.   # 常量
  91.   include SHOW_STATE_ICON
  92.  
  93.   def draw_actor_state(actor, x, y)   
  94.     # 使用之前的绘制
  95.     if !actor.is_a?(Game_Enemy) && !ENABLE_TO_ACTOR
  96.       super
  97.     else
  98.       # x 偏移量,可以修改下面的 40
  99.       x = x - 40
  100.       # 绘制状态图标,最多 MAX_STATES 个
  101.       state_group4 = (STATE_GROUP_4 & actor.states).sort[0, MAX_STATES]   
  102.       state_group4.each_index do |i|
  103.         bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state_group4[i]))
  104.         self.contents.blt(x + i * 34, y, bitmap, Rect.new(0, 0, 32, 32), 255)
  105.       end
  106.       # 正常的情况下
  107.       if state_group4.empty?
  108.         # 显示文字
  109.         self.contents.font.color = normal_color
  110.         self.contents.draw_text(x, y, 240, 32, "o(* ̄▽ ̄*)ブ")
  111.       end
  112.     end   
  113.   end
  114. end
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
18
 楼主| 发表于 2017-3-31 08:41:57 | 只看该作者
guoxiaomi 发表于 2017-3-30 20:22
看到你使用了 '战斗时敌HP、MP显示' 脚本,所以这样写的……

以及物品/技能以友方单体为目标的时候,如 ...

非常感谢~反馈一下使用效果。

菜单是我看习惯了的~真好~
不蛋疼的情况下,对敌人攻击通常会有选择性的发动对己方特别有利的状态,所以五个足够了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-21 02:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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