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

Project1

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

[有事请教] 如何做到让跟在主角后面的队友去攻击接近的敌人.ABS模式

[复制链接]
回帖奖励 390 星屑 回复本帖可获得 10 星屑奖励! 每人限 1 次

Lv4.逐梦者

梦石
0
星屑
7335
在线时间
1444 小时
注册时间
2018-12-16
帖子
2036
跳转到指定楼层
1

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

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

x
本帖最后由 play337 于 2024-11-23 09:02 编辑

如何做到让跟在主角后面的队友去攻击接近的敌人.ABS模式

我现在想到的思路是:

01.队友是使用队友图形的事件
02.他们的[自己移动路线]中有[条件语句],[会定期检查自己]、[玩家]和[带有敌人记号]的[事件]之间的[距离]
03.将[第一个结果][指定为他们的目标],然后[切换]到一个[新的事件页面]
04.在那里[他们再次检查自己]和[目标之间的距离][如果不够近][就移动到敌人那里][如果够近][就进行攻击]
05.[如果目标不再存在(已经死亡)][他们会回到第一个事件页面]
06.[前往玩家]或[新的敌人]

我在想这些有办法[用插件].或是[脚本]处理吗?

因为应该是 队友 或者是 怪物 也大概都相同.

如果是使用脚本处理 是不是比较好改全部的队友 或全部的怪物 他们的模式. 不然如果很多 我不就改到晕倒...

Lv3.寻梦者

梦石
0
星屑
2735
在线时间
257 小时
注册时间
2023-11-16
帖子
126
2
发表于 3 天前 | 只看该作者

回帖奖励 +10 星屑

可以,不过不知道你使用的是哪个ABS?我自己就完全实现了
RM内部就有一个接近某个角色的方法:
this.moveTowardCharacter(this.target);
其中this是自己(你希望移动的对象),target是你的目标

至于事件和敌人的距离,我可以给你一段算法:
var dist = Math.abs($gameMap.event(this.eventId()).x - this.target.x)  + Math.abs($gameMap.event(this.eventId()).y - this.target.y);

这里的thiis.target是基于QABS的,QABS会把目标写入this.target,你用其他的就查看代码,敌人对象写入哪里就替换掉就可以了

最后就是这样:

var dist = Math.abs($gameMap.event(this.eventId()).x - this.target.x)  + Math.abs($gameMap.event(this.eventId()).y - this.target.y);
if(dist < x){//此处x写你希望判断的距离
$gameMap.event(this._eventId).moveTowardCharacter(this.target); //$gameMap.event(this._eventId)是当前事件,this.target自行替换为目标事件
}
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7335
在线时间
1444 小时
注册时间
2018-12-16
帖子
2036
3
 楼主| 发表于 3 天前 | 只看该作者
MOG_ChronoEngine插件
https://rpg.blue/thread-480368-1-1.html
https://rpg.blue/thread-479359-1-1.html

QJ-Bullet 【插件】ARPG核心【弹幕/激光/粒子】【v8.9】
https://rpg.blue/thread-486840-2-1.html

=======================================================
QJ-SpawnEvent.js [ 我试过用这个变出敌人 ]
EventReSpawn.js [ 我试过用这个变出敌人 ]

如果 敌人是 用 SPAWN 这类插件 变出来的... 好象 ID 我就不知道要如何指定 .... 要怎麽去知道变出来的 敌人 ID是多少啊?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2735
在线时间
257 小时
注册时间
2023-11-16
帖子
126
4
发表于 3 天前 | 只看该作者
play337 发表于 2024-11-24 11:19
MOG_ChronoEngine插件
https://rpg.blue/thread-480368-1-1.html
https://rpg.blue/thread-479359-1-1.html ...

控制台输入 $gameMap.events();
来查看事件列表。
你需要一个方法来搜寻敌人,我是写了个方法搜索距离玩家最近的敌人
这个就仁者见仁智者见智了
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7335
在线时间
1444 小时
注册时间
2018-12-16
帖子
2036
5
 楼主| 发表于 3 天前 | 只看该作者
