spine 2d坐标系libgdx

时间:2017-09-01 12:00:55

标签: android libgdx spine

我不知道我做错了什么...我认为我有脑冻结。我真的很难将我的脊椎对象像素坐标转换为世界坐标。我最近转换了所有代码以使用Ashley ecs,我似乎无法让我的脊椎对象显示在正确的位置。 我有一个系统,处理我的脊椎对象的渲染和定位,但我似乎无法让它显示在正确的位置。 我希望有人能指出我正确的方向!

我已经包含了我的脊柱渲染系统代码...希望你能提供帮助! 我想将脊椎对象放置在与使用世界坐标的方框2d对象相同的位置。但脊柱正在使用像素坐标。我还附上了一张图片,向您展示正在发生的事情。 (靠近屏幕中间右边的灰色方块是我想要脊椎物体的地方!)

Amarino

in game image

    public class SpineRenderSystem extends IteratingSystem {
    private static final String TAG = com.chaingang.freshstart.systems.SpineRenderSystem.class.getName();

    private PolygonSpriteBatch pBatch;
    SkeletonMeshRenderer skeletonMeshRenderer;
    private boolean process = true;

    BodyComponent bodyComp;
    Spine2DComponent spineComp;

    public SpineRenderSystem(PolygonSpriteBatch pBatch){
        super(Family.all(RenderableComponent.class, Spine2DComponent.class, PositionComponent.class).get());
        this.pBatch = pBatch;
        skeletonMeshRenderer = new SkeletonMeshRenderer();
        skeletonMeshRenderer.setPremultipliedAlpha(true);

    }


    @Override
    protected void processEntity(Entity entity, float deltaTime) {

        bodyComp = Mappers.body.get(entity);
        spineComp = Mappers.spine2D.get(entity);

        float offsetX = 100.00f/Gdx.graphics.getWidth(); //100 equal world width
        float offsetY = 50.00f/Gdx.graphics.getHeight(); //50 equals world height

        pBatch.begin();
            spineComp.skeleton.setX((bodyComp.body.getPosition().x / offsetX) );
            spineComp.skeleton.setY((bodyComp.body.getPosition().y) / offsetY);

            skeletonMeshRenderer.draw(pBatch,spineComp.skeleton);
            //spineComp.get(entity).skeleton.setFlipX(player.dir == -1);
            spineComp.animationState.apply(spineComp.skeleton);
            spineComp.skeleton.updateWorldTransform();
        pBatch.end();


    }
}

2 个答案:

答案 0 :(得分:0)

您是否听说过一种名为camera.project(world coordinates);的方法,它可能会满足您的需求。它采用世界坐标并将它们转换为屏幕坐标。相反,您可以camera.unproject(screen coordinates);

答案 1 :(得分:0)

我为脊椎渲染做的是查看脊柱中的边界框大小(以像素为单位)。这通常是100像素的量级。但是如果您正在使用box2d音阶,建议您将1视为1米。

考虑到这一点,我将缩放人体脊椎动画,其臀部y坐标为200像素,除以200或大约。

一旦你有了这个比例,那么当你建立你的Spine Skeleton时你可以做到这一点(对不起,我现在在Kotlin做我所有的libgdx东西):

val atlasLoader = AtlasAttachmentLoader(atlas)
val skeletonJson = SkeletonJson(atlasLoader)
skeletonJson.scale = 1/200f

然后你可能还想处理渲染脊椎对象的偏移量,正如我所看到的那样,因为你的根骨可能位于脊椎对象的中心(例如臀部)。但是,你正在进行除法运算,我猜这是一种探索,因为偏移应该是加法或减法。这是我如何使用脊椎像素坐标(再次,对Kotlin抱歉,但我喜欢它):

//In some object or global state we have this stuff
var skeleton: Skeleton
var skeletonRenderer = SkeletonRenderer<PolygonSpriteBatch>()


//Then in the rendering code
val offset = Vector2(0f,-200f)
val position = physicsRoot.position().add(offset)
skeleton.setPosition(position.x, position.y)
skeleton.updateWorldTransform()
skeletonRenderer.draw(batch, skeleton)

这应该让你的脊柱工作按预期工作。