Project1

标题: 异常状态以小图标显示,同时显示N种 [打印本页]

作者: 89444640    时间: 2017-3-25 00:30
标题: 异常状态以小图标显示,同时显示N种
本帖最后由 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
原来的不知道哪里少了一个中括号,这种数列看着好晕啊……错了完全看不出来。
给自己提醒一定不能复制,记得一定要改过来

作者: 芯☆淡茹水    时间: 2017-3-25 08:47
本帖最后由 芯☆淡茹水 于 2017-3-25 08:48 编辑

用默认窗口这样显示,真的很别扭。
默认窗口减去32的边,再增加32XN的图标显示,看起来遮挡了快一半的战斗画面。
总之用默认窗口显示多状态,并且是32*32的图标,那个画面真的太美,除了循环显示图片还行。
平时没有状态时,你空出的至少两行64 加窗口边16,至少面积 128*80 的空白,那个会让人感觉莫名其妙。
最好自己画窗口显示,那样可以自由排版,比如下面这样:


  角色状态只显示当前行动的角色,那样就空出很多位置。而状态显示没有底框,没状态时就是空白。
上面只是例子,排版也可以自己设计。
作者: guoxiaomi    时间: 2017-3-25 11:50
即使是dota2这种buff满天飞的游戏,在界面改版前,还是只能显示16个状态图标,多余的直接不显示。但是通常8-9个也是够用了。
用24*24的小icon,一行放6个,在我方状态窗口上方,或者战斗图下方显示48*144的两行,似乎也不算挤。
对于图标,可以考虑仿dota2的设计,状态图标和技能图标一致,但是用绿色和红色勾边分别表示有益/有害buff。这样玩家也不需要强记buff的意思了,因为跟技能图标一样,一看就知道是对应技能带来的效果。

作者: 89444640    时间: 2017-3-25 21:24
本帖最后由 89444640 于 2017-3-25 22:13 编辑
芯☆淡茹水 发表于 2017-3-25 08:47
用默认窗口这样显示,真的很别扭。
默认窗口减去32的边,再增加32XN的图标显示,看起来遮挡了快一半的战斗 ...


但是这样的话,会出现一个问题,无法群体观测角色状态,必须直观的观测到所有角色的状态才好下达指令。
需要做成这样的话,最好是当某个角色行动时候,其他角色的状态栏隐藏,该行动角色所有状态显示,
但是不能超过底下的32*5,因为有全屏动画在,底下的32*5菜单栏是不能动的了
敌人状态那里……如果以图示这么排列的话,应该会不错。但是头像就别显示了- -敌人太多画不起……只显示名字 hp mp 状态 两排

状态单独列出一排菜单,如果没中状态不显示,中了以后显示,32*8长,状态多余8个不显示。
正常两个字取消以后,以循环方式显示,用三个正好
红色很好理解 属性提升
绿色属性下降 各种异常
黄色是特殊状态,比如什么时空静止啦 魔法反射啦之类的。战斗不能也放在黄色位置,因为正好在中间。

敌人也可以 跟角色一样用红绿灯,做状态循环显示、但是不如显示8个的直观。

作者: guoxiaomi    时间: 2017-3-26 01:13
89444640 发表于 2017-3-25 21:24
但是这样的话,会出现一个问题,无法群体观测角色状态,必须直观的观测到所有角色的状态才好下达指令。
...

首先……我是不太赞成用滚动的方法来显示状态……可能是个人习惯?

32x32的图标下面的状态栏最多能显示4个,如果多了的话,是不是可以像扑克牌那样叠起来,这样就算是8个状态,每个也能显示一半左右,玩家是能分辨出来到底上了什么状态。如果是5-6个状态,遮挡个20%左右是完全不影响的。此外,真正8个状态全上的时候,玩家一般也不care具体都是哪些状态吧。等到选中此角色时,再把状态图标全部展开。比如显示在状态窗口(下面的蓝色窗口)的上方。

作者: 89444640    时间: 2017-3-26 08:38
本帖最后由 89444640 于 2017-3-26 09:02 编辑
guoxiaomi 发表于 2017-3-26 01:13
首先……我是不太赞成用滚动的方法来显示状态……可能是个人习惯?

32x32的图标下面的状态栏最多能显示4 ...


