Android 如何更改移动物体的位置-Box2D

Android 如何更改移动物体的位置-Box2D,android,libgdx,box2d,Android,Libgdx,Box2d,我目前创建了一个身体,它是动态的,并以恒定的速度与矢量2()一起移动。我想要的是当身体离开屏幕边缘时,瞬间从当前点回到其原始点。我该怎么做 a.applyForceToCenter(aMovement, true); a.applyTorque(3000, true); FixtureDef fDef = new FixtureDef(); BodyDef ballD = new BodyDef(); ballD.type = BodyType.Dyn

我目前创建了一个身体,它是动态的,并以恒定的速度与矢量2()一起移动。我想要的是当身体离开屏幕边缘时,瞬间从当前点回到其原始点。我该怎么做

    a.applyForceToCenter(aMovement, true);
    a.applyTorque(3000, true);

    FixtureDef fDef = new FixtureDef();
    BodyDef ballD = new BodyDef();

    ballD.type = BodyType.DynamicBody;

    //random location for asteroid
    int aLoc = (int) (aLocation * 15);
    float x = 300;
    switch(aLoc)
    {
    case 0:
        ballD.position.set(x, -105);
        break;
    case 1:
        ballD.position.set(x, -95);
        break;
    case 2:
        ballD.position.set(x, -80);
        break;
    case 3:
        ballD.position.set(x, -65);
        break;
    case 4:
        ballD.position.set(x, -50);
        break;
    case 5:
        ballD.position.set(x, -35);
        break;
    case 6:
        ballD.position.set(x, -20);
        break;
    case 7:
        ballD.position.set(x, -5);
        break;
    case 8:
        ballD.position.set(x, 10);
        break;
    case 9:
        ballD.position.set(x, 25);
        break;
    case 10:
        ballD.position.set(x, 40);
        break;
    case 11:
        ballD.position.set(x, 55);
        break;
    case 12:
        ballD.position.set(x, 70);
        break;
    case 13:
        ballD.position.set(x, 85);
        break;
    default:
        ballD.position.set(x, 0);
    }

    PolygonShape asteroid = new PolygonShape();
    asteroid.setAsBox(12.5f, 12.5f);

    //asteroid definition
    fDef.shape = asteroid;
    fDef.density = .5f;
    fDef.friction = .25f;
    fDef.restitution = .75f;

    a = world.createBody(ballD);
    a.createFixture(fDef);
    a.setFixedRotation(false);

   //asteroid image
    aSprite = new Sprite(new Texture("img/asteroid-icon.png"));
    aSprite.setSize(12.5f * 4, 12.5f * 4);
    aSprite.setOrigin(aSprite.getWidth() / 2, aSprite.getHeight() / 2);
    a.setUserData(aSprite);
    asteroid.dispose();

您可以通过以下方法立即设置Box2D
a
车身的位置:

a.setTransform(新x、新y、新角度)

通过此操作,可以创建一个条件,当主体的x或y值位于屏幕之外时,将主体的x和y位置设置回其原始位置

if(outsideBounds()){
    a.setTransform(start_x, start_y, start_angle);
}
您可以通过检查对象的Box2D位置及其转换的屏幕坐标,或者通过检查精灵的位置来检查对象是否在屏幕外

收到x和y屏幕位置后,可以将其与屏幕边界进行比较,如下所示:


pos_x>screenWidth|pos_xscreenHeight | pos_yscreenWidth|(pos_x+objWidth)screenHeight |(pos_y+objHeight)您可以使用
Body.setTransform()
完成该任务,但我不会这么做
setTransform()
从长远来看会造成很多麻烦

对我来说,这会导致奇怪的虫子。例如,使用
setTransform
在随机时刻禁用了我的
ContactFilter
,这花费了我几天的调试时间,直到我找到它

此外,它会导致非物理行为,因为你基本上传送了
身体


最好是完全销毁
主体
,并在旧主体相同的初始位置重新创建一个新主体。

您可以使用以下方法:

body.setTransform(newX、newY、newAngle);
body.setAwake(true);
唤醒身体是很重要的。
它可能当前处于非活动状态,在没有唤醒它的情况下,重力或任何直接碰撞都不会影响它在新位置的活动。

我如何才能按我所希望的方式进行?我想要的是,随着小行星在屏幕上移动,然后被放回原来的位置再次移动,这种情况将永远发生。如果使用
setTransform
,请不要忘记唤醒天体。它可能处于非活动状态,因此不会在新位置进行处理<代码>java body.setTransform(targetLePortPosition,body.angle);body.setAwake(true)如何获取主体的位置?您可以通过
a.getPosition()
获取主体的位置
Vector2
。有关LibGDX/Box2D实体的更多信息,请查看链接。正如noone的回答所指出的,使用
setTransform
可能会导致问题,因此使用此方法的风险由您自己承担,或者为了避免问题,请按照noone的建议重新创建身体。如果使用
setTransform
,请不要忘记唤醒身体。它可能处于非活动状态,因此不会在新位置进行处理<代码>java body.setTransform(targetLePortPosition,body.angle);body.setAwake(true)
(pos_x-objWidth)>screenWidth || (pos_x+objWidth)<0 ||
(pos_y-objHeight)>screenHeight || (pos_y+objHeight)<0