Libgdx: 将Body 移离触摸事件
Libgdx: Move Body away from touch event
我想要一个object离开触摸事件的位置。
到目前为止我有以下内容:
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Vector3 touchPosition = new Vector3();
camera.unproject(touchPosition.set(screenX, screenY, 0));
Vector2 directionBody = body.getPosition();
Vector2 directionTouch = new Vector2(touchPosition.x, touchPosition.y);
Vector2 direction = directionBody.sub(directionTouch);
direction.nor();
float speed = 3;
body.setLinearVelocity(direction.scl(speed));
return true;
}
使用此代码,如果我按下屏幕右侧,body 会向左移动。如果按屏幕左侧,body 将转到右侧。有人可以帮我吗?
你的代码对我来说有点模糊,可能是因为你正在使用 类 我不知道,但通常它很简单:
首先你将触摸坐标取消投影到屏幕坐标系,你的 body object 就像你做的那样。
其次计算触摸位置与您的 body object 之间的水平和垂直距离。假设您得到了 dx 和 dy。
如果你想要恒定速度,你只需要检查那些 dx 和 dy 是正的还是负的,并且取决于你设置正速度还是负速度,即:
if (dx >0) vx = SPEED_CONSTANT;
else vx = -SPEED_CONSTANT;
垂直速度也是如此。
如果你想让你的 body 加速,你应该使用那些 dx 和 dy 乘以一些常数。也就是说,dx越大垂直速度应该越高。垂直速度也是如此:
vx = dx * SPEED_CONSTANT;
vy = dy * SPEED_SONSTANT;
如果你想让你的 body 减速那么你应该用 dx 和 dy 分配一些常数值,以产生相反的效果:
vx = SPEED_CONSTANT / dx;
vy = SPEED_CONSTANT / dy;
类似的东西。您可以通过尝试一些值来设置 SPEED_CONSTANT 的值 - 调整它。
希望对您有所帮助。
所以我终于做到了。
代码片段:
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Vector3 touchPosition3D = new Vector3();
//Change touch coordinates to world coordinates
camera.unproject(touchPosition3D.set(screenX, screenY, 0));
//Add unit factor to the vector
touchPosition3D.x = Utility.convertToMeter(touchPosition3D.x);
touchPosition3D.y = Utility.convertToMeter(touchPosition3D.y);
Vector3 bodyPosition = new Vector3(body.getPosition().x, body.getPosition().y, 0 );
Vector3 finalVector = new Vector3(bodyPosition.x, bodyPosition.y, 0).sub(touchPosition3D);
Vector2 direction = new Vector2(finalVector.x, finalVector.y);
float speed = 3;
body.setLinearVelocity(direction.scl(speed));
return true;
}
基本上我必须取消投影触地坐标并将它们转换为我在我的应用程序中使用的单位。
然后我做一个简单的向量运算,从我的 body 向量中减去计算出的触摸向量。
最后施加一些线速度。
我想要一个object离开触摸事件的位置。
到目前为止我有以下内容:
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Vector3 touchPosition = new Vector3();
camera.unproject(touchPosition.set(screenX, screenY, 0));
Vector2 directionBody = body.getPosition();
Vector2 directionTouch = new Vector2(touchPosition.x, touchPosition.y);
Vector2 direction = directionBody.sub(directionTouch);
direction.nor();
float speed = 3;
body.setLinearVelocity(direction.scl(speed));
return true;
}
使用此代码,如果我按下屏幕右侧,body 会向左移动。如果按屏幕左侧,body 将转到右侧。有人可以帮我吗?
你的代码对我来说有点模糊,可能是因为你正在使用 类 我不知道,但通常它很简单:
首先你将触摸坐标取消投影到屏幕坐标系,你的 body object 就像你做的那样。
其次计算触摸位置与您的 body object 之间的水平和垂直距离。假设您得到了 dx 和 dy。
如果你想要恒定速度,你只需要检查那些 dx 和 dy 是正的还是负的,并且取决于你设置正速度还是负速度,即:
if (dx >0) vx = SPEED_CONSTANT;
else vx = -SPEED_CONSTANT;
垂直速度也是如此。
如果你想让你的 body 加速,你应该使用那些 dx 和 dy 乘以一些常数。也就是说,dx越大垂直速度应该越高。垂直速度也是如此:
vx = dx * SPEED_CONSTANT;
vy = dy * SPEED_SONSTANT;
如果你想让你的 body 减速那么你应该用 dx 和 dy 分配一些常数值,以产生相反的效果:
vx = SPEED_CONSTANT / dx;
vy = SPEED_CONSTANT / dy;
类似的东西。您可以通过尝试一些值来设置 SPEED_CONSTANT 的值 - 调整它。
希望对您有所帮助。
所以我终于做到了。
代码片段:
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Vector3 touchPosition3D = new Vector3();
//Change touch coordinates to world coordinates
camera.unproject(touchPosition3D.set(screenX, screenY, 0));
//Add unit factor to the vector
touchPosition3D.x = Utility.convertToMeter(touchPosition3D.x);
touchPosition3D.y = Utility.convertToMeter(touchPosition3D.y);
Vector3 bodyPosition = new Vector3(body.getPosition().x, body.getPosition().y, 0 );
Vector3 finalVector = new Vector3(bodyPosition.x, bodyPosition.y, 0).sub(touchPosition3D);
Vector2 direction = new Vector2(finalVector.x, finalVector.y);
float speed = 3;
body.setLinearVelocity(direction.scl(speed));
return true;
}
基本上我必须取消投影触地坐标并将它们转换为我在我的应用程序中使用的单位。 然后我做一个简单的向量运算,从我的 body 向量中减去计算出的触摸向量。 最后施加一些线速度。