2012-04-09 2 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/)에 블록을 저장하는 것이 좋습니다. .com/javase/tutorial/collections/intro/index.html) – Richante

답변

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 루프 안에 넣을 수 있습니다.

또 다른 요점은 블록이 스프라이트의 위쪽, 아래쪽, 앞쪽 또는 뒤쪽에있을 수 있고 충돌 논리가 각 경우마다 다를 수 있다는 것입니다. 블록 객체에서 위치를 설정하고 for-each 루프에서도 위치를 확인할 수 있습니다.

나는 블록의 배열, 런타임시 뷰에 블록 업데이트됩니다 추측 등

0

당신은 블록과 "등록"을 생성하는 "팩토리 메서드"이라고 원하는 패턴입니다. 여기에 그것을 할 것입니다 코드입니다 (I 대답에 직접적으로 관련이없는 모든 코드를 남겨 두었다 그리고 당신이 물건을 채우기 위해해야 ​​할 수도 있습니다 곳 ...을 사용) :

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()를 사용 메서드 (이것은 새로운 블록이 등록됨을 의미 함)
스프라이트가 충돌했는지 확인할 때마다 if (Block.hasCollided(someSprite))

관련 문제