Project1

标题: 如何实现战斗中在血量下降到一定程度后跳出指定文字 [打印本页]

作者: letppigogo    时间: 2017-2-23 12:26
标题: 如何实现战斗中在血量下降到一定程度后跳出指定文字
本帖最后由 letppigogo 于 2017-2-23 23:02 编辑

如题,在战斗中角色血量下降到一定程度后在伤害数字跳完后,马上在该角色头上跳出指定文字,或者是图片什么的,也可以播放指定的动画。
作者: axicc    时间: 2017-2-23 15:06
可以在敌群
作者: letppigogo    时间: 2017-2-23 17:50
axicc 发表于 2017-2-23 15:06
可以在敌群

能具体的说一下吗?不是很明白
作者: letppigogo    时间: 2017-2-23 23:52
本帖最后由 letppigogo 于 2017-2-23 23:56 编辑
axicc 发表于 2017-2-23 15:06
可以在敌群


我想我知道你的意思了,在小怪的队伍里可以设置事件。但还是无法满足我的要求,因为我要跳出文字或者触发状态的条件不止只有血量,还和角色能力有关系。比如力量500以上的角色在血量低于30%会触发动画,或者弹出个类似"MISS"那样的其他文字。而力量500以下的就不会。同时力量500以上的在血量回复到30%以上后再次跌倒30%以下时该状态或者文字又会跳出。
类似于给能力高的角色包括敌人一个隐藏能力的触发提示。告诉玩家,该角色或者敌人已经触发了隐藏能力了。
作者: guoxiaomi    时间: 2017-2-24 01:23
敌人队伍里的事件有“即时触发”的选项,在这里面用条件分歧
作者: letppigogo    时间: 2017-2-24 08:14
本帖最后由 letppigogo 于 2017-2-24 10:09 编辑
guoxiaomi 发表于 2017-2-24 01:23
敌人队伍里的事件有“即时触发”的选项,在这里面用条件分歧


事件我知道怎么做,因为我的角色能力会有变动,而且有很多角色,这样每个敌人队伍里都要建一堆事件,而且要大量的变量带入,这样太繁琐了。
就像图片里这样,经过实测战斗中无法触发动画,只能触发对话框,而且对话框不能重复触发。只能触发一次。

作者: letppigogo    时间: 2017-2-24 11:09
本帖最后由 letppigogo 于 2017-2-24 11:52 编辑
letppigogo 发表于 2017-2-24 08:14
事件我知道怎么做,因为我的角色能力会有变动,而且有很多角色,这样每个敌人队伍里都要建一堆事件,而且 ...


不能在脚本里增加一段代码吗?还有就是刚刚实测了一下,没法制定角色显示动画。只能按照顺位, 而我的游戏中队列顺位是可以随意调整的,这样角色显示动画无法实现。
作者: guoxiaomi    时间: 2017-2-25 00:49
本帖最后由 guoxiaomi 于 2017-2-25 09:42 编辑

我大概知道问题出现在哪里了。

战斗中没有“并行处理”的事件

一个方法是直接修改 Scene_Battle#update方法。

RUBY 代码复制
  1. class Scene_Battle
  2.   alias _old_update update
  3.   def update
  4.     # 并行处理的代码
  5.     actor = $game_actors[1]
  6.     if actor.hp <= 0.3 * actor.maxhp
  7.       if $game_switches[1] == false
  8.           $game_switches[1] = true
  9.           actor.animation_id = 1 if actor.str >= 500
  10.       end
  11.     else
  12.         $game_switches[1] = false
  13.     end
  14.     # 继续更新
  15.     _old_update
  16.   end
  17. end


这里需要 1 个开关来判断血量。

如同上面的逻辑,开关 1 标志着角色 1 的血量是否低于30%,但只有开关 1 从 关闭 到 打开 时,才会设置角色1的动画为 1 号。



但是试一下,就知道,动画会在显示伤害数字前。这是因为RMXP的坑爹逻辑,在显示伤害数字前,角色的血量已经给扣了,只是没有刷新画面。

如何解决?

并行处理的代码,放在显示伤害数字之后。update_phase4_step6 是 Scene_Battle 4 的最后一个方法,很容易找到,在这里照着上面抄一段。
以后每次到达 phase4_step6,都会执行 2 号公共事件
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 刷新画面 (主回合步骤 6 : 刷新)
  3.   #--------------------------------------------------------------------------
  4.   def update_phase4_step6
  5.     # 清除强制行动对像的战斗者
  6.     $game_temp.forcing_battler = nil
  7.     # 公共事件 ID 有效的情况下
  8.     if @common_event_id > 0
  9.       # 设置事件
  10.       common_event = $data_common_events[@common_event_id]
  11.       $game_system.battle_interpreter.setup(common_event.list, 0)
  12.     end
  13.     # 移至步骤 1
  14.     @phase4_step = 1
  15.     # 显示伤害结束后、物品技能公共事件结束后,再次执行 2 号公共事件
  16.     @common_event_id = 2
  17.     common_event = $data_common_events[@common_event_id]
  18.     $game_system.battle_interpreter.setup(common_event.list, 0)
  19.   end


2 号公共事件里把刚才的代码粘贴到事件脚本里。
RUBY 代码复制
  1. actor = $game_actors[1] # 判断 1 号角色
  2. if actor.hp <= 0.3 * actor.maxhp # 血量减少到 30 % 以下触发
  3.   if $game_switches[1] == false # 占用 1 号全局开关
  4.     $game_switches[1] = true
  5.     actor.animation_id = 1  if actor.str >= 500# 对应角色力量大于 500,播放动画 ID 为 1
  6.   end
  7. else
  8.     $game_switches[1] = false
  9. end


可以照着这个多写一些。因为这里是公共事件,显示文章,图片什么的可以正常执行。
比如,在此脚本前令变量 1 为 0。
  1. $game_variables[1] = 0 # 角色 ID
复制代码

然后:
  1. actor.animation_id = 1
复制代码

改成  :
  1. $game_variables[1] = 1 # 角色 ID
复制代码

然后在后面条件分歧变量1的值,为 1 的话,就对 1 号角色执行判断属性、显示动画等操作。如果有文字加强脚本,还可以显示对话框。

奇葩方案





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