查看: 9386|回复: 15

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

[复制链接]
梦石
0
星屑
296
在线时间
217 小时
注册时间
2008-12-18
回帖
30
发表于 2018-9-17 11:58:06 | 显示全部楼层 |阅读模式

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

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

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

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

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

[pre lang="javascript" file="DiscoverThePlayer.js"]//=============================================================================
// DiscoverThePlayer.js
//=============================================================================
/*:
* @plugindesc NPC视野算法插件
* @author 魏玉龙
* @since 2018.09.17
* @version 1.0
*
* @param range
* @desc 视野范围
* @default 5
*
* @param Enc-None
* @desc 开启不遇敌时,NPC是否逃离?true 逃离,false 不逃离
* @default true
*
* @param flee
* @desc 空闲时的状态 0:静止不动 1:随机移动
* @default 0
*
* @help
* 此插件为NPC提供了视野算法,当玩家出现在NPC视野内才会被发现并迅速靠近。
*
* 此插件提供以下插件命令
*
* DTP range number
* DTP encNone true/false
* DTP flee number
*
*/

(function () {
    var parameters = PluginManager.parameters('DiscoverThePlayer');
    var config = {
        range: Number(parameters['range'] || 5),
        encNone: JSON.parse(parameters['Enc-None']),
        flee: Number(parameters['flee'] || 0)
    };
    var _Game_Event_initMembers = Game_Event.prototype.initMembers;
    Game_Event.prototype.initMembers = function () {
        _Game_Event_initMembers.call(this);
        this._discover = false;
    };

    Game_Event.prototype.moveTypeTowardPlayer = function () {
        var page = this.page();
        var direction = this.direction();
        if (!this._discover && this.isNearThePlayer() && this.isDiscoverThePlayer()) {
            this._discover = true;
            AudioManager.playSe({
                name: 'Jump1',
                volume: 75,
                pitch: 85,
                pan: 0
            });
            this.requestBalloon(1);
            this.setMoveSpeed($gamePlayer.moveSpeed());
            this.setMoveFrequency($gamePlayer.moveFrequency());
        }
        if (this._discover && this.isNearThePlayer()) {
            if ($gameSystem.isEncounterEnabled()) {
                this.moveTowardPlayer();
            } else if (config.encNone) {
                this.moveAwayFromPlayer();
            }
        } else {
            this._discover = false
            this.setMoveSpeed(page.moveSpeed);
            this.setMoveFrequency(page.moveFrequency);
            if (config.flee === 1) {
                var d = [2,4,6,8].filter(v=>v!=(10-direction));
                var i = Math.randomInt(3);
                this.moveStraight(d);
            }
        }
    };

    Game_Event.prototype.isNearThePlayer = function () {
        var sx = Math.abs(this.deltaXFrom($gamePlayer.x));
        var sy = Math.abs(this.deltaYFrom($gamePlayer.y));
        return sx <= config.range && sy <= config.range;
    };

    Game_Event.prototype.isDiscoverThePlayer = function () {
        var direction = this.direction();
        var sx = this.deltaXFrom($gamePlayer.x);
        var sy = this.deltaYFrom($gamePlayer.y);
        switch (direction) {
            case 2:
                if (sy < 0 && sy >= -(config.range)) {
                    if (sx < Math.abs(sy) && sx > -(Math.abs(sy))) {
                        return true;
                    }
                }
                break;
            case 4:
                if (sx > 0 && sx <= config.range) {
                    if (sy < Math.abs(sx) && sy > -(Math.abs(sx))) {
                        return true;
                    }
                }
                break;
            case 6:
                if (sx < 0 && sx >= -(config.range)) {
                    if (sy < Math.abs(sx) && sy > -(Math.abs(sx))) {
                        return true;
                    }
                }
                break;
            case 8:
                if (sy > 0 && sy <= config.range) {
                    if (sx < Math.abs(sy) && sx > -(Math.abs(sy))) {
                        return true;
                    }
                }
                break;
        }
        return false;
    };

    var alias_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        alias_Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === "DTP") {
            switch (args[0]) {
                case 'range':
                    config.range = Number(args[1] || 5)
                break;
                case 'encNone':
                    config.encNone = JSON.parse(args[1] || 5)
                break;
                case 'flee':
                    config.flee = Number(args[1] || 5)
                break;
            }
        }
    }
})();[/pre]

评分

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

查看全部评分

梦石
0
星屑
3074
在线时间
685 小时
注册时间
2018-6-1
回帖
253
发表于 2018-9-17 13:25:40 | 显示全部楼层
这功能不错
回复

使用道具 举报

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


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

使用道具 举报

梦石
0
星屑
15294
在线时间
720 小时
注册时间
2011-7-16
回帖
1373

开拓者

发表于 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
另外,我的插件、范例、游戏都在这里
回复

使用道具 举报

梦石
0
星屑
25355
在线时间
1136 小时
注册时间
2019-3-5
回帖
1303
发表于 2019-9-26 14:17:22 | 显示全部楼层
自主移动类型选接近后还是原版的移动方式,我的方法不对?
回复

使用道具 举报

梦石
0
星屑
1053
在线时间
81 小时
注册时间
2020-2-21
回帖
35
发表于 2020-3-15 21:57:38 | 显示全部楼层
很需要这种插件,但是这样写出来的我却不知道怎么用,有相关教程吗?
回复

使用道具 举报

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

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

使用道具 举报

梦石
0
星屑
1053
在线时间
81 小时
注册时间
2020-2-21
回帖
35
发表于 2020-3-24 00:29:32 | 显示全部楼层
有没有插件本体啊,不会用这种代码的……
回复

使用道具 举报

梦石
0
星屑
1053
在线时间
81 小时
注册时间
2020-2-21
回帖
35
发表于 2020-3-24 01:31:45 | 显示全部楼层
Ailan1993 发表于 2020-3-24 00:29
有没有插件本体啊,不会用这种代码的……

我之前太笨,现在自己会了……
回复

使用道具 举报

梦石
0
星屑
1451
在线时间
137 小时
注册时间
2020-1-13
回帖
176
发表于 2020-3-24 05:51:49 | 显示全部楼层
楼主威武  感觉在野外可以做 成遇敌
那么问题来了 如果启用了插件  怎么避免城市里面的NPC也会如此呢

点评

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部