【问题标题】:Libgdx - Box2D: Attach Physics Body Editor Loader mask to dynamic textureLibgdx - Box2D:将物理身体编辑器加载器蒙版附加到动态纹理
【发布时间】:2013-08-07 18:26:19
【问题描述】:

我有一个圆形纹理,当触摸拖动发生时,它会被绘制到一个新位置。它没有设置为一个实体。

我使用 Aurelien Ribon 的 Physics Body Editor Loader GUI 制作了一张物理贴图,绘制到圆圈的上部和下部,我想在纹理的位置上绘制该蒙版,并在发生拖动时绘制到它的新位置。

我该怎么做?在我的创建方法中,我初始化了变量,蒙版被绘制到纹理的初始位置,但是当我移动它时,蒙版停留在圆的初始位置。

这是我的代码:

Create()方法:

 //... rest of the method ommited for clarity

    karika = gameWorld.getKarika();

    World world = new World(new Vector2(0, 0), false);


Box2DDebugRenderer renderer = new Box2DDebugRenderer();
    BodyEditorLoader karikaLoader = new BodyEditorLoader(Gdx.files.internal("data/collision-masks/karika.json"));

    BodyDef karikaDef = new BodyDef();
    karikaDef.type = BodyType.DynamicBody;
    karikaDef.position.set(karika.getPosition().x, karika.getPosition().y);
    karikaDef.angle = karika.getRotation();

    Body karikaBody = world.createBody(karikaDef);

    FixtureDef karikaFixture = new FixtureDef();
    karikaFixture.density = 0.5f;
    karikaFixture.friction = 0.8f;
    karikaFixture.restitution = 0.6f;

    karikaLoader.attachFixture(karikaBody, "karika", karikaFixture, karika.getWidth());
    Vector2 karikaBodyOrigin = karikaLoader.getOrigin("karika", karika.getWidth()).cpy();

    //rest of the method ommited for clarity

我的render() 方法:

 //...
    batch.begin();
    batch.draw(karikaTexture, karika.getPosition().x, karika.getPosition().y, karika.getWidth() / 2, karika.getHeight() / 2, karika.getWidth(), karika.getHeight(), 1, 1, karika.getRotation(), 0, 0, karikaTexture.getWidth(), karikaTexture.getHeight(), false, false);
    batch.end();
renderer.render(world, cam.combined);
    world.step(1 / 60f, 6, 2);
    //...

在渲染方法中绘制的纹理是我的圆圈的纹理。如前所述,我没有将它设置为一个 body,只有碰撞蒙版。

我想做的是将蒙版附加到纹理上,并跟上它的位置,例如当我拖动圆圈时,蒙版应该保持on 圆圈。

【问题讨论】:

    标签: java android box2d libgdx game-physics


    【解决方案1】:

    查看DebugRenderer。它工作得很好,并且完全符合您的要求。

    这里是如何使用它。

    debugRenderer.render(this.world, camera.combined);
    

    这里是a more thorough tutorial

    我建议您使用物理对象的位置来分配圆的位置,而不是尝试将物理对象分配给纹理的位置。

    在您的代码中,您似乎使用karika 的当前位置创建了您的karikaBody,但此后karikaBody 位置永远不会更新。所以你的“碰撞面具”(你的物理身体)的位置永远不会改变。

    【讨论】:

    • 我实际上使用的是DebugRenderer,我用它更新了代码。可悲的是,它不起作用..但也许你没有正确理解。这就是发生的事情:tinyurl.com/kx6n9yd。如果我将圆圈移开,则蒙版不会将其位置更新为圆圈的位置
    • karika 检索到的变量gameWorld.getKarika() 是什么?
    • 卡里卡是圈子。它基于我的实体类。然后,实体类有一个名为 moveableentity 的子类(因为我有更多的可移动实体),它的子类是 karika。它具有宽度、高度、位置、旋转和速度参数。 Gamewolrd 只是一个包装器,它有 karika 和其他一些对象的 getter
    • 我无法将我的纹理分配给我的物理体的位置,因为物理体的位置取决于圆的位置。然而,第二句话是有道理的。在哪里以及如何更新 karikaBody 的位置? (或 karikaDef 的?)我尝试将 create() 方法中的整个代码放入 render() 方法,但它刚刚开始在 render() 方法的每个循环上创建物理体。有什么建议么?感谢您的宝贵时间!
    • 我在我的渲染方法中使用了这行代码:karikaBody.setTransform(karika.getPosition().x, karika.getPosition().y, karika.getRotation());但是我觉得这不是最好的方法。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多