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

Project1

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

[原创发布] NPC视野算法插件

[复制链接]

Lv2.观梦者

梦石
0
星屑
266
在线时间
214 小时
注册时间
2008-12-18
帖子
44
跳转到指定楼层
1
发表于 2018-9-17 11:58:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 魏玉龙 于 2018-9-17 12:16 编辑

将NPC视野改为 NPC朝向的一个直径为5的三角形区域
当玩家没有进入NPC视野中时,NPC可静止或自由移动
当玩家进入NPC视野内,NPC会发现玩家并快速靠近
NPC自由移动时不会突兀的转身(即突然向后看),所以该插件适合做潜行玩法。

启用插件后NPC自主移动类型选接近就可以了!

JAVASCRIPT 代码复制下载
  1. //=============================================================================
  2. // DiscoverThePlayer.js
  3. //=============================================================================
  4. /*:
  5.  * @plugindesc NPC视野算法插件
  6.  * @author 魏玉龙
  7.  * @since 2018.09.17
  8.  * @version 1.0
  9.  *
  10.  * @param range
  11.  * @desc 视野范围
  12.  * @default 5
  13.  *
  14.  * @param Enc-None
  15.  * @desc 开启不遇敌时,NPC是否逃离?true 逃离,false 不逃离
  16.  * @default true
  17.  *
  18.  * @param flee
  19.  * @desc 空闲时的状态 0:静止不动 1:随机移动
  20.  * @default 0
  21.  *
  22.  * @help
  23.  * 此插件为NPC提供了视野算法,当玩家出现在NPC视野内才会被发现并迅速靠近。
  24.  *
  25.  * 此插件提供以下插件命令
  26.  *
  27.  * DTP range number
  28.  * DTP encNone true/false
  29.  * DTP flee number
  30.  *
  31.  */
  32.  
  33. (function () {
  34.     var parameters = PluginManager.parameters('DiscoverThePlayer');
  35.     var config = {
  36.         range: Number(parameters['range'] || 5),
  37.         encNone: JSON.parse(parameters['Enc-None']),
  38.         flee: Number(parameters['flee'] || 0)
  39.     };
  40.     var _Game_Event_initMembers = Game_Event.prototype.initMembers;
  41.     Game_Event.prototype.initMembers = function () {
  42.         _Game_Event_initMembers.call(this);
  43.         this._discover = false;
  44.     };
  45.  
  46.     Game_Event.prototype.moveTypeTowardPlayer = function () {
  47.         var page = this.page();
  48.         var direction = this.direction();
  49.         if (!this._discover && this.isNearThePlayer() && this.isDiscoverThePlayer()) {
  50.             this._discover = true;
  51.             AudioManager.playSe({
  52.                 name: 'Jump1',
  53.                 volume: 75,
  54.                 pitch: 85,
  55.                 pan: 0
  56.             });
  57.             this.requestBalloon(1);
  58.             this.setMoveSpeed($gamePlayer.moveSpeed());
  59.             this.setMoveFrequency($gamePlayer.moveFrequency());
  60.         }
  61.         if (this._discover && this.isNearThePlayer()) {
  62.             if ($gameSystem.isEncounterEnabled()) {
  63.                 this.moveTowardPlayer();
  64.             } else if (config.encNone) {
  65.                 this.moveAwayFromPlayer();
  66.             }
  67.         } else {
  68.             this._discover = false
  69.             this.setMoveSpeed(page.moveSpeed);
  70.             this.setMoveFrequency(page.moveFrequency);
  71.             if (config.flee === 1) {
  72.                 var d = [2,4,6,8].filter(v=>v!=(10-direction));
  73.                 var i = Math.randomInt(3);
  74.                 this.moveStraight(d[i]);
  75.             }
  76.         }
  77.     };
  78.  
  79.     Game_Event.prototype.isNearThePlayer = function () {
  80.         var sx = Math.abs(this.deltaXFrom($gamePlayer.x));
  81.         var sy = Math.abs(this.deltaYFrom($gamePlayer.y));
  82.         return sx <= config.range && sy <= config.range;
  83.     };
  84.  
  85.     Game_Event.prototype.isDiscoverThePlayer = function () {
  86.         var direction = this.direction();
  87.         var sx = this.deltaXFrom($gamePlayer.x);
  88.         var sy = this.deltaYFrom($gamePlayer.y);
  89.         switch (direction) {
  90.             case 2:
  91.                 if (sy < 0 && sy >= -(config.range)) {
  92.                     if (sx < Math.abs(sy) && sx > -(Math.abs(sy))) {
  93.                         return true;
  94.                     }
  95.                 }
  96.                 break;
  97.             case 4:
  98.                 if (sx > 0 && sx <= config.range) {
  99.                     if (sy < Math.abs(sx) && sy > -(Math.abs(sx))) {
  100.                         return true;
  101.                     }
  102.                 }
  103.                 break;
  104.             case 6:
  105.                 if (sx < 0 && sx >= -(config.range)) {
  106.                     if (sy < Math.abs(sx) && sy > -(Math.abs(sx))) {
  107.                         return true;
  108.                     }
  109.                 }
  110.                 break;
  111.             case 8:
  112.                 if (sy > 0 && sy <= config.range) {
  113.                     if (sx < Math.abs(sy) && sx > -(Math.abs(sy))) {
  114.                         return true;
  115.                     }
  116.                 }
  117.                 break;
  118.         }
  119.         return false;
  120.     };
  121.  
  122.     var alias_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  123.     Game_Interpreter.prototype.pluginCommand = function (command, args) {
  124.         alias_Game_Interpreter_pluginCommand.call(this, command, args);
  125.         if (command === "DTP") {
  126.             switch (args[0]) {
  127.                 case 'range':
  128.                     config.range = Number(args[1] || 5)
  129.                 break;
  130.                 case 'encNone':
  131.                     config.encNone = JSON.parse(args[1] || 5)
  132.                 break;
  133.                 case 'flee':
  134.                     config.flee = Number(args[1] || 5)
  135.                 break;
  136.             }
  137.         }
  138.     }
  139. })();