没错--b确实是个人习惯……
不过还是分析一下,
两种显示方式的利弊

红绿灯滚动显示,穿透性强辨识度高。
感觉上滚动显示节约空间又规矩,显示三个是比较合适的选择,

强化、正面状态左侧红色边框,
弱化、异常右侧绿色边框,
特殊状态中间的黄色边框,反正边框也是图标画的,死亡用黑色或者白色就好

这个跟游戏战斗设置思路可能也有关,
平时困难些的杂鱼战,己方4人出战并且有相关技能的的情况下 第一回合 辅助系上来加攻击或者魔攻或者其他,有偷盗系技能的角色偷窃,魔法师防御或者输出,战弓特殊类角色随意。
敌方第一回合出手,敌方尽量不要设置有N个异常状态的,详情请见轨迹系列,空轨1 最明显,敌人分区域会有几种异常状态攻击,装备对应饰品可以避免。战斗不太难的情况下,敌方尽量不能超过3个,否则群殴法师实在够呛,具体案例请见空轨1 的跳跳猫宝箱,6只怪对己方两人,有几率眩晕攻击,初期教很多玩家学做人。
因此己方未准备的情况下,中异常状态的最大可能性是1~2种,强化状态1种
2个异常滚动显示就可以接受,
而且杂鱼战,正常游戏情况下,很少有人把所有状态加全了。
如果是异常攻击为主的boss,这个难打是自然的,需要记忆他可能会有的几种异常攻击手段也是肯定的,而且有的双boss我还设置了歼灭顺序,先歼灭A再歼灭B,先灭B,A爆种给你来个boss濒死全屏大魔法团灭。再说boss让你一次就打过去就不对了嘛~必须得教你学做人几次才行。

继续分析叠加的情况,这是目前菜单,就是xp默认的方式
实在是菜单之类的我一直改不了,就一直用默认的,看了这么多年也习惯了。

n种异常状态显示在哪里合适呢?
还有啊,我觉得最好能直观的观看所有角色的状态变化,才容易下达指令,因为xp默认模式而且是回合制,不能切换执行指令的角色,只能按照角色1~4执行命令,这样比如只有角色4中了异常状态,我还需要角色1~3选择攻击,才能查看角色4的状态,
然后取消回到己方有解除该状态的角色下达指令,
如果是角色34中了还得瞬时记忆,如果用此种方式,还需要制作能在战斗中随时切换角色下达命令的脚本,就是执行命令时候,可以任意选择号角色,当所有角色指令下达完毕后,再执行命令。

而遮挡一半照着我这图标的诡异设置方式,应该是看不出来是中了哪个- -b

好处嘛~视觉效果如果做出来,比如把异常状态做成扑克的样子,作出一个旋转,这个我能做出来,在选定角色时候卡牌旋转并且呈现扇形摊开状态显示出来,但是有弧度的话……城市需估计麻烦,而且像素类的卡牌,旋转会失真,最好是旋转直着摊开,但是可能会有如下难题
中的状态是不确定的,因此要设置至少N中卡牌摊开的方式,中一种 两种 三种 N种类的摊开方式头不一样,而且如果这样,应该也把正面 负面 特殊三种情况分出来,正面一般就不管了,负面玩家肯定会看看影响程度决定师傅解除,特殊的作为特别强化手段,让玩家更直观的理解。
比如双攻、反击之类的。



印象中,传说系列是需要看游戏里面的战斗系统说明说明书记状态的,缺点是每作要上手需要很久。另外这个是自己感觉,玩个游戏连系统设置都不想记的玩家不要也罢。我又没做给别人玩XD,还是按照自己觉得合适的做吧~好吗~

而且制作个状态说明的说明书放到剧情分类系统的道具里面,也感觉很不错啊~我用不了脚本能,之鞥用道具、公用事件、显示图片的方式来显示。但是感觉上应该还可以。

另外,还有个升级和平时正常的状态显示,默认是用文字显示的,如果修改了状态显示方式,这两个也最好以对应的图标显示,否则会显得最下面那排缺点什么东西,
正常做个 —_— 或者( ^_^ )类的图标吧~
level up 换成中文显示的“升级”两个字的图标,每次看level up我都觉得蛋疼,显示中文吧。
作者: guoxiaomi    时间: 2017-3-27 23:04
本帖最后由 guoxiaomi 于 2017-3-29 00:25 编辑
89444640 发表于 2017-3-26 08:38
没错--b确实是个人习惯……
不过还是分析一下,
两种显示方式的利弊


