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

Project1

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

[有事请教] 一个技能 对的人造成两次不同类型的伤害

[复制链接]

Lv1.梦旅人

梦石
0
星屑
237
在线时间
41 小时
注册时间
2022-8-28
帖子
12
跳转到指定楼层
1
发表于 2022-9-16 08:15:16 手机端发表。 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如题,希望这个技能对敌人造成生命伤害的同事也造成法力伤害 ,而且这两个伤害都和双方属性相关,分别使用不同的计算公式 而不是百分比或固定数值
有yep的一套核心插件
尝试过公共事件,但暂时没有找到技能发动者确认的方法
请大神解答,谢谢

Lv3.寻梦者

梦石
0
星屑
1606
在线时间
220 小时
注册时间
2022-2-3
帖子
160
2
发表于 2022-9-16 12:05:41 | 只看该作者
本帖最后由 apple5740 于 2022-9-16 12:11 编辑

https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

这两个帖子是否能提供帮助呢?
我的联系方式Q: 1127808900
欢迎一起讨论任何问题
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
237
在线时间
41 小时
注册时间
2022-8-28
帖子
12
3
 楼主| 发表于 2022-9-16 13:03:07 手机端发表。 | 只看该作者
apple5740 发表于 2022-9-16 12:05
https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

非常感谢哈
很有帮助,我几乎是小白,对于第二个链接中的,技能发动者  如何确认为 技能发动者,因为角色索引号好像只能对应唯一的角色,怎么能做到是同一个角色发动,不知道我表达清楚了没有,谢谢!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
237
在线时间
41 小时
注册时间
2022-8-28
帖子
12
4
 楼主| 发表于 2022-9-16 13:08:20 手机端发表。 | 只看该作者
apple5740 发表于 2022-9-16 12:05
https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

对于上一个使用的技能  以及 上一个技能释放者;我在公共事件中尝试过后者,但好像效果全部到了角色1那里
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1606
在线时间
220 小时
注册时间
2022-2-3
帖子
160
5
发表于 2022-9-16 13:31:05 | 只看该作者
本帖最后由 apple5740 于 2022-9-16 14:30 编辑
捕食者 发表于 2022-9-16 13:08
对于上一个使用的技能  以及 上一个技能释放者;我在公共事件中尝试过后者,但好像效果全部到了角色1那里 ...


因为我还没有学习到这个部分,也是小白了!
不过我参考第一个帖子的回答。
可以通过修改一个方法可能达到你需要的效果,具体思路是这样的,一起来学习把。
因为使用技能,相当于角色一个动作也就是action,那么我们可能需要修改action,当角色触发这个action时,同时做其他的事情。

