Android 如何更改移动物体的位置-Box2D
我目前创建了一个身体,它是动态的,并以恒定的速度与矢量2()一起移动。我想要的是当身体离开屏幕边缘时,瞬间从当前点回到其原始点。我该怎么做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
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