使用 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
) 显示正常。知道为什么会发生这种情况以及如何解决这个问题吗?
更新 - 添加不同情况的描述
- 这是菜单场景在任何更改之前的样子(没有按钮精灵!):
- 如果没有附加 mBackgroundSprite,这就是场景的样子(注意精灵应该在的地方有矩形,但它们没有各自的图像,而是背景的颜色):
- 如果按钮的 TextureRegions 位于单独的 BuildableBitmapTextureAtlas 上,这就是场景的样子(两个按钮是相同的,尽管它们的 TextureRegions 加载了不同的图像。要创建的第一个 TextureRegion 是显示在两个按钮...!?):
- 为每个精灵添加一个 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);
}
被执行。
这导致了意外行为。我希望这可以帮助别人。
我的代码大纲如下:
资源:
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
) 显示正常。知道为什么会发生这种情况以及如何解决这个问题吗?
更新 - 添加不同情况的描述
- 这是菜单场景在任何更改之前的样子(没有按钮精灵!):
- 如果没有附加 mBackgroundSprite,这就是场景的样子(注意精灵应该在的地方有矩形,但它们没有各自的图像,而是背景的颜色):
- 如果按钮的 TextureRegions 位于单独的 BuildableBitmapTextureAtlas 上,这就是场景的样子(两个按钮是相同的,尽管它们的 TextureRegions 加载了不同的图像。要创建的第一个 TextureRegion 是显示在两个按钮...!?):
- 为每个精灵添加一个 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);
}
被执行。
这导致了意外行为。我希望这可以帮助别人。