当前位置: 首页 > 知识库问答 >
问题:

如何改变移动体的位置-Box2D

亢雅懿
2023-03-14

我目前创建了一个动态的身体,并且用Vector2()以恒定的速度移动。我想要的是当身体离开屏幕边缘时,立即从当前点回到原点。我该怎么做?

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

共有3个答案

司寇昱
2023-03-14

您可以使用以下选项:

body.setTransform(newX, newY, newAngle);
body.setAwake(true);

唤醒身体很重要。它可能目前处于非活动状态,如果不唤醒它,重力或任何直接碰撞都不会在新位置影响它。

王季萌
2023-03-14

您可以通过以下方法立即设置Box2Da主体的位置:

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

这样,当主体的x或y值在屏幕之外时,可以创建一个条件,将主体的x和y位置设置回其原始位置。

if(outsideBounds()){
    a.setTransform(start_x, start_y, start_angle);
}

可以通过检查对象的Box2D位置及其转换的屏幕坐标,或通过检查精灵的位置来检查对象是否在屏幕外。

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

<代码>pos_x

这可以通过包含对象的尺寸来改进,具体取决于您希望何时进行变换:

(pos_x-objWidth)>screenWidth || (pos_x+objWidth)<0 ||
(pos_y-objHeight)>screenHeight || (pos_y+objHeight)<0

笪波鸿
2023-03-14

您可以使用Body.setTransform()执行该任务,但我不会这样做。

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

此外,它还会导致非身体行为,因为你基本上是在传送身体。

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

 类似资料:
  • 嗨,我正在开发swing应用程序,但我面临一个问题。 当我第一次运行application时,它位于我决定设置组件的适当位置。但问题发生在 我最小化&再次最大化框架窗口自动更改它的位置。 我哪里出错了?

  • 我有一个无休止的跑步游戏,我的主角有一个物理身体,我用它来处理跳跃 在他撞上障碍物之前,一切都很好。他开始后退,我希望他一直保持在他的x位置。 我尝试将身体动态设置为NO,但这停止了跳跃。 我该怎么做?我不想让角色在x轴上移动。

  • 我正在做Liferay 6.2项目。在Liferay中,他们使用了Vaadin。当我点击一个按钮时,它会打开一个不同的iframe。我可以为所有功能编写代码。现在我想使用WebDriver将光标移动到iframe元素。因为当我将鼠标移动到iframe复选框之后,我的自动脚本就可以运行了。我想自动化一个脚本,将鼠标指针移动到元素。 我已经尝试了下面的代码,但它不起作用。 1) 使用动作移动元素: 2

  • 是否可以更改Apache使用的的位置?当我做时,结果是: 路径= 已加载配置文件 但是的结果是 配置文件(php.ini)路径: /etc 我可以将从复制到,但是可以更改php.ini文件夹吗? 我使用自制软件安装PHP,我使用的是OS X Snow Leopard。

  • 我试图用任何逻辑来模拟生产中的劳动力短缺。我将工人设置为一个资源池,使用轮班计划定义产能,定义不同轮班的工人数量。我试图包括一个事件模块,在模拟过程中更改每个班次的劳动能力。然而,anylogic向我显示了一个错误,即我无法动态更改轮班组大小。是否有任何变通方法允许这种情况发生?非常感谢。

  • 问题内容: 有什么办法可以使用CSS从左到右或从下到上更改滚动条的位置? 问题答案: 仅使用CSS: 左右翻转: 工作小提琴 顶部/底部翻转: 工作小提琴