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 编辑
但是这样的话,会出现一个问题,无法群体观测角色状态,必须直观的观测到所有角色的状态才好下达指令。
需要做成这样的话,最好是当某个角色行动时候,其他角色的状态栏隐藏,该行动角色所有状态显示,
但是不能超过底下的32*5,因为有全屏动画在,底下的32*5菜单栏是不能动的了
敌人状态那里……如果以图示这么排列的话,应该会不错。但是头像就别显示了- -敌人太多画不起……只显示名字 hp mp 状态 两排
状态单独列出一排菜单,如果没中状态不显示,中了以后显示,32*8长,状态多余8个不显示。
正常两个字取消以后,以循环方式显示,用三个正好
红色很好理解 属性提升
绿色属性下降 各种异常
黄色是特殊状态,比如什么时空静止啦 魔法反射啦之类的。战斗不能也放在黄色位置,因为正好在中间。
敌人也可以 跟角色一样用红绿灯,做状态循环显示、但是不如显示8个的直观。
作者: guoxiaomi 时间: 2017-3-26 01:13
首先……我是不太赞成用滚动的方法来显示状态……可能是个人习惯?
32x32的图标下面的状态栏最多能显示4个,如果多了的话,是不是可以像扑克牌那样叠起来,这样就算是8个状态,每个也能显示一半左右,玩家是能分辨出来到底上了什么状态。如果是5-6个状态,遮挡个20%左右是完全不影响的。此外,真正8个状态全上的时候,玩家一般也不care具体都是哪些状态吧。等到选中此角色时,再把状态图标全部展开。比如显示在状态窗口(下面的蓝色窗口)的上方。
作者: 89444640 时间: 2017-3-26 08:38
本帖最后由 89444640 于 2017-3-26 09:02 编辑
没错--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 编辑
# 三个分组对应三个不同的位置
STATE_GROUP_1 = [2]
STATE_GROUP_2 = [3,4,5,6]
STATE_GROUP_3 = []
# 刷新时间
STATE_REFRESH_TIME = 40
class Window_BattleStatus < Window_Base
def draw_actor_state(actor, x, y)
# 清除所有图标
self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
end
end
alias _SHOW_STATE_ICON_update update
def update
# 继续之前的 update
_SHOW_STATE_ICON_update
# 每 40 帧绘制 1 次状态图标
if Graphics.frame_count % STATE_REFRESH_TIME == 1
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
actor_x = i * 160 + 4
if !@level_up_flags[i]
draw_actor_state(actor, actor_x, 96)
end
end
end
end
end
# 三个分组对应三个不同的位置
STATE_GROUP_1 = [2]
STATE_GROUP_2 = [3,4,5,6]
STATE_GROUP_3 = []
# 刷新时间
STATE_REFRESH_TIME = 40
class Window_BattleStatus < Window_Base
def draw_actor_state(actor, x, y)
# 清除所有图标
self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
end
end
alias _SHOW_STATE_ICON_update update
def update
# 继续之前的 update
_SHOW_STATE_ICON_update
# 每 40 帧绘制 1 次状态图标
if Graphics.frame_count % STATE_REFRESH_TIME == 1
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
actor_x = i * 160 + 4
if !@level_up_flags[i]
draw_actor_state(actor, actor_x, 96)
end
end
end
end
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
用这几个图标试一下吧,我试了,状态03中毒,放在第三组结果说找不到结果说找不到文件
#修改 20 30 40 行的参数可以微调位置。
#在STATE_GROUP_1~3里填上在这个位置显示的状态ID
#状态图标在Icon文件夹,15号状态文件名就是“状态15.png
# 三个分组对应三个不同的位置 作者66rpg guoxiaomi
STATE_GROUP_1 = [2,]
STATE_GROUP_2 = [1,]
STATE_GROUP_3 = [3,]
# 刷新时间
STATE_REFRESH_TIME = 40
class Window_BattleStatus < Window_Base
def draw_actor_state(actor, x, y)
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, " (^-^)")
end
end
alias _SHOW_STATE_ICON_update update
def update
_SHOW_STATE_ICON_update
refresh
end
end
#修改 20 30 40 行的参数可以微调位置。
#在STATE_GROUP_1~3里填上在这个位置显示的状态ID
#状态图标在Icon文件夹,15号状态文件名就是“状态15.png
# 三个分组对应三个不同的位置 作者66rpg guoxiaomi
STATE_GROUP_1 = [2,]
STATE_GROUP_2 = [1,]
STATE_GROUP_3 = [3,]
# 刷新时间
STATE_REFRESH_TIME = 40
class Window_BattleStatus < Window_Base
def draw_actor_state(actor, x, y)
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, " (^-^)")
end
end
alias _SHOW_STATE_ICON_update update
def update
_SHOW_STATE_ICON_update
refresh
end
end
作者: 夜狠简单 时间: 2017-3-28 12:05
本帖最后由 夜狠简单 于 2017-3-28 12:06 编辑
Dir["Graphics/Icons/*.png"].each{|i|
@name_bitmap=$& if File.basename(i)[/状态[0]*#{$data_states[state].id}/]}
bitmap = RPG::Cache.icon(@name_bitmap)
Dir["Graphics/Icons/*.png"].each{|i|
@name_bitmap=$& if File.basename(i)[/状态[0]*#{$data_states[state].id}/]}
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 编辑
修改了 7 楼的脚本。注意 11 行和 58~66 行的部分。
这个是防卡,并且不会实时刷新HP/SP。
但是状态图标是每 40 帧刷新的(半实时),由于技能生效在在动画播放前,状态图标会在动画播放的时候发生更新。个人感觉影响不大,暂时就这么做了。
此外,我发现我的那个全图动画的脚本和上面 fux2 写的最后一击者播放胜利动画冲突了。全图动画脚本放在后面是正确的,要兼容 fux2 的脚本的话需要修改第 112 行
为
如果没有发现冲突,就不用管了……
还是没有懂敌人的状态图标要怎么摆放,要顺次排列,还是要循环呢?
又想到了一件事是,其实这段脚本就是在 Window_BattleStatus 里绘制图标,其实不一定要附加了状态才需要绘制,可以直接判断角色的攻击力、防御力是否下降,然后绘制对应的图标。
比如可以这样写:
原脚本 14 行后面添加:
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
# 攻击力下降时,添加 '状态25' 图标到第一组
state_group1.push 25 if actor.atk < actor.base_atk
# --
if !state_group1.empty?
...
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
# 攻击力下降时,添加 '状态25' 图标到第一组
state_group1.push 25 if actor.atk < actor.base_atk
# --
if !state_group1.empty?
...
这样在角色的攻击力下降时,会在第一组循环的图标里增加 '状态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-29 09:52
本帖最后由 guoxiaomi 于 2017-3-29 17:22 编辑
虽然我会管这个叫“缴械”……倒是没有什么困难的地方……
具体实现是这样:
1. 在行动时仍处于“麻痹”状态,攻击会无效
2. 禁用攻击指令(建议不这么做)
问题是:
如果能在给处于“麻痹”的角色下达攻击指令,并选择目标。那么角色可能会被快速行动的队友解除状态,这样不至于用防守空过一轮。
方法在这里的 1 楼:
https://rpg.blue/forum.php?mod=viewthread&tid=399295
在行动前的公共事件里插入脚本,判断角色是否有状态 25 ,有的话就清除行动,播放25号动画,并等待25帧(等待动画结束):
@battler = $scene.active_battler
a = @battler.current_action
if a.kind == 0 && a.basic == 0
if @battler.state?(25)
a.clear
@battler.animation_id = 25
@wait_count = 25
end
end
@battler = $scene.active_battler
a = @battler.current_action
if a.kind == 0 && a.basic == 0
if @battler.state?(25)
a.clear
@battler.animation_id = 25
@wait_count = 25
end
end
作者: 89444640 时间: 2017-3-29 21:54
很好奇,为何禁用攻击不建议呢?
试了一下效果有了,选择攻击不行动,只显示动画,选择特技和魔法依然可以攻击。
然后这个命令后执行公用事件脚本中的
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 编辑
首先脚本里要再添加 attr_reader
然后事件脚本里这么写:
@battler = $scene.active_battler
a = @battler.current_action
if a.kind == 0 && a.basic == 0
if @battler.state?(25)
a.clear
$scene.help_window.set_text('麻痹中', 1)
$scene.help_window.visible = true
end
end
@battler = $scene.active_battler
a = @battler.current_action
if a.kind == 0 && a.basic == 0
if @battler.state?(25)
a.clear
$scene.help_window.set_text('麻痹中', 1)
$scene.help_window.visible = true
end
end
禁用攻击不建议的原因是,实现起来麻烦啊~(并不)
而且我觉得禁用指令本身也没有太多意义吧,我甚至都想把沉默不能下达魔法指令改成可以正常下达,只是行动时仍然被沉默就无效。
还有一点原因是,如果没有处于'麻痹'或是'沉默'状态,正常下达指令后,角色行动前被先行动者加上负面效果,本轮是空过的。所以攻击、魔法是否生效不取决于是否下达指令,而是取决于行动时自己的状态。大概是基于这些原因,我觉得不需要在指令中禁用攻击和魔法。
作者: 89444640 时间: 2017-3-30 15:06
最后还是选择用动画显示了,感觉很欢乐的样子XD
有时间帮我把敌人的状态显示也做一下吧~
非常感谢~
作者: guoxiaomi 时间: 2017-3-30 20:22
本帖最后由 guoxiaomi 于 2017-3-30 20:23 编辑
看到你使用了 '战斗时敌HP、MP显示' 脚本,所以这样写的……
以及物品/技能以友方单体为目标的时候,如果想跟跟敌人一样显示状态的话,要把 ENABLE_TO_ACTOR 设置为 true。如果没有Help_Window,就设置为 false。
微调位置在第 99,104,110 行
#==============================================================================
# ■ 常量定义
#==============================================================================
module SHOW_STATE_ICON
# 下方角色窗口绘制
# 三个分组对应三个不同的位置
STATE_GROUP_1 = [2]
STATE_GROUP_2 = [3,4,5,6]
STATE_GROUP_3 = []
STATE_REFRESH_TIME = 40 # 刷新时间(帧)
# 上方敌人/角色窗口绘制
STATE_GROUP_4 = [1,2,3,4,5,6,7,8] # 允许显示的状态
MAX_STATES = 5 # 最多绘制的图标数
ENABLE_TO_ACTOR = true # true 对角色也生效,false 只对敌人生效
end
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
# 常量
include SHOW_STATE_ICON
def draw_actor_state(actor, x, y)
# 清除所有图标
self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
end
end
alias _SHOW_STATE_ICON_update update
def update
# 继续之前的 update
_SHOW_STATE_ICON_update
# 每 40 帧绘制 1 次状态图标
if Graphics.frame_count % STATE_REFRESH_TIME == 1
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
actor_x = i * 160 + 4
if !@level_up_flags[i]
draw_actor_state(actor, actor_x, 96)
end
end
end
end
end
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
# 追加定义的内容,可以显示角色和敌人的状态图标
# * 需要配合 '战斗时敌HP、MP显示' 脚本使用
#==============================================================================
class Window_Help < Window_Base
# 常量
include SHOW_STATE_ICON
def draw_actor_state(actor, x, y)
# 使用之前的绘制
if !actor.is_a?(Game_Enemy) && !ENABLE_TO_ACTOR
super
else
# x 偏移量,可以修改下面的 40
x = x - 40
# 绘制状态图标,最多 MAX_STATES 个
state_group4 = (STATE_GROUP_4 & actor.states).sort[0, MAX_STATES]
state_group4.each_index do |i|
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state_group4[i]))
self.contents.blt(x + i * 34, y, bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 正常的情况下
if state_group4.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 240, 32, "o(* ̄▽ ̄*)ブ")
end
end
end
end
#==============================================================================
# ■ 常量定义
#==============================================================================
module SHOW_STATE_ICON
# 下方角色窗口绘制
# 三个分组对应三个不同的位置
STATE_GROUP_1 = [2]
STATE_GROUP_2 = [3,4,5,6]
STATE_GROUP_3 = []
STATE_REFRESH_TIME = 40 # 刷新时间(帧)
# 上方敌人/角色窗口绘制
STATE_GROUP_4 = [1,2,3,4,5,6,7,8] # 允许显示的状态
MAX_STATES = 5 # 最多绘制的图标数
ENABLE_TO_ACTOR = true # true 对角色也生效,false 只对敌人生效
end
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
# 常量
include SHOW_STATE_ICON
def draw_actor_state(actor, x, y)
# 清除所有图标
self.contents.fill_rect(x, y, 120, 32, Color.new(0,0,0,0))
# 第 1 组
state_group1 = STATE_GROUP_1 & actor.states
if !state_group1.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group1.size
state = state_group1[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 2 组
state_group2 = STATE_GROUP_2 & actor.states
if !state_group2.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group2.size
state = state_group2[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 34, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 第 3 组
state_group3 = STATE_GROUP_3 & actor.states
if !state_group3.empty?
show_id = Graphics.frame_count / STATE_REFRESH_TIME % state_group3.size
state = state_group3[show_id]
# 绘制图标
bitmap = RPG::Cache.icon(sprintf("状态%02d", state))
self.contents.blt(x + 8 + 68, y , bitmap, Rect.new(0, 0, 32, 32), opacity)
end
# 不显示状态时显示一段文字
if state_group1.empty? && state_group2.empty? && state_group3.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, "o(* ̄▽ ̄*)ブ")
end
end
alias _SHOW_STATE_ICON_update update
def update
# 继续之前的 update
_SHOW_STATE_ICON_update
# 每 40 帧绘制 1 次状态图标
if Graphics.frame_count % STATE_REFRESH_TIME == 1
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
actor_x = i * 160 + 4
if !@level_up_flags[i]
draw_actor_state(actor, actor_x, 96)
end
end
end
end
end
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
# 追加定义的内容,可以显示角色和敌人的状态图标
# * 需要配合 '战斗时敌HP、MP显示' 脚本使用
#==============================================================================
class Window_Help < Window_Base
# 常量
include SHOW_STATE_ICON
def draw_actor_state(actor, x, y)
# 使用之前的绘制
if !actor.is_a?(Game_Enemy) && !ENABLE_TO_ACTOR
super
else
# x 偏移量,可以修改下面的 40
x = x - 40
# 绘制状态图标,最多 MAX_STATES 个
state_group4 = (STATE_GROUP_4 & actor.states).sort[0, MAX_STATES]
state_group4.each_index do |i|
bitmap = RPG::Cache.icon(sprintf("状态%02d.png", state_group4[i]))
self.contents.blt(x + i * 34, y, bitmap, Rect.new(0, 0, 32, 32), 255)
end
# 正常的情况下
if state_group4.empty?
# 显示文字
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 240, 32, "o(* ̄▽ ̄*)ブ")
end
end
end
end
作者: 89444640 时间: 2017-3-31 08:41
非常感谢~反馈一下使用效果。
菜单是我看习惯了的~真好~
不蛋疼的情况下,对敌人攻击通常会有选择性的发动对己方特别有利的状态,所以五个足够了。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |