Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/math/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何正确调整玩家精灵的速度?(基本上是一道数学题?)_Math_Vector_Angle - Fatal编程技术网

Math 如何正确调整玩家精灵的速度?(基本上是一道数学题?)

Math 如何正确调整玩家精灵的速度?(基本上是一道数学题?),math,vector,angle,Math,Vector,Angle,背景:我有一个鸟瞰的JavaScript游戏,玩家通过触摸一个圆圈来控制一艘宇宙飞船——例如,触摸圆圈中心的左侧,飞船将向左移动,触摸右上角,它将移动到右上角,等等。。。离伪操纵杆圆心越远,该方向的速度越快。但是,我并不是直接调整船的速度,而是设置一个targetSpeed.x和targetSpeed.y值,然后船将使用如下方式调整其速度: if (this.speed.x < this.targetSpeed.x) { this.speed.x += this.speedStep

背景:我有一个鸟瞰的JavaScript游戏,玩家通过触摸一个圆圈来控制一艘宇宙飞船——例如,触摸圆圈中心的左侧,飞船将向左移动,触摸右上角,它将移动到右上角,等等。。。离伪操纵杆圆心越远,该方向的速度越快。但是,我并不是直接调整船的速度,而是设置一个targetSpeed.x和targetSpeed.y值,然后船将使用如下方式调整其速度:

if (this.speed.x < this.targetSpeed.x) {
    this.speed.x += this.speedStep;
}
else if (this.speed.x > this.targetSpeed.x) {
    this.speed.x -= this.speedStep;
}
if(this.speed.xthis.targetSpeed.x){
this.speed.x-=this.speedStep;
}
。。。y速度也是一样,speedStep是一个很小的值,可以使它更平滑,也不会太突然(船不应该从快速向左行驶到快速向右行驶)

我的问题:使用上面的代码,我相信速度会在对角线方向调整得更快,而在水平/垂直方向调整得更慢。我如何纠正这一点以获得相同的目标速度跟随


非常感谢你的帮助

假设您已检查触摸是否在圆圈内,圆圈边缘表示最大速度,圆圈中心为
circleTouch==[0,0]

var xdiff = targetSpeed.x - speed.x;
var ydiff = targetSpeed.y - speed.y;
var angle = Math.atan2(ydiff, xdiff);
speed.x += speedStep * Math.cos(angle);
speed.y += speedStep * Math.sin(angle);
在某些类似C++的伪代码中:

Scalar circleRadius = ...;
Scalar maxSpeed = ...;
Scalar acceleration = ...;

Vector calculateTargetSpeed( Vector circleTouch ) {
    Vector targetSpeed = maxSpeed * circleTouch / circleRadius;

    return targetSpeed;
}

Vector calculateNewSpeed( Vector currentSpeed, Vector targetSpeed ) {
    Vector speedDiff = targetSpeed - currentSpeed;

    Vector newSpeed = currentSpeed + acceleration * normalized(speedDiff);

    return newSpeed;
}

// Divide v by its length to get normalized vector (length 1) with same x/y ratio
Vector normalized( Vector v ) {
    return v / length(v);
}

// Pythagoras for the length of v
Scalar length( Vector v ) {
    Scalar length = sqrt(v.x * v.x + v.y * v.y); // or preferably hypot(v.x, v.y)

    return length;
}

这只是我的想法,我还没有测试过。另一个答案很好,我只想给出一个没有三角函数的答案。:)

你能把你的问题改一下吗?你到底想做什么?谢谢。@Oren:OP想要做的事情很明显——如果角度是45度(例如,
targetSpeed.x-speed.x==targetSpeed.y-speed.y
),那么增量仍然是
speedStep
,而不是
sqrt(2)*speedStep
+1。atan2将获得两点之间的角度。因为和罪恶得到你的x和y偏移。我只会使用速度步而不是计算最后两行的标准。工作起来很有魅力,我喜欢Stackoverflow!谢谢你,克里斯!很高兴有这个作为替代品,谢谢!你是否怀疑这段代码可能是一个更快的选择,因为它避免了某些数学函数?@Philipp:对不起,我不知道,你必须自己进行基准测试。另外,我希望向量数学足够容易理解?:)