我可以为对象的每个实例创建一个循环吗?

时间:2012-04-09 12:57:27

标签: java loops collision-detection

我有很多对象“Block”的实例,我需要添加一个碰撞检测来查看我的sprite是否触及了一个块。但是必须复制,粘贴和编辑每个代码需要花费很多时间,因为我将在每个级别上有大约200个块...在这里它是碰撞检测,是否有可能做出循环所以所有块得到分配和值改变,所以对于第一个,例如将是第一个'block.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");


        }

3 个答案:

答案 0 :(得分: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!!!!!!!!!!!!");
            }
        }
    }
}

编辑:更具体的例子。

答案 1 :(得分:0)

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

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

我想块的数组将在运行时使用Block进行更新,等等。

答案 2 :(得分: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()方法(这意味着新的Block会被注册)
每当您想要检查精灵是否发生碰撞时,请使用if (Block.hasCollided(someSprite))