2017-09-01 88 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

我已經嘗試過......我想我需要重新看看我的代碼處理擴展視區和相機.. 。我想我有幾個問題,我需要解決... –