gpt4 book ai didi

flash - 2 个物体彼此跟随但距离将它们拉开

转载 作者:行者123 更新时间:2023-12-02 06:25:10 25 4
gpt4 key购买 nike

基本上我正在制作一个游戏,当英雄出现时,敌人会追赶他。我为实现这一目标所做的是

var distx = hero.px - px;
var disty = hero.py - py;


moveX += distx * .00005;
moveY += disty * .00005;

现在我不得不将它乘以 .00005,因为任何更高的值都会让他很快找到英雄。我希望敌人移动缓慢,所以我将它乘以 .00005。我的问题是他们距离越远,怪物移动得越快,这使得英雄更难逃脱。我知道这是为什么,我只需要知道如何解决它。

我开发了一个游戏,如果怪物离得太远,我会将他从舞台上移除。但问题是越来越远。无论他们相距多远,我都希望他以恒定的速度移动。

我也想通过不使用任何类属性来实现这一点。 (即我希望所有变量都是本地的)。这个方法也是循环的

我做错了什么?什么是解决方案。

谢谢大家

最佳答案

你所要做的就是限制敌人的速度。

// Calculate velocity just as you're doing it
var p = .00005;
var velx = distx * p;
var vely = disty * p;

// Rate limit that velocity
var maxVel = 5; // You will have to tune this value as your max speed
var vel = Math.sqrt(velx*velx + vely*vely);
if (vel > maxVel) {
var r = maxVel / vel;
velx *= r;
vely *= r;
}

// Move the enemy
moveX += velx;
moveY += vely;

您基本上只实现了控制系统工程师 (1) 称之为 PID controller 的“比例”部分.您希望敌人跟踪玩家,而 PID Controller 是一个很好的简单可调(想想敌人的困难)跟踪 Controller 。

在跟踪 PID Controller 中,您首先测量期望目标与当前事态之间的误差。 (你现在就这样做,并调用变量 distxdisty。)在 PID Controller 中,你会记住过去的错误,这样你就可以根据不同的情况采取不同的行动错误的观点。

PID = function() {
this.p = 0;
this.i = 0;
this.d = 0;
this.reset(0);
};

PID.prototype.reset = function(error) {
this.error = error;
this.integral = 0;
this.differential = 0;
}

PID.prototype.step = function(error) {
this.integral += error;
this.differential = (error - this.error);
this.error = error;
var control = this.p * this.error +
this.i * this.integral +
this.d * this.differential;
return control;
};

您为您试图控制的对象(敌人)的每个可控状态创建一个 PID Controller 。所以你的更新逻辑会变成:

// distx and disty are calculated as normal
var velx = pidx.step(distx);
var vely = pidy.step(disty);

moveX += velx;
moveY += vely;

您现在可以通过改变 PID 对象的 p,i,d 参数来获得敌人的各种行为。要复制您当前的 AI,您需要设置:

pidx.p = 0.00005;
pidx.i = 0;
pidx.d = 0;
// same for pidy

虽然可以通过提高 i 参数并进一步降低 p 来实现更有趣的 AI:

pidx.p = 0.000005;
pidx.i = 0.0005;
pidx.d = 0;

如果敌人持续了很长时间,你会时不时地想要清除他的内存。只需调用 pidx.reset(distx) 即可重置该内存。

此外,您仍然希望按照本答案前面给出的那样对 velx, vely 进行速率限制。

所有这些复杂性有什么好处?与简单的数学相比,你会遇到表现得非常自然的敌人。我还想指出,您使用 distx * 0.00005 逻辑沿着正确的轨道前进。

(1) 将控制工程师视为研究封闭系统行为并利用这些知识迫使系统以他们希望的方式运行的人员。

关于flash - 2 个物体彼此跟随但距离将它们拉开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2059238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com