0

TMXTiledMap の上に配置される AndEngine HUD を作成しようとしています (私は AndEngine の初心者です)。最初は単純にするために、Android ドローアブルを使用して単純な四角形を作成します。アイデアは、これが画面の下部中央に位置し、その下のマップがさまざまな方向に移動しても移動しないということです。今のところ、私がしたいのは、その長方形を表示させることだけです。後で、長方形に他の機能を追加します。

私のドローアブルは次のように作成されます:

    ?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
        <corners
            android:radius="7dp" />
        <gradient
            android:startColor="#343434"
            android:endColor="#17171717"
            android:angle="270"
            android:useLevel="false"
            android:type="linear" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>

そして、私はそれを次のようなレイアウトに引き込みました:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="300dip"
    android:layout_height="100dip"
    android:orientation="horizontal" 
    android:layout_marginLeft="20dp"
    android:background="@drawable/menu_bkgrnd" >
</LinearLayout>

そして最後に、これを HUD として取り込もうとしているところです。

rect = new HUD();
ITouchArea container = (ITouchArea) findViewById(R.id.container);
this.rect.registerTouchArea(container);
rect.attachChild((IEntity) container);

ご覧のとおり、AndEngine を満たすために多くのキャストを行っていますが、これを実行すると、マップが完全にめちゃくちゃになります。私はこれについて正しく行っていますか?私のキャスティングは間違っていますか?(または両方かもしれません!)。

助けてくれてありがとう。

編集: Jong と正宗白布鞋が以下に提案したコードに基づいて、Java コードを次のように調整しました。

this.atlas = new BitmapTextureAtlas(null, 256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
this.atlas.load();
ITextureRegion drawable = BitmapTextureAtlasTextureRegionFactory.createFromResource(atlas, getApplicationContext(), R.drawable.myDrawable, 0, 0);
rect.attachChild(new Sprite(0, 0, drawable, this.getVertexBufferObjectManager()));

この時点で、私はまだこれを画面に表示しようとしています。サイズと位置は後で調整します。

すべてがエラーなしでコンパイルおよび実行されますが、私の画面は完全に混乱しています。

ご覧のとおり、AndEngine がインスタンス化を受け入れるようにするには、コンストラクターの引数にいくつかの小さな調整を加える必要がありました。これを正しく行っているかどうかはわかりません。

このコードで見られるもう 1 つの問題は、このコードが非アクティブな図形を画面に配置するだけのように見えることです。元の投稿で、当面の目標はこの四角形を表示することだと言いましたが、最終的には応答する必要があるコントロールを備えたものになるため、登録されたタッチ領域として表示する必要があると思いますユーザーコマンドに。私がやろうとしていることを過度に最小化した場合は申し訳ありません。

私はまだこれを取得していません。誰か提案はありますか?再度、感謝します!

4

2 に答える 2

2

LinearLayoutにキャストすることはできません。 はITouchAreaITouchAreaAndEngine クラスによってのみ実装されるインターフェイスです。

正宗白布鞋が提案したように、 のcreateFromResource方法を使用する必要がありBitmapTextureAtlasTextureRegionFactoryます。

次のコードを使用できます。

BitmapTextureAtlas atlas = new BitmapTextureAtlas(sizeX, sizeY, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
TextureRegion drawable = BitmapTextureAtlasTextureRegionFactory.createFromResource(atlas, getApplicationContext(), R.drawable.drawableId, 0, 0);
rect.attachChild(new Sprite(x, y, drawable));

編集:

スプライトをタッチ イベントに応答させたい場合は、rectHUD でスプライトをタッチ エリアとして登録できます。

Sprite sprite = new Sprite(x, y, drawable, getVertexBufferObjectManager()) {
    @Override
    public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pX, final float pY) {
        //Do what you want here
    }
}
rect.registerTouchArea(sprite);
rect.attachChild(sprite);
于 2012-11-30T12:09:51.983 に答える
0

数日前に同じ問題が発生しましたが、適切な答えが見つかりませんでした。さまざまなソースから情報を収集したので、これにどのように対処したかを次に示します。

createFromResource(atlas, getApplicationContext(), R.drawable.drawableId, 0, 0)私の知る限り、からのメソッドBitmapTextureAtlasTextureRegionFactoryは XML ドローアブル ( など<shape>...</shape>) を処理できないようです。
確かに、色付きの四角形のみを表示していたときはすべて問題ありませんでした (PNG ファイルも同様だと思いますSprite) NullBitmapException

私が取った手順:

  • ドローアブル リソースをDrawable
  • Drawableに変換Bitmapソースはこちら
  • に変換BitmapTextureRegionます(これは私がこれを使用した場所です)
  • Spriteから1 つ作成します(ここTextureRegionのように、選択/選択解除の場合は 2 つ)
  • ゲームSpriteHUD

だから、コードで:

ドローアブル リソースを変換するTextureRegion

/**
 * Takes a drawable, and converts it to a TextureRegion.
 * @param context
 * @param resId the drawable ID
 * @param textureSizeX width for our TextureRegion
 * @param textureSizeY height for our TextureRegion
 * @return a TextureRegion from the drawable
 */
public static TextureRegion textureRegionFromDrawable(BaseGameActivity context, int resId, int textureSizeX, int textureSizeY) {
    Drawable drawable = context.getResources().getDrawable(resId);
    Bitmap bitmap = drawableToBitmap(drawable);
    BitmapTextureAtlasTextureSource source = new BitmapTextureAtlasTextureSource(bitmap);
    BitmapTextureAtlas textureAtlas = new BitmapTextureAtlas(context.getTextureManager(), textureSizeX, textureSizeY);
    textureAtlas.addTextureAtlasSource(source, 0, 0);
    textureAtlas.load();
    TextureRegion textureRegion = (TextureRegion) TextureRegionFactory.createFromSource(textureAtlas, source, 0, 0);
    return textureRegion;
}
// Drawable to Bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable) drawable).getBitmap();
    }
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

