我想让一个物体远离触碰事件的位置。
到目前为止,我有以下内容:
@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;
}
使用此代码,如果我按屏幕右侧,身体向左移动。如果按屏幕左侧,则机身将向右侧移动。有人可以帮帮我吗?
答案 0 :(得分:1)
你的代码对我来说有点模糊,也许是因为你使用的课程我没有,但一般来说很简单:
首先,将触摸坐标取消投影到屏幕坐标系,您的身体对象就像您一样。
第二个计算触摸位置和身体对象之间的水平和垂直距离。假设你得到dx和dy。
如果你想要恒定的速度,你只需检查那些dx和dy是正还是负,并根据你设定的正或负速度,即:
if(dx> 0)vx = SPEED_CONSTANT;
其他vx = -SPEED_CONSTANT;
垂直速度也一样。
如果你想让你的身体加速你应该使用那些dx和dy乘以一些常数。也就是说,dx越大,垂直速度就越高。垂直速度也是如此:
vx = dx * SPEED_CONSTANT;
vy = dy * SPEED_SONSTANT;
如果你想让你的身体减速,那么你应该用那些dx和dy设定一些恒定值,以产生相反的效果:
vx = SPEED_CONSTANT / dx;
vy = SPEED_CONSTANT / dy;
这样的事情。您可以通过尝试某些值来设置该SPEED_CONSTANT的值 - 将其调整。
我希望这会有所帮助。
答案 1 :(得分:0)
所以我终于做到了。
代码段:
@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;
}
基本上我不得不取消触摸touchDown坐标并将它们转换为我在我的应用程序中使用的单位。 然后我做一个简单的矢量操作,减去我身体矢量的计算触摸矢量。 最后应用一些线速度。