这是一个菜单屏幕类,当被调用时,它将使用作为参数传递的spritebatch绘制菜单屏幕。问题是draw命令第二次执行失败(即在我们重新启动应用程序之后),而所有其他功能都能完美工作(如果我们点击我们放置它的位置,你仍然可以使用我们放置在屏幕上的按钮)
public class MenuScreen extends Screen
{
Texture Background,Playgame,Credits;
Vector2 PlaygamePos,CreditsPos;
Rectangle PlaygameRect,CreditsRect,touchRect;
public MenuScreen()
{
Background = GameEngine.LoadTexture("Menu/bg.png");
GameEngine.BackgroundTexture = Background;
Playgame = GameEngine.LoadTexture("Menu/newgame.png");
Credits = GameEngine.LoadTexture("Menu/credits.png");
PlaygamePos = new Vector2(500,300);
CreditsPos = new Vector2(500,200);
PlaygameRect = new Rectangle(PlaygamePos.x,PlaygamePos.y,Playgame.getWidth(),Playgame.getHeight());
CreditsRect = new Rectangle(CreditsPos.x,CreditsPos.y,Credits.getWidth(),Credits.getHeight());
}
@Override
public void Update(OrthographicCamera camera)
{
if(GameEngine.isBackButton == true)
{
GameEngine.isBackButton = false;
Gdx.app.exit();
}
if(GameEngine.isTouched() == true)
{
Vector3 touchPos = new Vector3();
touchPos = GameEngine.TouchPos(camera);
touchRect = new Rectangle(touchPos.x,touchPos.y,10,10);
if(touchRect.overlaps(PlaygameRect))
{
SelectScreen = ScreenSelect.GamePlay;
}
else if(touchRect.overlaps(CreditsRect))
{
}
}
}
@Override
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.draw(Credits,CreditsPos.x,CreditsPos.y);
spriteBatch.draw(Playgame,PlaygamePos.x,PlaygamePos.y);
}
@Override
public void Resume() {
// TODO Auto-generated method stub
}
@Override
public void Pause() {
// TODO Auto-generated method stub
}
@Override
public void Dispose()
{
}
}
即使我们尝试过Dispositing纹理和SpriteBatches也没有成功
您很可能遇到Java对象的生存期(与应用程序进程的生存期相关)和纹理对象的生存时间(与OpenGL上下文的生存期相关联,后者与"活动"的可见性相关)之间的不匹配。在应用程序"重启"时,我怀疑你实际上只是在退出"活动",而安卓正在缓存进程,并在你"重新启动"你的应用程序的同一进程中启动新的"活动"。在这种情况下,您将拥有一个有效的Java Texture
对象,但它在OpenGL上下文中"指向"的底层字节已不存在(因为当"活动"不再可见时,OpenGL上下文将无效)。
修复方法是在活动创建时重新加载纹理。您可以只确保包含纹理的所有对象(以及包含纹理的对象等)都与"活动"生命周期相关联。