Java/Slick2D 运动问题(添加运动而不是设置它?)

Posted

技术标签:

【中文标题】Java/Slick2D 运动问题(添加运动而不是设置它?)【英文标题】:Java/Slick2D Movement woes (Adding motion instead of setting it?) 【发布时间】:2015-09-03 19:07:33 【问题描述】:

我最近从 Gamemaker: Studio 转到 Java 和 Slick2D。我不知道如何描述我的问题,但我会尽力而为。

在 Gamemaker 中,有一个名为 motion_add 的功能,它可以使用给定的参数(速度和方向)向对象添加运动。

假设我们有一个对象以 20 像素/帧的速度向下移动。如果您将该对象的角度反转 180 度(因此它现在指向上方)并运行 motion_add 代码,它会一直减速到 0,然后再次加速。这对于漂浮的空间运动非常有效(这是我正在尝试做的)。

我的问题是,我该如何重新创建它?这是我当前的移动代码:

private void doPlayerMovement(Input input, int delta) 
    // Calculate rotation speed
    rotateSpeed = rotateSpeedBase - (speed / 5);
    if (rotateSpeed < 0.1f)  rotateSpeed = 0.1f; 

    // Get input
    if (input.isKeyDown(Input.KEY_A)) 
        // Rotate left
        if (input.isKeyDown(Input.KEY_W))  rotation -= rotateSpeed * delta; 
        sprite.rotate(-rotateSpeed * delta);
     

    if (input.isKeyDown(Input.KEY_D)) 
        // Rotate right
        if (input.isKeyDown(Input.KEY_W))  rotation += rotateSpeed * delta; 
        sprite.rotate(rotateSpeed * delta);
     

    if (input.isKeyDown(Input.KEY_W)) 
        // Accelerate
        speed += acceleration * delta;
     if (input.isKeyDown(Input.KEY_S)) 
        // Decelerate
        speed -= acceleration * delta;
     else 
        if (speed > 0)  speed -= friction; 
    

    // Clamping
    if (speed > maxSpeed)  speed = maxSpeed;  else if (speed < minSpeed)  speed = minSpeed; 
    if (rotation > 360 || rotation < -360)  rotation = 0; 

    // Make sure rotation catches up with image angle, if necessairy
    if (rotation != sprite.getRotation() && input.isKeyDown(Input.KEY_W)) 
        rotation = sprite.getRotation();
    

    // Update position
    position.x += speed * Math.sin(Math.toRadians(rotation)) * delta;
    position.y -= speed * Math.cos(Math.toRadians(rotation)) * delta;

会发生什么:

A 和 D 旋转精灵。如果按下 W(加速物体),它会“引导”物体。如果对象的旋转与精灵的旋转不同,则对象的旋转将设置为精灵的旋转,这就是我的问题所在。

这样做会导致对象立即朝新方向射击,并且速度不会减慢。如何让它变慢?

编辑(某种程度) 我敢肯定这一定有一个名字,如果你要以 100 英里/小时的速度驾驶汽车,让它以某种方式转动 180 度在行驶时,然后加油,它会减速然后再次加速。这就是我想要达到的目标。

【问题讨论】:

【参考方案1】:

您必须重新创建此行为。它可以称为惰性。您可以为您的对象添加一个方向矢量,这样您就有了它要去的运动方向和动画所指向的有效方向。

然后,当您在移动中改变方向时,您必须先减速,然后才能有效地朝新方向移动。

Vector movementVector=...; // choose whatever class you want
Vector pointingVector=...;

if (movementVector.x == -pointingVector.x || movementVector.y == -pointingVector.y) 
    // if pressing W then decelerate
    // if reaching speed == 0 then change movementVector value and accelerate in the other way

【讨论】:

以上是关于Java/Slick2D 运动问题(添加运动而不是设置它?)的主要内容,如果未能解决你的问题,请参考以下文章

如果我想跟踪运动,是不是必须使用 UIPanGestureRecognizer 而不是 UISwipeGestureRecognizer?

为啥将刚体添加到门并且在运行游戏时自动打开门时是不是启用了运动学?

[p1559] 运动员最佳匹配问题

JS学习之路,之弹性运动框架

在ffmpeg H.264解码器中修改运动向量

Health Kit 按设备类型分隔当天的运动步数