2012-10-22 33 views
1

對不起,如果標題沒有多大意義。我正在Java Eclipse中製作一個Chip's Challenge風格的遊戲,其中像玩家,硬幣和可推塊等特殊的東西是一類。可推塊和玩家之間的交互需要大量的碰撞檢測邏輯,並且代碼越來越殘暴,因爲我必須對每個類的實例進行相同的邏輯檢查。例如:Java遊戲編程:對象的多個實例,以同樣的方式處理?

public void pb1TouchingBaddy() { 

    if (pb1.getTileX() == b1.getTileX() & pb1.getTileY() == b1.getTileY()) { 
     if (b1.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) { 
      pb1.move(0, -1); 
     } else if (b1.getbDown() == 1 
       & pb1.getTileY() + 1 != pb2.getTileY()) { 
      pb1.move(0, 1); 
     } else if (b1.getbRight() == 1 
       & pb1.getTileX() + 1 != pb2.getTileX()) { 
      pb1.move(1, 0); 
     } else if (b1.getbLeft() == 1 
       & pb1.getTileX() - 1 != pb2.getTileX()) { 
      pb1.move(-1, 0); 
     } 
    } 

    if (pb1.getTileX() == b2.getTileX() & pb1.getTileY() == b2.getTileY()) { 
     if (b2.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) { 
      pb1.move(0, -1); 
     } else if (b2.getbDown() == 1 
       & pb1.getTileY() + 1 != pb2.getTileY()) { 
      pb1.move(0, 1); 
     } else if (b2.getbRight() == 1 
       & pb1.getTileX() + 1 != pb2.getTileX()) { 
      pb1.move(1, 0); 
     } else if (b2.getbLeft() == 1 
       & pb1.getTileX() - 1 != pb2.getTileX()) { 
      pb1.move(-1, 0); 
     } 
    } 

    if (pb1.getTileX() == b3.getTileX() & pb1.getTileY() == b3.getTileY()) { 
     if (b3.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) { 
      pb1.move(0, -1); 
     } else if (b3.getbDown() == 1 
       & pb1.getTileY() + 1 != pb2.getTileY()) { 
      pb1.move(0, 1); 
     } else if (b3.getbRight() == 1 
       & pb1.getTileX() + 1 != pb2.getTileX()) { 
      pb1.move(1, 0); 
     } else if (b3.getbLeft() == 1 
       & pb1.getTileX() - 1 != pb2.getTileX()) { 
      pb1.move(-1, 0); 
     } 
    } 

    if (pb1.getTileX() == b4.getTileX() & pb1.getTileY() == b4.getTileY()) { 
     if (b4.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) { 
      pb1.move(0, -1); 
     } else if (b4.getbDown() == 1 
       & pb1.getTileY() + 1 != pb2.getTileY()) { 
      pb1.move(0, 1); 
     } else if (b4.getbRight() == 1 
       & pb1.getTileX() + 1 != pb2.getTileX()) { 
      pb1.move(1, 0); 
     } else if (b4.getbLeft() == 1 
       & pb1.getTileX() - 1 != pb2.getTileX()) { 
      pb1.move(-1, 0); 
     } 
    } 

所以你可以看到,如果語句都是完全相同的邏輯,只適用於同一對象的不同實例的這三個區塊。有沒有辦法寫這個,而不必重複自己這麼多?我能夠將四個方向運動邏輯變成一種方法,並認爲我是一個天才,但我無法弄清楚如何做一個類似的事情,但同一個對象的多個實例。現在,我被困在兩個可推動塊之前,我太困惑了,不能爲另一個邏輯做。希望有任何建議,謝謝!

+0

編寫一個方法,它接受任何對象'b1','b2','b3'和'b4'的實例,並以這種方式執行檢查。 – Whymarrh

+0

那麼有一種方法可以將一個對象的實例傳遞給一個方法? – user1048723

回答

2
private function move(PBClass pb1, PBClass pb2, BClass b) { 
    if (pb1.getTileX() == b.getTileX() & pb1.getTileY() == b.getTileY()) { 
     if (b.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) { 
      pb1.move(0, -1); 
     } else if (b.getbDown() == 1 
       & pb1.getTileY() + 1 != pb2.getTileY()) { 
      pb1.move(0, 1); 
     } else if (b.getbRight() == 1 
       & pb1.getTileX() + 1 != pb2.getTileX()) { 
      pb1.move(1, 0); 
     } else if (b.getbLeft() == 1 
       & pb1.getTileX() - 1 != pb2.getTileX()) { 
      pb1.move(-1, 0); 
     } 
    } 
} 

public void pb1TouchingBaddy() { 
    move(pb1, pb2, b1); 
    move(pb1, pb2, b2); 
    move(pb1, pb2, b3); 
    move(pb1, pb2, b4); 
} 

當然,你需要與你的實際的類名來代替PBClassBClass

如果你有對象的數組:

PBClass[] listPB = { pb1, pb2, pb3, pb4}; 
BClass[] listB = { b1, b2, b3, b4}; 

public void pb1TouchingBaddy() { 
    for (int i=0; i < listPB.length - 1; i+=2) { 
     for (int j=0; j < listB.length; j++) { 
      move(pb[i], pb[i+1], b[j]); 
     } 
    } 
} 

或者你也可以用同樣的方式

+0

我的意思是我想要某種方式,我不必每次都寫「pb1」「pb2」等。因此,我可以從技術上將實例升級到「pb100」,而無需在任何地方編寫pb59,pb60,pb61等。 – user1048723

+0

是你列表中的'pb'嗎?那麼'b's只有四個? –

+0

我的歉意,很確定這完全回答了我的問題。太愚蠢了,不知道你已經將我的代碼縮小了三分之一:D謝謝!試着實現這個系統,看看遊戲是否仍然表現一樣,非常感謝! – user1048723

2

將這些方法放在一個接口中,並使它們全部實現該接口。

使您的方法只對該接口感興趣,而不是擔心實際的具體類型可能是什麼。

+0

這會如何減少代碼? – Whymarrh

+0

謝謝你,我會研究這個。 – user1048723

2

使用ArrayList是你能需要某種Iterable收藏。這樣你就可以循環瀏覽它。

+0

但我仍然必須寫pb1,pb2,pb3等?我不能只做pbX並通過X?我可以做你寫的東西,但這不是我遇到的問題。我只想概括目標代碼,因此玩家將以同樣的方式處理對象的所有實例,而不必爲每個實例明確說出並添加50億行代碼。 – user1048723

+0

你需要循環。創建一個實現'Iterable'的類或者具有某種'Iterator'。或者使用['Collection']的一些子類(http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html)。 – Whymarrh

+0

對不起,你的代碼答案實際上幫了我很多,我只是不知道它在做什麼。去試試這種風格,謝謝!去看看收藏集,非常感謝。 – user1048723