11

現在、すべてのスプライトへの静的参照があり、SimpleBaseGameActivityのOnCreateResource mthodでそれらをロードして初期化していますが、今度は、スパーツのonAreaTouchedリスナーと、スプライトの初期化中にオーバーライドできる方法をオーバーライドする必要があります。しかし、すべてのスプライトに対してアトラスとテクスチャ領域を作成する静的メソッドがあります。そして、シーンクラスでこれらのスプライトを使用しており、そこでonAreaTouchedをオーバーライドしたいと思います。シーン内のその特定のスプライトにTouchAreaを登録して実行できるようにすることはできますが、コードの再利用を実行できるようにOnAreaTouchedをオーバーライドしたいと思います。これが私が現在スプライトを作成してロードしている方法です。

defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444);

そして、これは私のメソッドcreateAndLoadSimpleSpriteです。

public static Sprite createAndLoadSimpleSprite(String name,
        SimpleBaseGameActivity activity, int width, int height) {

    BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas(
            activity.getTextureManager(), width, height);
    TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory
            .createFromAsset(atlasForBGSprite, activity, name, 0, 0);
    Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion,
            activity.getVertexBufferObjectManager());
    activity.getTextureManager().loadTexture(atlasForBGSprite);

    return sprite;
}

コードの再利用性を失わずに、一部のスプライトのonAreaTouchedをオーバーライドするにはどうすればよいですか。

4

2 に答える 2

8

実行時にテクスチャをロードする必要がある理由はありますか?通常の方法は、アプリケーションのロード中に必要なテクスチャをすべて1つのアトラスにロードして、後ですばやく使用できるようにすることです。

コードの再利用性に関しては、列挙型に関するTodiloのアイデアは、ほとんど必要なもののようです。たとえば、2種類のオブジェクトがあるとします。オブジェクトに触れると消えるオブジェクトと、触れると飛び上がるオブジェクトです。両方のカテゴリを列挙し、オブジェクトを非表示にするかフライアップするかをチェックするコードをタッチイベント処理コードに配置します。

アプリケーションを実行する前にオブジェクトがタッチで何をすべきかわからない場合は、同じ結果を達成するためのより動的な方法があります。実行時に2つのリストを作成し、オブジェクトがタッチされたときに何をすべきかに従って、リストの1つにオブジェクトへの参照を配置するだけです。次に、タッチイベント処理で次のようにします。

if (disappearList.contains(touchedObject)) {
    disappear(object)
}
if (flyUpList.contains(touchedObject)) {
    flyUp(object)
}

残念なことに、AndEngineでは、ユーザーがスプライトにリスナーを設定することはできません。少し簡単になります。

編集:BlackPawnTextureBuilderの使用に関する説明を追加:アトラスはBuildableBitmapTextureAtlasタイプである必要があり、次にこのようなすべてのテクスチャを追加します

BitmapTextureAtlasTextureRegionFactory.createFromAsset(buildableAtlas, this, "image.png"));

それとその後

try {
    this.buildableAtlas.build(new BlackPawnTextureBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(1));
} catch (final TextureAtlasSourcePackingException e) {
    Debug.e(e);
}

これがアニメーション化されたスプライトで機能するかどうかはわかりません。試してみる必要があります。また、onTouchをオーバーライドすることはありません。これは、onAreaTouchedメソッドで行う必要があります。そのような状態の一例は

if (pSceneMotionEvent.getAction() == MotionEvent.ACTION_DOWN && disappearList.contains(pTouchArea)) {disappear();}
于 2012-07-23T09:42:47.973 に答える
0

ontouchをオーバーライドするよりも多くの機能が必要ではありませんか?onareaをオーバーライドする必要がある人や他のすべての必要がある人のために、スプライトを継承するクラスを作成するのはどうですか。

于 2012-07-17T14:11:28.830 に答える