0

很难解释这个问题,所以我录制了一个视频来说明这个问题。[视频在这里]

我在 box2d 对象(身体)中有图像。当用户拖动演员时,其下方的身体也会移动,以使图像遵循物理规律。当身体没有完全旋转时,一切都按预期工作(拖放),但是当旋转发生时,运动会变得疯狂,从而产生无限旋转的不良效果。

这是我的方法:

在构造函数中:

for(final Brick b : map.list){
        stage.addActor(b.img);
        Vector3 v = new Vector3(b.box.getPosition().x,b.box.getPosition().y,0);
        camera.project(v);

        b.img.setPosition(v.x-b.img.getWidth()*0.5f, v.y-b.img.getHeight()*0.5f);
        b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);
        b.img.setRotation((float) Math.toDegrees(b.box.getAngle()));


        b.img.addListener((new DragListener() {
            public void touchDragged (InputEvent event, float x, float y, int pointer) {
                float newPosX =b.img.getX() + x;
                float newPosY = b.img.getY() +  y;
                b.img.setPosition(newPosX-b.img.getWidth()*0.5f,newPosY-b.img.getHeight()*0.5f);
                b.box.setTransform(newPosX, newPosY, b.box.getAngle());
           }

        }));
    }

其中 map.list 是一个包含所有可以拖动的实体的列表。

在渲染函数中:

for(final Brick b : map.list){
            b.img.setVisible(true);
            b.img.setPosition(b.box.getPosition().x-b.img.getWidth()*0.5f, b.box.getPosition().y-b.img.getHeight()*0.5f);
            b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);
            b.img.setRotation((float) Math.toDegrees(b.box.getAngle()));
        }

提前非常感谢!

4

1 回答 1

0

我认为您的问题是您错误地设置了旋转的原点。

b.img.setOrigin(b.img.getWidth()*0.5f, b.img.getHeight()*0.5f);

只要身体完全不旋转,一切正常。假设你的身体位置在身体的中心,这实际上应该是

b.img.setOrigin(v.x, v.y);

尝试使用 Box2dDebugRenderer 快速检查身体是否真的移动得如此怪异,或者您是否只是错误地绘制了图片。

于 2013-08-18T09:15:43.783 回答