2-я система координат позвоночника libgdx

Я не знаю, что я делаю неправильно... я думаю, что у меня замораживание мозга. Я действительно изо всех сил пытаюсь преобразовать пиксельные координаты моих объектов позвоночника в мировые координаты. Я недавно преобразовал весь свой код для работы с Эшли Экс, и я не могу заставить мой объект позвоночника отображаться в правильном положении. У меня есть система, которая обрабатывает рендеринг и позиционирование моего объекта позвоночника, но я не могу заставить его отображаться в правильном положении. Я надеюсь, что кто-то может указать мне правильное направление!

я включил свой код для системы рендеринга позвоночника... надеюсь, вы можете помочь! я хочу поместить объект позвоночника в то же положение, что и мой объект box 2d, использующий мировые координаты. но позвоночник использует пиксельные координаты. Я также включил изображение, чтобы показать вам, что происходит. (серый квадрат в средней правой части экрана - это то место, где я хочу, чтобы был мой объект позвоночника!)

Amarino

в образе игры

    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 ответа

Решение

Что я делаю для рендера позвоночника, так это смотрю на размер ограничительной рамки в пикселях в позвоночнике. Обычно это порядка сотен пикселей. Но если вы работаете с весами box2d, рекомендуется считать 1 метром.

Имея это в виду, я буду масштабировать анимацию позвоночника человека с координатой бедра у 200 пикселей, разделив ее на 200 или около того.

Если у вас есть это соотношение, то, когда вы создаете свой Spine Skeleton, вы можете сделать это (извините, я делаю все мои вещи из libgdx в Kotlin сейчас):

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)

Это должно заставить ваши позвоночники работать так, как вы ожидаете.

Вы слышали о методе под названием camera.project(world coordinates); это может сделать то, что вы ищете. Он берет мировые координаты и превращает их в экранные координаты. Для противоположного вы можете сделать camera.unproject(screen coordinates);

Другие вопросы по тегам