我有一个基于设备的pitch
和roll
旋转的精灵。
我用来旋转精灵的代码是:
double myRadians = Math.atan2(-Gdx.input.getRoll(), Gdx.input.getPitch());
float myDegress = Math.round(((myRadians*180)/Math.PI));
我也像这样设置了精灵的位置:
float yChange = Math.round(Gdx.input.getRoll());
float xChange = Math.round(-Gdx.input.getPitch());
float yMove = Math.round(yChange/1.5);
float xMove = Math.round(xChange/1.5);
现在,当这个精灵对象与“墙”发生碰撞时,我希望它能够反弹回来。但首先反映出来。 我这样做了:
// mirror sprite
// pitchAndRoll is a Vector2 and set to the pitch and roll
// at the time of collision
float flippedRotation = sprite.getRotation() * -1;
float yChange = Math.round(pitchAndRoll.y);
float xChange = Math.round(-pitchAndRoll.x);
if (whichWall.equals(Walls.WALL_LEFT)){
// left wall
flippedRotation = sprite.getRotation() * -1;
xChange = Math.round(pitchAndRoll.x);
}else if (whichWall.equals(Walls.WALL_RIGHT)){
// right wall
flippedRotation = sprite.getRotation() * -1;
xChange = Math.round(pitchAndRoll.x);
}else if (whichWall.equals(Walls.WALL_BOTTOM)){
// bottom wall
flippedRotation += 180;
yChange = Math.round(-pitchAndRoll.y);
}else if (whichWall.equals(Walls.WALL_TOP_LEFT)){
// top left wall
flippedRotation += 180;
yChange = Math.round(-pitchAndRoll.y);
}else if (whichWall.equals(Walls.WALL_TOP_RIGHT)){
// top right wall
flippedRotation += 180;
yChange = Math.round(-pitchAndRoll.y);
}
墙壁分别是完全水平和垂直的。
第一次碰撞很好,发生任何其他碰撞,精灵正好穿过墙壁。
但我的主要问题是,当使用设备的加速度计控制精灵时,如果用户将设备指向下方,精灵将向下移动,撞击墙壁,反弹,然后向下移动并继续循环。我想防止这种情况发生,但想不出怎么做。
这很难解释所以我这里有一些希望更有意义的图像=]]
我希望这些照片可以让你更好地理解我想要做的事情,无论如何你可以帮助我,或指出我正确的方向,或任何替代方案都会令人惊叹! 提前谢谢。
答案 0 :(得分:1)
所以,你遇到的主要问题是,当你想让它反弹并沿着一个新的方向远离墙壁时,精灵会朝着相同的方向前进?
我认为这种情况正在发生,因为你是直接从加速度计给出的俯仰和滚动设置精灵的角度和位置,所以只要你的设备倾斜,精灵就会朝着相同的角度移动。速度相同。在碰撞时,你的精灵只会在墙壁上更新一次,所以它会在碰撞结束后转向加速度计给出的方向。
解决此问题的方式取决于您打算如何运作游戏。就个人而言,我认为它的工作方式很好,因为你总是控制对象,如果你想让它向另一个方向移动,你可以倾斜设备。
您可以实现相反方向移动的一种方法是通过仅更新对象的移动而不是在一定时间内更改其加速度计给定的面来限制对象的控制一段时间。要做到这一点,你需要在你的运动中使用精灵的旋转,比如
xChange = Math.cos(spriteRotationInRadians)*speed;
yChange = Math.sin(spriteRotationInRadians)*speed;
你也可以连续设置面部,例如,在与左墙碰撞后使用“左”状态,直到物体与另一面墙碰撞,但我不确定你的方法是否更新旋转/运动对象将让这个解决方案工作。
另一种可能性是在碰撞时将对象的速度设置为大数,然后通过玩家控制随时间更新此速度,以便玩家能够从碰撞中恢复。
最灵活的解决方案是在游戏中实现Box2D物理。一开始可能看起来很难,但是有很多关于如何在LibGDX中使用它的教程。
在Box2D中,您可以将重力设置为0,将对象的线性阻尼设置为大于0,将某些线条与屏幕边缘碰撞,并根据此更新对象的速度:
x_Vel = Math.cos(objectRotationInRadians)*speed;
y_Vel = Math.sin(objectRotationInRadians)*speed;
旋转取自加速度计。然后,您可以绘制一个用Box2D对象旋转的精灵。单独的Box2D不会处理弹跳问题,因为你的物体将继续沿着与加速度计相同的方向行进,但是如果你想要将碰撞扩展到包括其他对象。
例如,使用Box2D,您可以使墙壁对物体产生影响,使其以极快的速度反射(通过恢复原状),允许物体从墙壁反弹但仍然由玩家控制。
如果您走这条路线,以下是Box2D的一些有用链接:
答案 1 :(得分:0)
我“修复”它的方法是检查设备的倾斜度是否从碰撞点发生了变化,如果没有,精灵继续沿着它从墙壁反弹的方向移动,直到设备的倾斜发生变化
感谢您的帮助..