2个物体彼此相继但距离将它们拉开

num*_*l25 2 flash actionscript actionscript-3

基本上我正在制作一个游戏,当敌人来到英雄之后,敌人就会出现.我要做的是做到这一点

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


moveX += distx * .00005;
moveY += disty * .00005;
Run Code Online (Sandbox Code Playgroud)

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

我开发了游戏,如果怪物离得太远,我就把他从舞台上移开.但问题是越来越远.无论他们相隔多远,我都希望他以恒定的速度移动.

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

我究竟做错了什么?什么是解决方案.

多谢你们

Fra*_*ger 7

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

// 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;
Run Code Online (Sandbox Code Playgroud)

您基本上只实现了控制系统工程师(1)称之为PID控制器的"比例"部分.你的愿望是让敌人跟踪玩家,而PID控制器是一个很好的简单tunable(想想敌人的困难)跟踪控制器.

在跟踪PID控制器中,首先测量所需目标与当前事态之间的误差.(您现在就这样做,并调用变量distxdisty.)在PID控制器中,您可以记住过去的错误,以便您可以根据错误的不同视角采取不同的行动.

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;
};
Run Code Online (Sandbox Code Playgroud)

您为要控制的对象(敌人)的每个可控状态创建一个PID控制器.因此,您的更新逻辑将更改为:

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

moveX += velx;
moveY += vely;
Run Code Online (Sandbox Code Playgroud)

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

pidx.p = 0.00005;
pidx.i = 0;
pidx.d = 0;
// same for pidy
Run Code Online (Sandbox Code Playgroud)

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

pidx.p = 0.000005;
pidx.i = 0.0005;
pidx.d = 0;
Run Code Online (Sandbox Code Playgroud)

如果他持续很长时间,你会经常想要清除敌人的记忆.只需调用pidx.reset(distx)重置该内存.

此外,您仍然希望velx, vely对此答案中前面给出的速率进行速率限制.

所有这些复杂性有什么好处?与简单的数学相比,你会得到行为非常自然的敌人.我还想指出你正在沿着正确的轨道移动你的distx * 0.00005逻辑.

(1)将控制工程师视为研究封闭系统行为并利用该知识迫使系统以他们想要的方式行事的人.