我想从屏幕的任何位置移动一个精灵(恰好是一个矩形),并使其完全停在屏幕的触摸位置。现在,我已经可以停止我的精灵,但不是在确切的触摸位置。我没有找到一个很好的方法来做到这一点,而不会牺牲准确性或冒险精灵不要停止。
自然 - 问题出现是因为当前位置是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);
}
答案 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
}
}