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

Project1

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

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

[复制链接]

Lv5.捕梦者

梦石
0
星屑
35180
在线时间
4169 小时
注册时间
2007-12-15
帖子
10066
跳转到指定楼层
1
发表于 2017-3-25 00:30:16 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 89444640 于 2017-3-25 22:13 编辑

嗯……是这样。
xp中异常状态以文字和状态动画方式显示,定量高为目前显示的状态。


但是,角色和敌人都可能会同时中多种异常状态……,而动画显示方式不能同时多个动画叠加。
那么可否这样……
状态动画不用管,还是按照定量高的显示,避免修改地方过多。
以小图标显示在角色的窗口下方,最初想这样显示

用32*32的小图标显示异常状态,需要修改界面,空出下面两行留着显示异常状态。
但是界面修改可能麻烦,上面的方式先作罢。

考虑了一下,这样显示,

依照左下角黄色小方块中显示的数字排列状态图标的显示顺序。有点挡mp数字显示,最好把HP MP栏向上移动一点。最多同时8种状态,万一超过8种就往32*32格角色名字后面排
状态该上升下降的同时显示吧?理论上应该抵消但是xp似乎不能抵消,
推测了一下,大概能同时中的…… 中毒 眩晕 盲目 封魔 麻痹 防御上升 攻击上升 速度上升 速度下降 攻击下降 命中下降 ……还真能超过8种

最后又考虑了一下,有没有可能让这几个图标循环显示?我记得有的商业游戏就这样,只需要一个32*32的格子就行了。如gif左下角,

显示位置是默认显示正常的位置,然后每个状态停留时间……40帧,状态解除了这个状态的图标就不显示,因为不会脚本这个感觉上有点难。如何能实现不知道角色中什么状态的情况下,这几个图标循环……啊对了,可以就按照异常状态的id编号循环嘛,没中的就是fals不显示,有的就显示40帧然后切换其他的编号继续寻找,循环到最后一个状态,再从头到尾刷一遍……如果有了定量10的状态,显示定量10的状态,有两个定量10的,只显示战斗不能。希望不会卡得慌……
能改成这种最好。

特殊情况,诸如战斗不能这种定量10的,中了清除所有图标。只把战斗不能的图标放在第一格。
中毒等胜利后也不解除的状态,到下次战斗时候自动加上去,直到吃药解除为止一直都显示。

状态消失后,后面的自动顶上去……这个我不知道怎么形容,就是消失了以后,后面的状态自动往前排。

由于32*32太小无法显示很多汉字,可以事件做个异常状态的说明书,每个图标都需要做对应的做说明。只能让玩家自己记了。


而敌人,为了考虑玩家看着直观不用等每个状态全显示一遍再下达命令,在选择的时候,直接吧所有状态都都显示在敌人名称后面吧,如图所示

当选中敌人的时候。
考虑了一下美观度,在上下两个32格的中间显示,直接往后排吧,中多少种就依次往后排。

异常状态的文字描述的显示就不要显示了。还有平时那个什么状态都没有的正常也不用显示了。

求教这样的效果应该如何实现呢?
测试用工程图标如下,脚本在我目前的脚本上改就好,请告知改了哪里我好标注。
非常感谢。
测试异常状态图标显示.rar (276.53 KB, 下载次数: 114)

追加一个问题,偷盗脚本,偶尔会出现这个,不知道什么原因,不是总出现,队伍中人选择多种攻击方式,有的角色偷窃有的群攻有的单体攻击就会出现。

脚本就在发的工程里,
这行的内容是
517  when 3 #偷到金钱,并记录下回合将被围攻的角色
518            $game_temp.harvest[1]=$game_temp.steal[steal_index[0]][3][0]
519             $game_party.gain_gold($game_temp.harvest[1])
520             $game_temp.mass_brawl[steal_index[3]]||=[]
521           $game_temp.mass_brawl[steal_index[3]]<<steal_index[4]
让作者给改成无论怎么偷窃也是不被围攻,敌人还是按照随机顺序,先攻击队伍前卫为主。是不是这个原因造成的?

没事了 那个偷窃的数列似乎写错了 应该是 133行
@steal[109]=[[[372],1],[],[],[]] #付丧神 刀子 铁块 1
原来的不知道哪里少了一个中括号,这种数列看着好晕啊……错了完全看不出来。
给自己提醒一定不能复制,记得一定要改过来

Lv5.捕梦者 (版主)

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

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

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

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

使用道具 举报

Lv5.捕梦者

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

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

有时间帮我把敌人的状态显示也做一下吧~
非常感谢~
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
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


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

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

还有一点原因是,如果没有处于'麻痹'或是'沉默'状态,正常下达指令后,角色行动前被先行动者加上负面效果,本轮是空过的。所以攻击、魔法是否生效不取决于是否下达指令,而是取决于行动时自己的状态。大概是基于这些原因,我觉得不需要在指令中禁用攻击和魔法。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35180
在线时间
4169 小时
注册时间
2007-12-15
帖子
10066
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 ="麻痹中"
这么写肯定不对- -
求正确写法,当角色处于麻痹状态并且选择攻击指令时,显示文字麻痹中,从而无法攻击。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
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
星屑
35180
在线时间
4169 小时
注册时间
2007-12-15
帖子
10066
12
 楼主| 发表于 2017-3-29 09:34:58 | 只看该作者
guoxiaomi 发表于 2017-3-28 23:58
修改了 7 楼的脚本。注意 11 行和 58~66 行的部分。

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

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

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

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
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
星屑
35180
在线时间
4169 小时
注册时间
2007-12-15
帖子
10066
10
 楼主| 发表于 2017-3-28 19:54:22 | 只看该作者
我接着画图标清状态,好多杂七杂八的状态,太乱了。
另外对状态上升下降同时中的情况有疑问,比个有攻击上升50%的 有攻击下降50%的 两个状态同时中了似乎是两个图标都显示,但是实际效果是不是就只有100%
如果是上升25%下降50%呢? 真的实际是-25%攻击效果吗?

点评

状态应该是乘法吧。试一下附加几个修改最大hp的状态看看?  发表于 2017-3-28 20:57
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-11 03:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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