0

この質問はandengineGL-ES1に言及しています。

戻ったとき、またはユーザーがゲーム内でアクションを実行したときに更新される壁紙アクティビティを作成するのに問題があります。

私のゲームには2つのアクティビティがあります。1つでは、部屋の背景要素を編集して配置できます。もう1つはゲームをプレイし、最初のアクティビティで配置した要素と同じ背景を使用します。

部屋を背景にしてキャラクターがその前を動き回るライブ壁紙もあります。

壁紙のonResume()でupdtaesを作成しています。

最初に、以前に使用したすべてのバックグラウンドスプライトを切り離します。次に、更新された位置に新しいスプライトをアタッチします。

何が起こるかです:いくつかのスプライトは現れません。

方法は次のとおりです。私が間違っていることがわかりますか?

    private void loadBackgroundDecorations() {
    //Add new decorations
    Log.d(TAG, "loadBackgoundDecorations");
    mEngine.runOnUpdateThread(new Runnable() {          
        @Override
        public void run() {
            // Remove Old Decorations
            Log.d(TAG, "loadBackgoundDecorations: decorationList.size() =" + decorationList.size());
            while(decorationList.size() > 0){
                Sprite d = decorationList.remove(0);
                scene.detachChild(d);
                Log.d(TAG, "loadBackgoundDecorations: detachChild");
            }
            decorationList.clear();
            //Add new decorations
            ArrayList<Integer> decorations = app.getBackgroundManager().getDecorations();
            Log.d(TAG, "loadBackgoundDecorations: decorations.size()" +decorations.size());
            for (int i = 0; i < decorations.size(); i+=3) {
                Log.d(TAG, "Decoration Values: texture-"+decorations.get(i)+", x-"+decorations.get(1+i)+", y-"+decorations.get(2+i));                   
                Sprite draggable = new Sprite(decorations.get(1+i),decorations.get(2+i),mGameTextureRegionLibrary.get(decorations.get(i)));
                draggable.setIgnoreUpdate(true);
                scene.attachChild(draggable,0);                 
                decorationList.add(draggable);
                Log.d(TAG, "loadBackgoundDecorations: attachChild"+ i);
            }
        }
    });


}

@Override protected void onResume() {
    super.onResume();               
    Log.d(TAG, "onResume");
    BitmapTextureAtlasTextureRegionFactory.createFromAsset(mTexture, this, app.getAquariumBackground(), 0, 0);
    addBubbles();
    loadBackgroundDecorations();
    addCharacters()
}

============更新=================以下に提案されているように、すべてのシーン設定関数をランナブルに追加してみました。これは効果がありません。私にとってうまくいったのは、「間違った」装飾の可視プロパティを「false」に設定することです。しかし、スプライトの複製が壁紙に隠されているため、これによって最終的にメモリリークが発生するのではないかと心配しています。この問題は、「detachChild」を呼び出した場合にのみ発生します。どういうわけか、「attachChild」が正しく発火するのを妨げているようです。誰かがこれを引き起こしている可能性があるものについてのアイデアを持っていますか?

onResume関数でスプライトを追加および削除するアクティビティを他の誰かが作成できますか?

4

1 に答える 1

1

エラーが onResume メソッドに関係していることは確かです。メソッドの順序は次のとおりです。

addBubbles();
loadBackgroundDecorations();
addCharacters()

ただし、 loadBackgroundDecorations は runnable を使用するため、メソッドがその間に実行されるという保証はありません。

私の説明:

私が理解していることから、addCharacter と addBubbles の両方が UIthread で実行されますが、loadBackgroundDecorations メソッドは更新スレッドで実行されます。2 つのスレッドは異なる時間にメソッドを通過するため、いくつかの不整合が見られます。

修正するには:

addBubbles と addCharacters を同じランナブルに必要な順序で配置すると、期待どおりに動作するはずです。

于 2013-02-25T22:24:44.493 に答える