如何在准确的着陆位置坐标处停止精灵

时间:2015-01-01 23:26:11

标签: libgdx

我想从屏幕的任何位置移动一个精灵(恰好是一个矩形),并使其完全停在屏幕的触摸位置。现在,我已经可以停止我的精灵,但不是在确切的触摸位置。我没有找到一个很好的方法来做到这一点,而不会牺牲准确性或冒险精灵不要停止。

自然 - 问题出现是因为当前位置是Float,因此Vector永远不会(或极少)具有与触摸点完全相同的坐标(这是int)。 / p>

在下面的代码中,我通过简单地检查当前位置和目标位置(即触摸位置Vector3)之间的距离来停止我的精灵,就像if (touch.dst(currentPsition.x, currentPosition.y, 0) < 4)一样。 例如,如果精灵位于(5,5)位置并且我在(100,100)触摸屏幕,它将停止在(98.5352,96.8283)。

我的问题是,如何在精确触摸位置停止精灵,而不必近似?

void updateMotion() {
    if (moveT) {
        movement.set(velocity).scl(Gdx.graphics.getDeltaTime());
        this.setPosition(currentPosition.add(movement));
        if (touch.dst(currentPosition.x, currentPosition.y, 0) < 4)
            moveT = false;
    }
}

public void setMoveToTouchPosition(boolean moveT) {
    this.moveT = moveT;

    this.touch = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
    GameScreen.getCamera().unproject(touch);

    currentPosition = new Vector2(this.x, this.y);

    direction.set(new Vector2(touch.x, touch.y)).sub(currentPosition).nor();

    velocity = new Vector2(direction).scl(speed);
}

2 个答案:

答案 0 :(得分:1)

当然,由于种种原因,精灵无法顺利移动到触摸位置然后停在完全相同的位置。只需改变这个

if (touch.dst(currentPosition.x, currentPosition.y, 0) < 4)
            moveT = false;

到这个

if (touch.dst(currentPosition.x, currentPosition.y, 0) < 2) {
            currentPosition.x = touch.x;
            currentPosition.y = touch.y;
            moveT = false;
}

答案 1 :(得分:0)

快速但可接受的解决方案可能是使用Rectangle类。考虑到围绕移动实体创建Rectangle并根据其当前位置不断更新其边界,它的纹理为width,而其纹理为height。当overlaps具有“目标位置”时,您可以将其停止。如果你这样做,你保证自己会完全停在那个位置。例如:

Texture entityTexture = new Texture("assets/image.png");

Rectangle entityBounds = new Rectangle();
entityBounds.set((currentPosition.x, currentPosition.y, entityTexture .getWidth(), entityTexture .getHeight()));

Rectangle targetBounds = new Rectangle();
targetBounds.set((targetPosition.x, targetPosition.y, 1, 1)); // make width and height 1 by 1 for max accuracy

public void update(){

  // update bounds based on new position

  entityBounds.set((currentPosition.x, currentPosition.y, entityTexture.getWidth(),   entityTexture.getHeight()));

  targetBounds.set((targetPosition.x, targetPosition.y, 1, 1));

  if(entityBounds.overlaps(targetBounds)){
    // do something
  }
}