ユーティリティ中間クラス

public class BitmapTextureAtlasTextureSource extends BaseTextureAtlasSource implements IBitmapTextureAtlasSource {
    private final int[] mColors;
    public BitmapTextureAtlasTextureSource(Bitmap pBitmap) {
        super(0, 0, pBitmap.getWidth(), pBitmap.getHeight());
        mColors = new int[mTextureWidth * mTextureHeight];
        for (int y = 0; y < mTextureHeight; ++y) {
            for (int x = 0; x < mTextureWidth; ++x) {
                mColors[x + y * mTextureWidth] = pBitmap.getPixel(x, y);
            }
        }
    }
    @Override
    public Bitmap onLoadBitmap(Config pBitmapConfig) {
        return Bitmap.createBitmap(mColors, mTextureWidth, mTextureHeight, Bitmap.Config.ARGB_8888);
    }

    @Override
    public IBitmapTextureAtlasSource deepCopy() {
        return new BitmapTextureAtlasTextureSource(Bitmap.createBitmap(mColors, mTextureWidth, mTextureHeight, Bitmap.Config.ARGB_8888));
    }

    @Override
    public Bitmap onLoadBitmap(Config pBitmapConfig, boolean pMutable) {
        // TODO Auto-generated method stub
        return null;
    }
}

Spriteから2 つを作成し (ボタンに 2 つTextureRegion状態が必要でした: 選択済み/未選択)、それらをHUD

int textureSizeX = 512, textureSizeY = 512;
TextureRegion textureDefault = AndEngineUtils.textureRegionFromDrawable(activity, R.drawable.custom_menu_button, textureSizeX, textureSizeY);
TextureRegion textureSelected = AndEngineUtils.textureRegionFromDrawable(activity, R.drawable.custom_menu_button_selected, textureSizeX, textureSizeY);
mGameHUD = new HUD();

// 2 sprites for selected and unselected
final Sprite buttonUnselected, buttonSelected ;
buttonSelected = new Sprite(0, 0, textureSelected, activity.getVertexBufferObjectManager());
buttonSelected.setVisible(false);

buttonUnselected = new Sprite(0, 0, textureDefault, activity.getVertexBufferObjectManager()) {
    @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
        switch (pSceneTouchEvent.getAction()) {
        case TouchEvent.ACTION_DOWN:
            // Change button
            buttonSelected.setVisible(true);
            this.setVisible(false);
            break;
        case TouchEvent.ACTION_UP:
            // reset button
            this.setVisible(true);
            buttonSelected.setVisible(false);
            break;
        default:
            break;
        }
        return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
    }
};
mGameHUD.attachChild(buttonSelected);
mGameHUD.attachChild(buttonUnselected);
mGameHUD.registerTouchArea(buttonUnselected);
camera.setHUD(mGameHUD);

またscene.setOnAreaTouchListener(touchListener)、「不要な」スライド ジェスチャ (ボタンの外側まで) を使用して、ボタンの色をリセットする効果を得ることができます (このスレッドを参照)。

使い始めたばかりAndEngineで、ベスト プラクティスにまだ慣れていないので、お気軽に修正してください。

于 2013-09-03T07:06:20.283 に答える