2012-04-09 102 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))

相關問題