0

オブジェクト「ブロック」のインスタンスがたくさんあります。スプライトがブロックに接触したかどうかを確認するために、衝突検出を追加する必要があります。しかし、各レベルに約200のブロックがあるため、各コードをコピーして貼り付けて編集する必要があると、かなりの時間がかかります...ここでは衝突検出です。ループを作成してすべてのブロックを取得する方法はありますか?割り当てられ、値が変更されるため、たとえば、最初のブロックでは「block.bottomry」、2番目と3番目の「block2.bottomry」は「block2.bottomry」となり、すべてのブロックが次のようになります。なくなった。コードの一部は次のとおりです。

public void iscollided() {
        // bottom right touching block?
        if (sprite.bottomrx < block.bottomrx && sprite.bottomrx > block.bottomlx && sprite.bottomry < block.bottommy && sprite.bottomry > block.topry ){
                Log.d(TAG, "Collided!!!!!!!!!!!!1");


        }

        // bottom left touching block?
        if (sprite.bottomlx < block.bottomrx && sprite.bottomlx > block.bottomlx && sprite.bottomly < block.bottommy && sprite.bottomly > block.topry ){
            Log.d(TAG, "Collided!!!!!!!!!!!!1");


        }
        // top right touching block?
        if (sprite.toprx < block.bottomrx && sprite.toprx > block.bottomlx && sprite.topry < block.bottommy && sprite.topry > block.topry ){
            Log.d(TAG, "Collided!!!!!!!!!!!!1");


        }
        //top left touching block?
        if (sprite.toprx < block.bottomrx && sprite.toprx > block.bottomlx && sprite.topry < block.bottommy && sprite.topry > block.topry ){
            Log.d(TAG, "Collided!!!!!!!!!!!!1");


        }
4

3 に答える 3

1

確かに:)ブロックをリストデータ構造に追加し、リストをループして各ブロックをチェックすることができます。

public class Foo {

    private SpecialSprite sprite = new SpecialSprite();
    private List<Block> blocks = new ArrayList<Block>();

    public void addBlocks() {

        blocks.add(new Block(...));
        blocks.add(new Block(...));
        blocks.add(new Block(...));
    }

    public void isCollided() {

        for(Block block : blocks) {

            // collision detection for each block.
            if(sprite.bottomrx < block.bottomrx ... ) {

                Log.d(TAG, "Collided!!!!!!!!!!!!");
            }
        }
    }
}

編集:より具体的な例。

于 2012-04-09T13:02:23.953 に答える
0

必要なパターンは「ファクトリ メソッド」と呼ばれ、ブロックを作成して「登録」します。これを行うコードは次のとおりです(回答に直接関係のないすべてのコードを省略し、入力...が必要な場所で使用しました):

public class Block {

    private static final List<Block> BLOCKS = new ArrayList<Block>();

    // A private constructor means everyone has to go through `create()`,
    // which is what you want so they all get registered
    private Block(...) {
        ...
    }

    public static Block create(...) {
        Block block = new Block(...);
        BLOCKS.add(block);
    }

    public static boolean hasCollided(Sprite sprite) {
        for (Block block : BLOCKS) {
            if (sprite.bottomlx < block.bottomrx && sprite.bottomlx > block.bottomlx && sprite.bottomly < block.bottommy && sprite.bottomly > block.topry ) {
                return true;
            }
        }
        return false;
    }
}

を作成するときはいつでもBlock、 メソッドを使用しますBlock.create()(これは新しいブロックが登録されることを意味します)
スプライトが衝突したかどうかを確認したいときはいつでも、使用しますif (Block.hasCollided(someSprite))

于 2012-04-09T13:23:04.253 に答える
0

あなたの質問から得たのは、ブロックが固定され、スプライトが移動/フローティングしているということです。ブロックは固定されているため、ブロックを配列に入れて、この衝突ロジックを for-each ループ内に配置できます。

もう 1 つのポイントは、ブロックがスプライトの上、下、前、または後ろにある可能性があり、衝突ロジックがそれぞれの場合で異なることです。ブロック オブジェクトでは、位置を設定し、for-each ループでも確認できます。

ブロックの配列は、実行時にビュー内のブロックで更新されると思います。

于 2012-04-09T13:09:56.010 に答える