代码之家  ›  专栏  ›  技术社区  ›  Philipp Lenssen

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

  •  2
  • Philipp Lenssen  · 技术社区  · 14 年前

    背景:我有一个鸟瞰的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;
    }
    

    ... y速度也是一样,speedStep是一个很小的值,可以使它更平滑,也不会太突然(船不应该从快速向左的方向转到快速向右的方向)。

    2 回复  |  直到 14 年前
        1
  •  5
  •   C. K. Young    14 年前
    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);
    
        2
  •  1
  •   Christoffer Hammarström    14 年前

    circleTouch == [0, 0]

    在一些类似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;
    }