有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当精灵与加速计一起旋转时,java将精灵弹离墙壁

我有一个基于设备的pitchroll旋转的精灵。 我用来旋转精灵的代码是:

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

这些墙分别是水平和垂直的

第一次碰撞很好,任何其他发生的碰撞,精灵都会直接穿过墙壁

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

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

Image 1 Image 2 Image 3 Image 4 Image 5

我希望这些图片能让你更好地理解我在做什么,如果你能帮助我,或者给我指出正确的方向,否则任何其他选择都会让人惊讶!! 提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    所以,你面临的主要问题是,当你想让精灵反弹并朝着远离墙壁的新方向移动时,它会一直朝着同一个方向移动

    我认为这是因为您直接根据加速度计提供的俯仰和滚动设置精灵的角度和位置,所以只要您的设备倾斜,精灵就会以相同的速度朝相同的角度移动。碰撞时,您的精灵只会在远离墙的地方更新一次,因此在碰撞结束后,它会朝加速度计给定的方向返回

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

    实现反向移动的一种方法是在一段时间内限制对对象的控制,只更新对象的移动,在一定时间内不更改其加速度计。要做到这一点,您需要在精灵的运动中使用旋转,例如

    xChange = Math.cos(spriteRotationInRadians)*speed;
    yChange = Math.sin(spriteRotationInRadians)*speed;
    

    您也可以连续设置面,例如,在与左墙碰撞后使用“left”条件,直到对象与另一面墙碰撞,但我不确定更新对象旋转/移动的方法是否可以使用此解决方案

    另一种可能是在碰撞时将对象的速度设置为一个较大的数字,然后通过玩家控件随时间更新此速度,以便玩家能够从碰撞中恢复


    最灵活的解决方案是在游戏中实现Box2D物理。一开始看起来很难,但是有很多教程介绍如何在LibGDX中使用它

    在Box2D中,您可以将重力设置为0,将对象的线性阻尼设置为大于0,在屏幕边缘放置一些要碰撞的线,并基于以下内容更新对象的速度:

    x_Vel = Math.cos(objectRotationInRadians)*speed;
    y_Vel = Math.sin(objectRotationInRadians)*speed;
    

    从加速计中获取旋转。然后可以绘制一个随Box2D对象旋转的精灵。Box2D本身无法解决反弹问题,因为您的对象将继续沿加速度计的同一方向移动,但肯定可以解决穿墙问题,如果您想将碰撞扩展到包括其他对象,则可以少玩一些小游戏

    例如,使用Box2D,您可以使墙对对象的冲击使其以极高的速度反射(通过恢复),从而允许对象从墙上反弹,但仍由玩家控制

    以下是Box2D上的一些有用链接,如果您选择该路线:

    Simple bouncing ball code

    Information about setting up Box2D

    C++ Box2D series of tutorials

  2. # 2 楼答案

    我“修复”它的方法是,检查设备的倾斜是否从碰撞点开始发生变化,如果没有,精灵将继续沿从墙上反弹的方向移动,直到设备的倾斜发生变化

    谢谢你的帮助