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

Java 我可以为对象的每个实例创建一个循环吗?,java,loops,collision-detection,Java,Loops,Collision Detection,我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否碰到了块。但是,必须复制、粘贴和编辑每一个代码将花费很多时间,因为我将有大约200块在每个级别上。。。这里是碰撞检测,是否有任何方法可以进行循环,以便分配所有块,并更改值,因此,对于eg的第一个块,第一个块将为“block.bottomry”,然后第二个块将为“block2.bottomry”,第三个块将为“block3.bottomry”,依此类推,直到所有块都消失。以下是部分代码: public void iscollided

我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否碰到了块。但是,必须复制、粘贴和编辑每一个代码将花费很多时间,因为我将有大约200块在每个级别上。。。这里是碰撞检测,是否有任何方法可以进行循环,以便分配所有块,并更改值,因此,对于eg的第一个块,第一个块将为“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");


        }
public void iscollided(){
//右下触摸块?
如果(sprite.bottomrxblock.bottomlx&&sprite.bottomryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//左下触摸块?
如果(sprite.bottomlxblock.bottomlx&&sprite.bottomlyblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//右上触摸块?
如果(sprite.toprxblock.bottomlx&&sprite.topryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//左上触摸块?
如果(sprite.toprxblock.bottomlx&&sprite.topryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!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!!!!!!!!!!!!");
            }
        }
    }
}
公共类Foo{
private SpecialSprite sprite=新SpecialSprite();
私有列表块=新的ArrayList();
公共void addBlocks(){
块。添加(新块(…);
块。添加(新块(…);
块。添加(新块(…);
}
公共空间是集合的(){
用于(块:块){
//每个块的碰撞检测。
如果(sprite.bottomrx

编辑:更具体的例子。

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

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


我猜块数组将在运行时使用视图中的块进行更新,等等。

您想要的模式称为“工厂方法”,它创建块并“注册”它。下面是可以执行此操作的代码(我省略了所有与答案不直接相关的代码,并在您可能需要填写的地方使用了
):

公共类块{
私有静态最终列表块=新的ArrayList();
//私有构造函数意味着每个人都必须通过“create()”,
//这就是你想要的,所以他们都注册了
专用块(…){
...
}
公共静态块创建(…){
块=新块(…);
块。添加(块);
}
公共静态布尔值已碰撞(精灵精灵){
用于(块:块){
如果(sprite.bottomlxblock.bottomlx&&sprite.bottomlyblock.topry){
返回true;
}
}
返回false;
}
}
无论何时创建
,请使用
Block.create()
方法(这意味着注册新块)

当你想检查一个精灵是否已经发生冲突时,使用<代码>(块.HasBrimeDead(SoSePrITE))

看起来你应该考虑把你的块存储在一个
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;
    }
}