代码复制
  1. var new_Game_Action_prototype_apply = Game_Action.prototype.apply;
  2. Game_Action.prototype.apply = function(target){
  3.     new_Game_Action_prototype_apply.call(this,target);
  4.     //如果是魔法技能,且技能id是2  则再造成一次伤害,这个条件可以按照你的需求更改
  5.     if(this.isMagicSkill() && this.item().id == 2){
  6.         //对目标再造成一次伤害 value 为伤害数值, 这个伤害数值,也可以按照你的需求进行导入公式,或者再强制执行一次技能
  7.         //看到楼下的提醒才知道, executeDamage 这个方法里面还有一个判断,。。抱歉如果要直接执行hp伤害的话就用下面的方法把。或者直接target.gainHp(-value);?
  8.         this.executeHpDamage(target, value);
  9.     }


//强制执行一次技能,参考第二个帖子,将  this.executeDamage(target, value);  这句改为下面的。
Game_Interpreter.prototype.command339([1,1,12,target]);

大概思路是制作一个插件,并重写 执行动作的方法,并将你的需求,加入到这个方法中。这是一个思路,可能会有很多问题,我并没有测试。。

最后
我在这个 Game_Action.prototype.apply 方法中 发现this.subject() 可能就是指技能发动者。
因为在  rmmz_object.js这个文件 中看到了下面的语句。。
/* 主体 */
Game_Action.prototype.subject = function() {
    if (this._subjectActorId > 0) {
        return $gameActors.actor(this._subjectActorId);
    } else {
        return $gameTroop.members()[this._subjectEnemyIndex];
    }
};

你的思路是寻找到技能发动者,让技能发动者再发动一次技能,我感觉也是可行的,总之有很多种解决问题的方式。但是这个思路,我之前也是这样想的,但我并没有参考资料。。所以不能做更多的回答了

点评

$gameTemp.setLastTargetActorId(target.actorId()); //目标对象的id 但我觉得没啥用 因为每次行动都会更新  发表于 2022-9-16 15:48
最后要加this.updateLastTarget(target);用来更新game_temp的最后一个目标,否则编辑器的上一个目标没有效果。还有一种方法就是改这个上一个目标的值。  发表于 2022-9-16 15:47
我以为法力伤害是魔法伤害 对MP伤害那没事了。  发表于 2022-9-16 15:36
我的联系方式Q: 1127808900
欢迎一起讨论任何问题
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
702
在线时间
326 小时
注册时间
2013-5-31
帖子
74
6
发表于 2022-9-16 14:07:22 | 只看该作者
本帖最后由 橙光 于 2022-9-16 14:24 编辑

技能发动实际上一个技能行动的模拟。
Game_Action的内容其实就是在对一次行动的模拟,在实例化的时候会指定一个行动主体,意为行动者,也就是技能的发动者,这个技能行动的.subject()就可以获取技能的行动者。如果玩家是技能行动的发起者,那么就是玩家,同理敌人。
然后是行动的setTarget(targetIndex)指定了在目标队列(Game_Troop/Game_Party)的序列编号。他是在makeTargets()的时候 作为作用单体目标的一个指引。你可以理解为单体目标行动的敌人编号。
最后是对这个行动设置是什么行动,就有四种行动setAttack(攻击行动) setSkills(skillId)技能行动 setGuard()防御行动 setItem(itemId)道具行动 实际上在MZ这些除了道具都整合为了技能行动。
也就是说当设置了一个Game_Action 并指定了上述的参数,通过对action的apply方法即可发动应用效果。
executeDamage() 是执行伤害效果的方法 主要内容包括对物理攻击还是魔法攻击判定补正的一系列内容,如果对数值的计算 也可以找makeDamageValue()方法。

最后由于对画面的视觉显示以及伤害文字的显示由sprite控制并非action直接控制,所以可能你还需要对Sprite_Damage和调用他的Sprite_Battler有所了解。
回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
702
在线时间
326 小时
注册时间
2013-5-31
帖子
74
7
发表于 2022-9-16 14:28:06 | 只看该作者
本帖最后由 橙光 于 2022-9-16 14:50 编辑
橙光 发表于 2022-9-16 14:07
技能发动实际上一个技能行动的模拟。
Game_Action的内容其实就是在对一次行动的模拟,在实例化的时候会指定 ...


楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。

你可以在同一个行动内直接扣除两次伤害,也可以做两次行动分别触发不同的技能。思路有很多,但每个思路都需要对Game_Action有一定基础了解。
想要获取到上个行动者 只需要在这次行动执行的时候 把行动者的索引(就是编辑器里面那个序号) 返回出去到游戏变量$gameVariables里或者某个可重复访问的变量也行。
比如在生成也好还是apply里加也好,$gameVariables.setValue(10,$gameParty.index(action.subject())) //action代表Game_Action实例对象 然后去指定这个变量存储的索引的角色就差不多了吧。
其实嫌麻烦 会点代码 也可以直接简略一点,直接代码控制。
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1606
在线时间
220 小时
注册时间
2022-2-3
帖子
160
8
发表于 2022-9-16 14:31:14 | 只看该作者
橙光 发表于 2022-9-16 14:28
楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。 ...

感谢,我也一起学习了!

点评

因为setSkill技能的时候 实际上数据库-技能里面就指定好了动画编号还有作用范围那些东西。只不过单体需要给个指定序号 就是我们选择敌人的那一步。  发表于 2022-9-16 14:40
其实不讲究sprite画面效果 直接随便New一个action就是,const a = new Game_Actiron($gameParty.mebbers()[0]) //发动者为括号内,然后set好那些,a.apply()就完事了。  发表于 2022-9-16 14:39
我的联系方式Q: 1127808900
欢迎一起讨论任何问题
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1606
在线时间
220 小时
注册时间
2022-2-3
帖子
160
9
发表于 2022-9-16 14:55:44 | 只看该作者
橙光 发表于 2022-9-16 14:28
楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。

你 ...

$gameVariables.setValue(10,$gameParty.index(action.subject()));
//action代表Game_Action实例对象
这个实例对象是存在于角色中的_actions[]那个数组里面的吗?

点评

会在某个时点清空 ,形成一种传统的回合制的流程。  发表于 2022-9-16 15:07
在不在里面都会生效,默认流程下是在那个_actions[]里面的 用来判断角色是否还有其他行动,比如强制行动啊 连续行动啊。  发表于 2022-9-16 15:06
我的联系方式Q: 1127808900
欢迎一起讨论任何问题
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
702
在线时间
326 小时
注册时间
2013-5-31
帖子
74
10
发表于 2022-9-16 15:08:34 | 只看该作者
apple5740 发表于 2022-9-16 14:55
$gameVariables.setValue(10,$gameParty.index(action.subject()));
//action代表Game_Action实例对象
这 ...


可以那么理解,他会遍历这个数组直到没有行动可以执行了,就进行下一阶段。原来rgss也是这流程。
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 10:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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