0

我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否触及了一个块。但是必须复制、粘贴和编辑每个代码将花费很多时间,因为我将在每个级别上大约有 200 个块......这里是碰撞检测,有没有办法可以进行循环以便所有块都得到分配的值会发生变化,例如,第一个将是“block.bottomry”,第一个是“block2.bottomry”,第二个是“block2.bottomry”,第三个是“block3.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

我从你那里得到的问题是块是固定的,而精灵是移动/浮动的。由于块是固定的,您可以将它们放在一个数组中,并将此冲突逻辑放在 for-each 循环中。

另一点是块可以在精灵的上方、下方、前方或后方,并且每种情况下的碰撞逻辑都会有所不同。在块对象中,您可以设置位置并在 for-each 循环中进行检查。

我猜 Blocks 的数组将在运行时使用 Block in view 进行更新,等等。

于 2012-04-09T13:09:56.010 回答
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 回答