RUBY 代码复制
  1. # 三个分组对应三个不同的位置
  2. STATE_GROUP_1 = [2]
  3. STATE_GROUP_2 = [3,4,5,6]
  4. STATE_GROUP_3 = []
  5. # 刷新时间
  6. STATE_REFRESH_TIME = 40
  7.  
  8. class Window_BattleStatus < Window_Base
  9.   def draw_actor_state(actor, x, y)   
  10.     # 清除所有图标
  11.     self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
  12.  
  13.     # 第 1 组
  14.     state_group1 = STATE_GROUP_1 & actor.states
  15.     if !state_group1.empty?
  16.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
  17.       state = state_group1[show_id]
  18.       # 绘制图标      
  19.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  20.       self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  21.     end
  22.  
  23.     # 第 2 组
  24.     state_group2 = STATE_GROUP_2 & actor.states
  25.     if !state_group2.empty?
  26.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
  27.       state = state_group2[show_id]
  28.       # 绘制图标
  29.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  30.       self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  31.     end
  32.  
  33.     # 第 3 组
  34.     state_group3 = STATE_GROUP_3 & actor.states
  35.     if !state_group3.empty?
  36.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
  37.       state = state_group3[show_id]
  38.       # 绘制图标      
  39.       bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
  40.       self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
  41.     end
  42.  
  43.     # 不显示状态时显示一段文字
  44.     if state_group1.empty? && state_group2.empty? && state_group3.empty?
  45.       # 显示文字
  46.       self.contents.font.color = normal_color
  47.       self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
  48.     end
  49.   end  
  50.  
  51.   alias _SHOW_STATE_ICON_update update
  52.   def update
  53.     # 继续之前的 update
  54.     _SHOW_STATE_ICON_update
  55.  
  56.     # 每 40 帧绘制 1 次状态图标
  57.     if Graphics.frame_count % STATE_REFRESH_TIME == 1
  58.       for i in 0...$game_party.actors.size
  59.         actor = $game_party.actors[i]
  60.         actor_x = i * 160 + 4      
  61.         if !@level_up_flags[i]         
  62.           draw_actor_state(actor, actor_x, 96)
  63.         end
  64.       end
  65.     end
  66.  
  67.   end  
  68. end


这是角色的状态,代码插到Main前就行,在你给的测试工程里通过了,每帧都会绘制,反正我的电脑上不卡。
1. 修改 17 27 37 行的参数可以微调位置。
2. 在STATE_GROUP_1~3里填上在这个位置显示的状态ID
3. 状态图标在Icon文件夹,15号状态文件名就是“状态15.png”

这三组代码几乎是一模一样的,嗯。因为真的是很简单的几句话。

敌人的状态,暂时不知道你准备怎么安排。

也可以做更多的展示,比如用透明度或者“半透明部分高度”来显示还剩多少回合……代码里暂时没写这个功能。

总之,绘制文字和Icon图块的方法已经写在代码里了,复制粘贴即可。



升级提示,全局搜索'LEVEL UP!'就知道了,在Window_BattleStatus的第 44 行,把'LEVEL UP!'改成别的字符串就行。
作者: 89444640    时间: 2017-3-28 11:52
guoxiaomi 发表于 2017-3-27 23:04
# 三个分组对应三个不同的位置
STATE_GROUP_1 = [2,3]
STATE_GROUP_2 = [4]



用这几个图标试一下吧,我试了,状态03中毒,放在第三组结果说找不到结果说找不到文件