评分

参与人数 2+2 收起 理由
Zeldashu + 1 自主移动类型选接近后并没有发生什么,还是.
白嫩白嫩的 + 1 塞糖

查看全部评分

Lv3.寻梦者

梦石
0
星屑
3074
在线时间
685 小时
注册时间
2018-6-1
帖子
272
2
发表于 2018-9-17 13:25:40 | 只看该作者
这功能不错
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3077
在线时间
337 小时
注册时间
2018-3-28
帖子
203
3
发表于 2018-9-17 16:22:28 | 只看该作者
很不错的插件!
冒昧的问下,这个插件 对帧数的影响大么?
npc寻路的时候 是否会自动绕过一些障碍物?
用mv做了两款游戏,有兴趣的可以瞧一瞧:
《有毛病》--- 休闲、探索、策略、剧情、恐怖 都有那么一些,就是没有战斗。挺骚挺有意思的一个游戏。
steam链接:点击这里


《留离》--- 探索、高自由度、ARPG、战斗,就是没有啥剧情。
steam链接:点击这里
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14624
在线时间
718 小时
注册时间
2011-7-16
帖子
1428

开拓者

4
发表于 2018-9-17 16:25:02 | 只看该作者
非常有创意的插件,在某些特定情况下,可以根据此插件创作出很有感觉的npc
RMMV网络插件,开源免费,内含服务器端,无需强制登录,云数据,弹幕,云存档,排名,兑换码,版本检测,可自由上架下架删除。q群399090587
免打包运行MV游戏,云游戏,安卓App雷神游戏厅,在线玩游戏,上传下载游戏
开源游戏:重装机兵之重装归来【RMMV制作】全球首款按照美剧分季分集的方式发布的游戏
体素画 -- MV画3D像素图的画板
RMMV显示3D模型和场景的插件
RMMV显示spine骨骼动画的插件
RMMV秘密通道插件
突破敌群数量上限8个的插件
在rmmv中显示gif动态图片的插件
一款可以在mv游戏界面的任意位置显示任意文字的插件
RMMV Toast 插件 带物品得失提示,可以设置开启关闭 兼容yep itemcore
制作一个改名卡道具插件、调整标题页面菜单的插件、在标题页面之前显示大段文字的插件、标题页面显示版本号的插件
物品得失自动提示自动上色自动换行插件
我的Q群 663889472
另外,我的插件、范例、游戏都在这里
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
22010
在线时间
1057 小时
注册时间
2019-3-5
帖子
1424
5
发表于 2019-9-26 14:17:22 | 只看该作者
自主移动类型选接近后还是原版的移动方式,我的方法不对?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
965
在线时间
76 小时
注册时间
2020-2-21
帖子
34
6
发表于 2020-3-15 21:57:38 | 只看该作者
很需要这种插件,但是这样写出来的我却不知道怎么用,有相关教程吗?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
帖子
67
7
发表于 2020-3-15 23:04:49 | 只看该作者
Ailan1993 发表于 2020-3-15 21:57
很需要这种插件,但是这样写出来的我却不知道怎么用,有相关教程吗? ...

导入插件后看插件帮助文档
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
965
在线时间
76 小时
注册时间
2020-2-21
帖子
34
8
发表于 2020-3-24 00:29:32 | 只看该作者
有没有插件本体啊,不会用这种代码的……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
965
在线时间
76 小时
注册时间
2020-2-21
帖子
34
9
发表于 2020-3-24 01:31:45 | 只看该作者
Ailan1993 发表于 2020-3-24 00:29
有没有插件本体啊,不会用这种代码的……

我之前太笨,现在自己会了……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1117
在线时间
133 小时
注册时间
2020-1-13
帖子
196
10
发表于 2020-3-24 05:51:49 | 只看该作者
楼主威武  感觉在野外可以做 成遇敌
那么问题来了 如果启用了插件  怎么避免城市里面的NPC也会如此呢

点评

谢谢  发表于 2020-4-2 20:23
可以使用MKR_PlayerSensor,楼主这个插件功能相对简单,不适用于复杂情况  发表于 2020-3-24 11:46
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-18 17:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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