java - 当 Sprite 用加速度计旋转时, Sprite 从墙上弹跳

标签 java android eclipse libgdx

我有一个根据设备的 pitchroll 旋转的 Sprite 。 我用来旋转 Sprite 的代码是:

double myRadians = Math.atan2(-Gdx.input.getRoll(), Gdx.input.getPitch());
float myDegress = Math.round(((myRadians*180)/Math.PI));

我也像这样设置 Sprite 的位置:

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);

现在,每当这个 sprite 对象与“墙”碰撞时,我希望它反弹回来。但首先镜像。 我是这样做的:

// 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);
}

墙壁分别完全水平和垂直。

第一次碰撞没问题,发生任何其他碰撞时, Sprite 直接穿过墙壁。

但我的主要问题是,由于 Sprite 是使用设备的加速度计控制的,如果用户将设备指向下方, Sprite 将向下移动,撞到墙上,弹回,然后向下移动,循环继续.我想阻止这种情况发生,但想不出该怎么做。

这很难解释,所以我这里有一些希望更有意义的图片 =]]

Image 1 Image 2 Image 3 Image 4 Image 5

我希望这些图片能让你更好地理解我正在尝试做的事情,如果你能帮助我,或者为我指明正确的方向,或者任何替代方案都会很棒!! 提前致谢。

最佳答案

那么,您遇到的主要问题是,当您希望 Sprite 弹开并朝远离墙壁的新方向行进时, Sprite 保持面向同一方向?

我认为发生这种情况是因为您直接根据加速度计给出的俯仰和滚动来设置 Sprite 的角度和位置,因此只要您的设备倾斜, Sprite 就会以相同的角度移动同样的速度。在发生碰撞时,您的 sprite 只会更新一次远离墙壁,因此在碰撞结束后它会转向加速计给出的方向。

您解决此问题的方式取决于您打算让游戏如何运作。就我个人而言,我认为它的工作方式很好,因为你始终可以控制对象,如果你想让它向另一个方向移动,你可以倾斜设备。

实现向相反方向移动的一种方法是在一段时间内限制对对象的控制,方法是仅更新对象的运动并且在一定时间内不更改其加速度计给定的朝向。为此,您需要在 Sprite 的运动中使用旋转,例如

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 对象旋转的 Sprite 。 Box2D 本身不会处理弹跳问题,因为您的物体将继续沿与加速度计相同的方向行进,但绝对应该解决您的穿墙问题,并且如果您想将碰撞扩展到包括其他对象。

例如,使用 Box2D,您可以使墙壁对物体的影响使其以极快的速度反射(通过恢复原状),从而允许物体从墙壁弹回但仍由玩家控制。

如果你走那条路,这里有一些关于 Box2D 的有用链接:

Simple bouncing ball code

Information about setting up Box2D

C++ Box2D series of tutorials

关于java - 当 Sprite 用加速度计旋转时, Sprite 从墙上弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806485/

相关文章:

java - jvm选项-XX :OnOutOfMemoryError=jmap do?是什么意思

android - 如何找到 android 项目支持的实际最小 API 级别?

java - OpenCV 错误 : Assertion failed (scn == 3 || scn == 4) while using Watershed in OpenCV android sdk

eclipse - 如何安装 Eclipse PDE?

eclipse - 创建新的远程分支时出现有趣的 refname 错误

java - 检查输入的数字是否为奇数

javascript - GWT HashMap.put() 没有向 HashMap 添加数据

java - 在标准输出中显示空白字符

java - Android执行一段代码时出现内存泄漏问题

android - Visual Studio Android 模拟器在创建虚拟机时卡住