Project1

标题: NPC视野算法插件 [打印本页]

作者: 魏玉龙    时间: 2018-9-17 11:58
标题: NPC视野算法插件
本帖最后由 魏玉龙 于 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. })();

作者: q1456503215    时间: 2018-9-17 13:25
这功能不错
作者: wr282828    时间: 2018-9-17 16:22
很不错的插件!
冒昧的问下,这个插件 对帧数的影响大么?
npc寻路的时候 是否会自动绕过一些障碍物?
作者: walf_man    时间: 2018-9-17 16:25
非常有创意的插件,在某些特定情况下,可以根据此插件创作出很有感觉的npc
作者: Zeldashu    时间: 2019-9-26 14:17
自主移动类型选接近后还是原版的移动方式,我的方法不对?
作者: Ailan1993    时间: 2020-3-15 21:57
很需要这种插件,但是这样写出来的我却不知道怎么用,有相关教程吗?
作者: gg123wtf    时间: 2020-3-15 23:04
Ailan1993 发表于 2020-3-15 21:57
很需要这种插件,但是这样写出来的我却不知道怎么用,有相关教程吗? ...

导入插件后看插件帮助文档
作者: Ailan1993    时间: 2020-3-24 00:29
有没有插件本体啊,不会用这种代码的……
作者: Ailan1993    时间: 2020-3-24 01:31
Ailan1993 发表于 2020-3-24 00:29
有没有插件本体啊,不会用这种代码的……

我之前太笨,现在自己会了……
作者: a3300376    时间: 2020-3-24 05:51
楼主威武  感觉在野外可以做 成遇敌
那么问题来了 如果启用了插件  怎么避免城市里面的NPC也会如此呢
作者: gaohanzaici    时间: 2020-8-8 20:34
你好楼主,启动插件后,把自主移动类型选接近了,可是并没有发生什么,是我哪里弄错了吗?

作者: 红十字    时间: 2020-9-4 10:32
厉害厉害,收藏了.感谢分享
作者: 沧海有蛟    时间: 2021-8-29 21:19
设置接近后还是没有效果。。。。。。
作者: ussa    时间: 2021-9-10 13:50
针布戳




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