2012-04-09 153 views
0

我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否碰到了一个块。但是不得不复制粘贴和编辑每个代码会花费很多时间,因为我将在每个级别上有大约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"); 


     } 
+1

它看起来像你应该考虑存储在[收藏](http://docs.oracle您块的.com/JavaSE的/教程/集合/前奏/ index.html的) – Richante 2012-04-09 13:01:54

回答

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!!!!!!!!!!!!"); 
      } 
     } 
    } 
} 

编辑:更具体的例子。

0

我从你那里得到的问题是,块是固定的,精灵正在移动/浮动。由于块是固定的,你可以把它们放在一个数组中,并把这个碰撞逻辑放在for-each循环中。另一点是Block可以位于精灵的上方,下方,前方或后方,碰撞逻辑在每种情况下都会不同。在块对象中,您可以设置位置并在每个循环中检查。

我想块阵列将与块鉴于在运行时被更新,等等

0

要被称为“工厂方法”,它创建块和“寄存器”,它的图案。下面是一个会做它的代码(我已经离开了所有的代码不直接相关的答案和使用...,你可能在填写的东西):当你创建一个Block

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.create()方法(这意味着新的块被注册)
每当你想检查一个精灵发生了碰撞时,使用if (Block.hasCollided(someSprite))

相关问题