2013-10-02 2 views
-1

그래서이 앱을 사용하면 사용자가 그리드 위에 블록을 배치 할 수 있습니다. 사용자가 동일한 슈트 또는 색상으로 3 개 이상의 블록을 정렬하면 어떤 일이 발생합니다. 당신이 3 배치 이상 함께 나는이 방법을 호출 할 때이 "IndexOutOfBoundsException"문제를 어떻게 중지합니까?

blocks_.add(new Block(new Vector2(rect_mouse.x, rect_mouse.y), blocks_.get(0).blockID, blockCount)); 

: :이 경우 IndexOutOfBoundsException 결과

blocks_.removeValue(blocks_.get(left_bravo_indexNum), true); 
    blocks_.removeValue(blocks_.get(center_charlie_indexNum), true); 
    blocks_.removeValue(blocks_.get(right_alpha_indexNum), true); 


    stack: 
    Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: 13 
at com.badlogic.gdx.utils.Array.get(Array.java:125) 
at com.jrp.mygearapp.GameScreen.touchUp(GameScreen.java:1443) 
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:297) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:186) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110) 

는 블록을 제거하도록 구성 되었으나을 플레이어가 블록을 배치 할 때 나는이 메소드를 호출 . 이 오류를 방지 할 수있는 방법이 있습니까?

배열이 자동으로 요소 수를 정렬하고 배열의 요소 수를 줄이고 배열의 크기보다 높은 레이블이 붙은 요소가 있으므로이 문제가 발생할 수 있습니다. 나는 아직 초보자이므로 제 분석이 잘못되었을 수 있습니다. 이 경우 알려 주시고 수정 방법을 찾도록 도와주십시오. 감사합니다. .

나머지는 정말 긴 바로 옆에 서로 다른 블록에 대해 점검 -------

@Override 
    public boolean touchUp(int x, int y, int pointer, int button) { 

    if (button == 0) { 

     display_blockCheck = false; 

     ////set blockCount to the size of blockArray so blocks can properly be indexed    
     blockCount = blocks_.size; 

     if (!overlap) { 

      Gdx.app.log("Block Added", "x: " + x + " y: " + y); 

      updateQueueBlocks(); 


      //add block 
      Vector2 rect_vector = new Vector2(rect_mouse.x, rect_mouse.y); 
      Block block = new Block(rect_vector,blocks_.get(0).blockID, blocks_.size); 

      blocks_.add(block);    

    if (center_charlie_suit == "Square") { 

       center_charlie_bool = true; 

       if (right_bravo_suit == "Square") { 

        right_bravo_bool = true; 

        if (right_alpha_suit == "Square") { 

         Gdx.app.log("3-pair", "Square:345:lr"); 

         right_alpha_bool = true; 

         //call 3-pair event 
         blocks_.removeValue(blocks_.get(center_charlie_indexNum), true); 
         blocks_.removeValue(blocks_.get(right_alpha_indexNum), true); 
         blocks_.removeValue(blocks_.get(right_bravo_indexNum), true); 
         } 
       } 
      } 

* 터치 업() 함수를 .. edirted

+1

먼저 stacktrace를 추가하려고합니다. 두 번째로 오류가 긴 줄에있을 것입니다. 분할 된 작업은 조금 있지만 어쨌든 더 나은 스택 추적을 얻을 수 있습니까? 인스턴스를 생성하고 인수로 전달하십시오. 이 오류는 배열/목록/등의 잘못된 색인을 호출하고 있음을 의미합니다. 나는 여기에있다 :'새로운 Vector2 (rect_mouse.x, rect_mouse.y)'하지만 나는 무엇이 Vector2인지 모른다. – porfiriopartida

+0

스택 추적을 질문에 추가 할 수 있습니다. – porfiriopartida

+0

무지로 울부 짖는 다. 물건을 나눠서 무엇을 의미합니까? Vector2는 블록의 코드이고, 새로운 Block은 클래스 Block의 인스턴스이고, blockID는 어떤 유형의 블록이며, block count는 배열 내에있는 블록의 인덱스 번호입니다. – GfxandCode

답변

1

당신 말이 맞아요, 당신이 블록을 제거하면 인덱스가 바뀝니다.

컬렉션의 blocks_ 유형을 (Vector2?, 작성 했습니까?) 표시하지는 않지만 요소의 색인을 추적하는 대신 요소 자체를 추적하고 remove()을 호출하여 해당 요소를 찾아서 제거하십시오 요소.

+0

public Array blocks_ = new Array (); 그리고 위의 코드와 같은 클래스 내에 있습니다 .. – GfxandCode

+0

당신은 blocks_.get (0)을 호출하고 있습니다, 당신은 blocks_.add ..가 추가되는 코드를 업데이트 할 수 있습니까? 또는이 클래스는 기본적으로 어떤 요소를 가지고 있습니까? – porfiriopartida

+0

당신은 "내가 삭제되는 블록의 indexPosition을 반환하도록 코드를 업데이트 할 수 있습니까?"라고 말하고 있습니까? Block 클래스에는 몇 가지 요소가 있습니다. public 블록 (Vector2 pos, int id, int index, int color, int suit) { – GfxandCode

관련 문제