2017-09-01 104 views
0

我不知道我做错了什么...我想我有脑冻结。我真的很努力将我的脊柱对象像素坐标转换为世界坐标。我最近将所有的代码转换成与Ashley ecs一起工作,我似乎无法让我的脊柱对象显示在正确的位置。 我有一个处理我的脊柱物体的渲染和定位的系​​统,但我似乎不能让它显示在正确的位置。 我希望有人能指出我正确的方向!脊柱二维坐标系统libgdx

我已经包括我的脊柱渲染系统的代码...希望你能帮助! 我想将脊柱对象放置在与使用世界坐标的我的方框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(); 


    } 
} 
+0

什么是像素坐标?屏幕坐标? –

+0

是的屏幕坐标... –

回答

0

我为我的脊柱呈现做的是看脊柱的像素边界框的大小。这通常是100像素的数量级。但是,如果您使用box2d比例尺,建议您将1视为1米。

考虑到这一点,我将通过200分或200分左右的比例将人体脊柱动画缩放为200像素的臀部y坐标。

一旦你有了这个比例,那么当你建立你的脊椎骨骼,你可以做到这一点(对不起,我做我的所有libgdx东西在科特林现在):

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

那么你可能还需要处理一个用于渲染脊柱物体的偏移量,正如我看到的那样,因为可能您的根骨骼位于您的脊柱物体(例如臀部)的中心。但是,您正在进行分区操作,我认为这是一项探索性操作,因为偏移应该是加法或减法。下面是我如何做到这一点用脊椎像素坐标(再次,抱歉科特林,但我喜欢它):

//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) 

这应该让你的脊椎东西您正常工作。

0

你听说过一个叫camera.project(world coordinates);方法,它可能会做你在找什么。它采用世界坐标并将它们转换为屏幕坐标。相反,你可以做camera.unproject(screen coordinates);

+0

我认为那种作品,但当你调整屏幕大小时......它似乎不能正常工作然后...我是否需要重置一些宽度和高度值相机,然后回顾项目和未投影功能? –

+0

你更新你的相机吗?在调整大小的方法做camera.viewportwidth =宽度和camera.viewportheight =高度,然后调用camera.update() –

+0

我已经尝试过......我想我需要重新看看我的代码处理扩展视区和相机.. 。我想我有几个问题,我需要解决... –