LibGDX - 并非所有精灵都被渲染

时间:2016-06-25 16:49:17

标签: java android libgdx

我试图创建一个简单的游戏,其中创建了多个瘦平台。我相信一切都设置正确,通过调试,我发现平台是正确创建的(随机偏移)。问题是,只创建了最后创建的平台,而不是所有平台。

我使用一个类来管理平台,它包含一个保存平台信息(位置,精灵)的内部私有类:

private class Platform{
    private Vector2 mVelocity;
    private Vector2 mPosition;

    private Sprite mTexture;

    public Platform(int x, int y, int w, int h){
        mPosition   = new Vector2(x, y);
        mVelocity   = new Vector2(0, 0);
        mTexture    = AssetLoader.mPlatformTexture;
        mTexture.setSize(w, h);
    }

    public void Update(float delta){
        mTexture.setPosition(mPosition.x, mPosition.y);
    }

    public Sprite GetTexture(){
        return mTexture;
    }
}

平台是递归创建的,并使用随机偏移量添加到数组列表中:

public Platforms(){
    mPlatforms = new ArrayList<Platform>();
    AddPole(50);
}

private void AddPole(int x){
    if(x < Gdx.graphics.getWidth()){
        mPlatforms.add(new Platform(x, RandomInRange(-240, -400), 20, 480));
        AddPole(x + RandomInRange(100, 200));
    }
}

最后,更新并呈现平台:

@Override
public void render(float frameTime) {
    mRunTime += frameTime;

    mPlatforms.Update(frameTime);
    mCharacter.Update(frameTime);
    mCamera.update();

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    mBatcher.setProjectionMatrix(mCamera.combined);

    mBatcher.begin();
    mPlatforms.Render(mBatcher);
    mCharacter.Render(mBatcher);
    mBatcher.end();
}

...

public void Update(float delta){
    for(int i = 0; i < mPlatforms.size(); i++){
        mPlatforms.get(i).Update(delta);
    }
}

public void Render(SpriteBatch batcher){
    for(int i = 0; i < mPlatforms.size(); i++){
        mPlatforms.get(i).GetTexture().draw(batcher);
    }
}

但是可以看出,只绘制了一个平台(最后一个平台)。

enter image description here

我做的事情有点愚蠢吗?我刚刚开始搞乱LibGDX,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我不了解libgdx,但我想我知道你问题的解决方案。

每个平台都具有相同的纹理,即:

mTexture    = AssetLoader.mPlatformTexture;

现在您更新平台的位置,并致电:

mTexture.setPosition(mPosition.x, mPosition.y);

为每个平台更新相同的纹理。这意味着在更新所有平台之后,您已将纹理放置到最后一个平台的位置。然后你画画,你在那个位置画了很多次平台。一个在另一个之上。你可以用两种方式解决这个问题,或者为每个平台制作一个单独的纹理实例(我不能告诉你如何做到这一点,因为我不知道纹理类),或者更新和绘制同时,像这样:

public void UpdateAndDraw(float delta){
    for(int i = 0; i < mPlatforms.size(); i++){
        mPlatforms.get(i).Update(delta);
        mPlatforms.get(i).GetTexture().draw(batcher);
    }
}