你好厉害啊! 我按下 F8 在控制台 输入: $gameMap.events();

38: Game_PrefabEvent {_originalEventId: 15, _eventId: 47, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
39: Game_PrefabEvent {_originalEventId: 15, _eventId: 48, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
40: Game_PrefabEvent {_originalEventId: 15, _eventId: 49, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
41: Game_PrefabEvent {_originalEventId: 15, _eventId: 50, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
42: Game_PrefabEvent {_originalEventId: 15, _eventId: 51, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
43: Game_PrefabEvent {_originalEventId: 15, _eventId: 52, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
44: Game_PrefabEvent {_originalEventId: 15, _eventId: 53, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}
45: Game_PrefabEvent {_originalEventId: 15, _eventId: 54, _isTemplate: undefined, _templateId: 0, _templateEvent: null, …}

创建越多就越来越长....

哪脚本我应该要如何让我的队友去寻找这些一直冒出来的新的敌人呢?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2735
在线时间
257 小时
注册时间
2023-11-16
帖子
126
6
发表于 前天 12:55 | 只看该作者
play337 发表于 2024-11-24 21:44
你好厉害啊! 我按下 F8 在控制台 输入: $gameMap.events();

38: Game_PrefabEvent {_originalEventId: 15, ...

写一个简单的方法,这里是我用的,查找最近距离的敌人:
        Game_Event.prototype.findNearestEvent = function() {
                if (!$gameMap.events().length ||  $gameVariables.value(20) > 0) return; // 没有事件或者不获得目标则不执行
                let nearestEvent = null; // 最近的事件
                let minDistance = 999; // 最小距离
                // 循环查找所有事件
                $gameMap.events().forEach(function(event) {
                                let dx = event.x - $gamePlayer.x; // 事件与玩家的X轴距离
                                let dy = event.y - $gamePlayer.y; // 事件与玩家的Y轴距离
                                let distance = Math.sqrt(dx * dx + dy * dy); // 计算欧几里得距离
                                if (distance < minDistance) { // 如果当前事件距离小于最小距离
                                        minDistance = distance; // 更新最小距离
                                        nearestEvent = event; // 更新最近的事件
                                }
                });
                // 如果找到最近的事件
                if (nearestEvent) {
                        // 将最近事件的ID存储在游戏变量20中
                        $gameVariables.setValue(20, nearestEvent.eventId());

                } else {
                        // 如果没有找到有效事件,清除游戏变量
                        $gameVariables.setValue(20, 0);
                }

你在事件页的脚本调用调用完这个方法,此时距离最近的事件就被写入了游戏变量20当中
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7335
在线时间
1444 小时
注册时间
2018-12-16
帖子
2036
7
 楼主| 发表于 前天 16:26 | 只看该作者
为什麽我测试了几次 都得到这样的错误呢?



JAVASCRIPT 代码复制
  1. Game_Event.prototype.findNearestEvent = function() {
  2.                 if (!$gameMap.events().length ||  $gameVariables.value(17) > 0) return; // 没有事件或者不获得目标则不运行
  3.                 let nearestEvent = null; // 最近的事件
  4.                 let minDistance = 999; // 最小距离
  5.                 // 循环查找所有事件
  6.                 $gameMap.events().forEach(function(event) {
  7.                                 let dx = event.x - $gamePlayer.x; // 事件与玩家的X轴距离
  8.                                 let dy = event.y - $gamePlayer.y; // 事件与玩家的Y轴距离
  9.                                 let distance = Math.sqrt(dx * dx + dy * dy); // 计算欧几里得距离
  10.                                 if (distance < minDistance) { // 如果当前事件距离小于最小距离
  11.                                         minDistance = distance; // 更新最小距离
  12.                                         nearestEvent = event; // 更新最近的事件
  13.                                 }
  14.                 });
  15.                 // 如果找到最近的事件
  16.                 if (nearestEvent) {
  17.                         // 将最近事件的ID保存在游戏变量17中
  18.                         $gameVariables.setValue(17, nearestEvent.eventId());
  19.  
  20.                 } else {
  21.                         // 如果没有找到有效事件,清除游戏变量
  22.                         $gameVariables.setValue(17, 0);
  23.                 }
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2735
在线时间
257 小时
注册时间
2023-11-16
帖子
126
8
发表于 前天 20:49 | 只看该作者
play337 发表于 2024-11-25 16:26
为什麽我测试了几次 都得到这样的错误呢?

少了括号了,这样改:
  1. Game_Event.prototype.findNearestEvent = function() {
  2.     // 没有事件或者不获得目标则不运行
  3.     if (!$gameMap.events().length || $gameVariables.value(17) > 0) return;

  4.     let nearestEvent = null; // 最近的事件
  5.     let minDistance = 999;   // 最小距离

  6.     // 循环查找所有事件
  7.     $gameMap.events().forEach(function(event) {
  8.         let dx = event.x - $gamePlayer.x; // 事件与玩家的X轴距离
  9.         let dy = event.y - $gamePlayer.y; // 事件与玩家的Y轴距离
  10.         let distance = Math.sqrt(dx * dx + dy * dy); // 计算欧几里得距离

  11.         if (distance < minDistance) { // 如果当前事件距离小于最小距离
  12.             minDistance = distance;  // 更新最小距离
  13.             nearestEvent = event;    // 更新最近的事件
  14.         }
  15.     });

  16.     // 如果找到最近的事件
  17.     if (nearestEvent) {
  18.         // 将最近事件的ID保存在游戏变量17中
  19.         $gameVariables.setValue(17, nearestEvent.eventId());
  20.     } else {
  21.         // 如果没有找到有效事件,清除游戏变量
  22.         $gameVariables.setValue(17, 0);
  23.     }
  24. };
复制代码
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7335
在线时间
1444 小时
注册时间
2018-12-16
帖子
2036
9
 楼主| 发表于 昨天 00:11 | 只看该作者
是没有错误没错.... 不过变量17不管怎模样值都是0....

我测试一下 我最后改成没找到人 变量17 = 42 ... 结果也还是 0.... 都没有跑...

是不是要甚麽插件 才会跑 ?

  1. Game_Event.prototype.findNearestEvent = function() {
  2.     // 没有事件或者不获得目标则不运行
  3.     if (!$gameMap.events().length || $gameVariables.value(17) > 0) return;

  4.     let nearestEvent = null; // 最近的事件
  5.     let minDistance = 999;   // 最小距离

  6.     // 循环查找所有事件
  7.     $gameMap.events().forEach(function(event) {
  8.         let dx = event.x - $gamePlayer.x; // 事件与玩家的X轴距离
  9.         let dy = event.y - $gamePlayer.y; // 事件与玩家的Y轴距离
  10.         let distance = Math.sqrt(dx * dx + dy * dy); // 计算欧几里得距离

  11.         if (distance < minDistance) { // 如果当前事件距离小于最小距离
  12.             minDistance = distance;  // 更新最小距离
  13.             nearestEvent = event;    // 更新最近的事件
  14.         }
  15.     });

  16.     // 如果找到最近的事件
  17.     if (nearestEvent) {
  18.         // 将最近事件的ID保存在游戏变量17中
  19.         $gameVariables.setValue(17, nearestEvent.eventId());
  20.     } else {
  21.         // 如果没有找到有效事件,清除游戏变量
  22.         $gameVariables.setValue(17, 42);
  23.     }
  24. };
复制代码

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2735
在线时间
257 小时
注册时间
2023-11-16
帖子
126
10
发表于 昨天 05:42 | 只看该作者
play337 发表于 2024-11-26 00:11
是没有错误没错.... 不过变量17不管怎模样值都是0....

我测试一下 我最后改成没找到人 变量17 = 42 ... 结 ...

在事件页里脚本调用:$gameMap.event(this.eventId()).findNearestEvent();
按道理来说只要你有事件就可以搜索到的

点评

我怎麽测试变量17都还是0......不知道问题出在哪...也没有任何错误消息...  发表于 昨天 11:21
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 16:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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