使用 BuildableBitmapTextureAtlas 时 Sprite 不显示

Sprite not showing when using BuildableBitmapTextureAtlas

我的代码大纲如下:

资源:

mMenuTextureAtlas = new BuildableBitmapTextureAtlas(pActivity.getTextureManager(), 2048, 2048);
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath(GFX_BASE_LOCATION);
mPlayBtnTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, mActivity, "play_btn.png");
mExitBtnTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, mActivity, "exit_btn.png");
mBackgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, mActivity, "menu_background.png");

构建并加载:

try {
    mMenuTextureAtlas.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));
    mMenuTextureAtlas.load();
} catch (TextureAtlasBuilderException e) {
    Debug.e(e);
}

精灵定义:

mBackgroundSprite = new Sprite(0, 0, 800, 480, mBackgroundTextureRegion, mActivity.getVertexBufferObjectManager());
mPlayBtnSprite = new Sprite(50, 100, 160, 80, mPlayBtnTextureRegion, mActivity.getVertexBufferObjectManager());
mExitBtnSprite = new Sprite(50, 200, 160, 80, mExitBtnTextureRegion, mActivity.getVertexBufferObjectManager());

将精灵附加到场景:

mScene.attachChild(mPlayBtnSprite);
mScene.attachChild(mExitBtnSprite);
mScene.attachChild(mBackgroundSprite);

我在无数示例中看到了上述轮廓,但出于某种原因,我的按钮精灵 (mPlayBtnSprite mExitBtnSprite) 没有出现在场景中。背景精灵 (mBackgroundSprite) 显示正常。知道为什么会发生这种情况以及如何解决这个问题吗?

更新 - 添加不同情况的描述

  1. 这是菜单场景在任何更改之前的样子(没有按钮精灵!):
  2. 如果没有附加 mBackgroundSprite,这就是场景的样子(注意精灵应该在的地方有矩形,但它们没有各自的图像,而是背景的颜色):
  3. 如果按钮的 TextureRegions 位于单独的 BuildableBitmapTextureAtlas 上,这就是场景的样子(两个按钮是相同的,尽管它们的 TextureRegions 加载了不同的图像。要创建的第一个 TextureRegion 是显示在两个按钮...!?):
  4. 为每个精灵添加一个 BuildableBitmapTextureAtlas 确实有效,那么这是否意味着我需要为每个精灵添加一个 BuildableBitmapTextureAtlas?为什么我见过的 tutorials 不需要它?:

attachChild 顺序很重要,因此如果背景填满整个屏幕,mExitBtnSprite 和 mPlayBtnSprite 将隐藏在它后面。试试这个:

mScene.attachChild(mBackgroundSprite);
mScene.attachChild(mPlayBtnSprite);
mScene.attachChild(mExitBtnSprite);

或者您也可以这样做:

mPlayBtnSprite.setZIndex(1);
mExitBtnSprite.setZIndex(1);
mBackgroundSprite.setZIndex(0);
mScene.sortChildren(true);

编辑:

试试这个:

mMenuTextureAtlas = new BuildableBitmapTextureAtlas(pActivity.getTextureManager(), 2048, 2048, TextureOptions.BILINEAR);

texture = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, mActivity.getAssets(), "name.png");

atlasA = new BuildableBitmapTextureAtlas(pActivity.getTextureManager(), imageAWidth, imageAHeight, TextureOptions.BILINEAR);
atlasB = new BuildableBitmapTextureAtlas(pActivity.getTextureManager(), imageBWidth, imageBHeight, TextureOptions.BILINEAR);
atlasC = new BuildableBitmapTextureAtlas(pActivity.getTextureManager(), imageCWidth, imageCHeight, TextureOptions.BILINEAR);

textureA = BitmapTextureAtlasTextureRegionFactory.createFromAsset(atlasA, mActivity.getAssets(), "imageA.png");
textureB = BitmapTextureAtlasTextureRegionFactory.createFromAsset(atlasB, mActivity.getAssets(), "imageB.png");
textureC = BitmapTextureAtlasTextureRegionFactory.createFromAsset(atlasC, mActivity.getAssets(), "imageC.png");

atlasA.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));
atlasB.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));
atlasC.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));

atlasA.load();
atlasB.load();
atlasC.load();

我终于弄明白了:在我的代码中,我实际上是在加载 TextureAtlas 之前创建 Sprites。换句话说,

mBackgroundSprite = new Sprite(0, 0, 800, 480, mBackgroundTextureRegion, mActivity.getVertexBufferObjectManager());
mPlayBtnSprite = new Sprite(50, 100, 160, 80, mPlayBtnTextureRegion, mActivity.getVertexBufferObjectManager());
mExitBtnSprite = new Sprite(50, 200, 160, 80, mExitBtnTextureRegion, mActivity.getVertexBufferObjectManager());

之前被调用
try {
    mMenuTextureAtlas.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));
    mMenuTextureAtlas.load();
} catch (TextureAtlasBuilderException e) {
    Debug.e(e);
}

被执行。

这导致了意外行为。我希望这可以帮助别人。