2

我正在使用 AndEngine GLES 2.0 开发一款安卓游戏。我的一些用户面临这样的问题:锁定/解锁设备后或按下主页按钮并恢复游戏后无法完全运行意味着游戏在解锁屏幕后挂起。我的意思是这发生在调用 onResume 和 onPause 之后。

我的 onPause 代码是

@Override
protected void onPause() {
    super.onPause();
    this.mEngine.stop();
    this.getSManager().stop(Sounds.SPIN);
    dbHelper.close();
}

onResuam 代码是:

@Override
protected void onResume() 
{

 if (this.mEngine.isRunning()) 
    {
        this.getSManager().stop(Sounds.SPIN);
        this.mEngine.stop();
    }
    else 
    {
        this.mEngine.start();
    }

}

有人知道吗?请为此问题提出一些解决方案。

4

2 回答 2

7

尝试添加

android:configChanges="orientation|screenLayout|keyboardHidden|screenSize"

到你的主要活动。

另外:确保您的纹理都不是静态变量。不知道为什么,但是使用纹理的静态变量会使引擎恢复运行。

于 2013-09-17T17:27:48.507 回答
1

我有一个类似的问题,我通过在 Activity 的OnResume方法中重新加载所有纹理和字体来修复它。

编辑回答整形外科医生:

我有一个TextureCache缓存纹理的类。它工作正常,但在应用程序恢复时,所有纹理都会变成黑色。正如您所说,这似乎是静态变量的问题。我添加了一个clear清除静态数据的方法,并在应用程序恢复时调用它。

这是我的课:

public class TextureCache {
private static Map<String, ITextureRegion> textures = new HashMap<String, ITextureRegion>();
private static Context ctx;
private static TextureManager tm;

public static void clear() {
    textures.clear();
}


public static void init(Context pCtx, TextureManager pTm) {
    ctx = pCtx;
    tm = pTm;
}


public static ITextureRegion getTexture(String name) {
    ITextureRegion texture = textures.get(name);
    if (texture == null) {
        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inJustDecodeBounds = true;
        try {
            InputStream in = ctx.getResources().getAssets().open("gfx/" + name);
            BitmapFactory.decodeStream(in, null, opt);
        } catch (IOException e) {
            Log.e("TextureCache", "Could not load texture [" + name + "]", e);
        }
        BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
        BitmapTextureAtlas texAtlas = new BitmapTextureAtlas(tm, opt.outWidth, opt.outHeight, TextureOptions.DEFAULT);
        texture = BitmapTextureAtlasTextureRegionFactory.createFromAsset(texAtlas, ctx, name, 0, 0);
        texture1.load();    
        textures.put(name, texture);
    }
    return texture;
}
}

clear我在 Activity 中调用该方法onResume

@Override
protected synchronized void onResume() {
    TextureCache.clear();
    super.onResume();
}
于 2014-01-20T07:29:35.737 回答