RUBY 代码复制
  1. #修改 20 30 40 行的参数可以微调位置。
  2. #在STATE_GROUP_1~3里填上在这个位置显示的状态ID
  3. #状态图标在Icon文件夹,15号状态文件名就是“状态15.png
  4. # 三个分组对应三个不同的位置 作者66rpg guoxiaomi
  5. STATE_GROUP_1 = [2,]
  6. STATE_GROUP_2 = [1,]
  7. STATE_GROUP_3 = [3,]
  8. # 刷新时间
  9. STATE_REFRESH_TIME = 40
  10.  
  11. class Window_BattleStatus < Window_Base
  12.   def draw_actor_state(actor, x, y)
  13.     # 第 1 组
  14.     state_group1 = STATE_GROUP_1 & actor.states
  15.     if !state_group1.empty?
  16.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
  17.       state = state_group1[show_id]
  18.       # 绘制图标
  19.       bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
  20.       self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), 255)
  21.     end
  22.  
  23.     # 第 2 组
  24.     state_group2 = STATE_GROUP_2 & actor.states
  25.     if !state_group2.empty?
  26.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
  27.       state = state_group2[show_id]
  28.       # 绘制图标
  29.       bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
  30.       self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), 255)
  31.     end
  32.  
  33.     # 第 3 组
  34.     state_group3 = STATE_GROUP_3 & actor.states
  35.     if !state_group3.empty?
  36.       show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
  37.       state = state_group3[show_id]
  38.       # 绘制图标
  39.       bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
  40.       self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), 255)
  41.     end
  42.  
  43.     # 不显示状态时显示一段文字
  44.     if state_group1.empty? && state_group2.empty? && state_group3.empty?
  45.       # 显示文字
  46.       self.contents.font.color = normal_color
  47.       self.contents.draw_text(x, y, 120, 32, "     (^-^)")      
  48.     end
  49.   end
  50.  
  51.   alias _SHOW_STATE_ICON_update update
  52.   def update
  53.     _SHOW_STATE_ICON_update
  54.     refresh
  55.   end  
  56. end

作者: 夜狠简单    时间: 2017-3-28 12:05
本帖最后由 夜狠简单 于 2017-3-28 12:06 编辑
89444640 发表于 2017-3-28 11:52
用这几个图标试一下吧,我试了,状态03中毒,放在第三组结果说找不到结果说找不到文件

#修改 20 30 40  ...


RUBY 代码复制
  1. Dir["Graphics/Icons/*.png"].each{|i|
  2. @name_bitmap=$& if File.basename(i)[/状态[0]*#{$data_states[state].id}/]}
  3.   bitmap = RPG::Cache.icon(@name_bitmap)


可以匹配  状态003.png  状态03.png  状态3.png   状态0100.png
作者: 89444640    时间: 2017-3-28 19:54
我接着画图标清状态,好多杂七杂八的状态,太乱了。
另外对状态上升下降同时中的情况有疑问,比个有攻击上升50%的 有攻击下降50%的 两个状态同时中了似乎是两个图标都显示,但是实际效果是不是就只有100%
如果是上升25%下降50%呢? 真的实际是-25%攻击效果吗?
作者: guoxiaomi    时间: 2017-3-28 23:58
本帖最后由 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。
作者: 89444640    时间: 2017-3-29 09:34
guoxiaomi 发表于 2017-3-28 23:58
修改了 7 楼的脚本。注意 11 行和 58~66 行的部分。

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

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

还有个和这个有关的事情,麻痹效果一般都是不能使用普通攻击,可以使用魔法,
但是默认选项里面没有这个,能想个办法吗?
作者: guoxiaomi    时间: 2017-3-29 09:52
本帖最后由 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

作者: 89444640    时间: 2017-3-29 21:54
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 ="麻痹中"
这么写肯定不对- -
求正确写法,当角色处于麻痹状态并且选择攻击指令时,显示文字麻痹中,从而无法攻击。

作者: guoxiaomi    时间: 2017-3-29 23:15
本帖最后由 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


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

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

还有一点原因是,如果没有处于'麻痹'或是'沉默'状态,正常下达指令后,角色行动前被先行动者加上负面效果,本轮是空过的。所以攻击、魔法是否生效不取决于是否下达指令,而是取决于行动时自己的状态。大概是基于这些原因,我觉得不需要在指令中禁用攻击和魔法。
作者: 89444640    时间: 2017-3-30 15:06
guoxiaomi 发表于 2017-3-29 23:15
首先脚本里要再添加 attr_reader
attr_reader   :help_window[/pre]

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

有时间帮我把敌人的状态显示也做一下吧~
非常感谢~
作者: guoxiaomi    时间: 2017-3-30 20:22
本帖最后由 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

作者: 89444640    时间: 2017-3-31 08:41
guoxiaomi 发表于 2017-3-30 20:22
看到你使用了 '战斗时敌HP、MP显示' 脚本,所以这样写的……

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

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

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




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