我试图创建一个简单的游戏,其中创建了多个瘦平台。我相信一切都设置正确,通过调试,我发现平台是正确创建的(随机偏移)。问题是,只创建了最后创建的平台,而不是所有平台。
我使用一个类来管理平台,它包含一个保存平台信息(位置,精灵)的内部私有类:
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);
}
}
但是可以看出,只绘制了一个平台(最后一个平台)。
我做的事情有点愚蠢吗?我刚刚开始搞乱LibGDX,所以任何帮助都会受到赞赏。
答案 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);
}
}