2013-10-04 5 views
1

lemme попробуйте объяснить, что происходит сейчас: когда я помещаю 3 «X» рядом друг с другом, я просто хочу их удалить, но его единственная часть времени, иногда она удаляет все из них, а в других случаях она удаляет только 1 или только 2 из них. Блоки являются экземплярами класса Block, помещаемого в arraylist .... Кроме того, для более широкого понимания: я буду беспорядочно размещать блоки по всей сетке и пытаться заполнить ее, иногда, когда я добавляю блоки в сетку другим блоки начинают исчезать. Кроме того, когда я заполняю большую часть сетки, я пойду вперед и начну их удалять, но когда я начинаю парить над блоками и щелкаю их правой кнопкой мыши, чтобы удалить их, другие блоки будут удалены, а не один из них. Как вы видите, blockCount - это число, которое возвращается, когда вы наводите указатель мыши на блок, другими словами, его индексный номер объекта внутри arraylist (иногда это не похоже на это). Что происходит с арраистом?как исправить эту проблему с массивом?

Heres the stackTrace of whats happens: очевидно, что-то делать с попыткой удалить индекс, который больше не существует? что я могу сделать? я иду об этом неправильно? Это StackTrace моя Большая проблема кастрированный баран я удалить блоки по отдельности или когда я пытаюсь и матч 3 в ряд, я получаю этот индекс больше, то ошибка размер .. плз помочь потерянную душу ....

 Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: Index: 21, Size: 14 
at java.util.ArrayList.rangeCheck(Unknown Source) 
at java.util.ArrayList.remove(Unknown Source) 
at com.jrp.mygearapp.GameScreen.touchUp(GameScreen.java:1176) 
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) 

этого метод TouchUp():

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

    if (button == 0) { 

    display_blockCheck = false; 

    if (!overlap) { 

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

     updateQueueBlocks(); 

     //add block 

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

     for (Block b : getBlocks_L()) { 

      //check alpha/bravo cross intersections 
      if (Intersector.overlapRectangles(b.getBounds(), left_bounds_alpha)) { 

       //set indexNum, color, and suit to temporary variables for text info 

       //get block indexNum 
       left_alpha_indexNum = b.indexNum; 
       //get block color 
       left_alpha_color = b.color_str; 
       //get block suit 
       left_alpha_suit = b.suit_str; 


      } 

      if (Intersector.overlapRectangles(b.getBounds(), left_bounds_bravo)) { 

       //get block indexNum 
       left_bravo_indexNum = b.indexNum; 
       //get block color 
       left_bravo_color = b.color_str; 
       //get block suit 
       left_bravo_suit = b.suit_str; 


      } 

      if (Intersector.overlapRectangles(b.getBounds(), right_bounds_alpha)) { 

       //get block indexNum 
       right_alpha_indexNum = b.indexNum; 
       //get block color 
       right_alpha_color = b.color_str; 
       //get block suit 
       right_alpha_suit = b.suit_str; 



      } 

      if (Intersector.overlapRectangles(b.getBounds(), right_bounds_bravo)) { 

       //get block indexNum 
       right_bravo_indexNum = b.indexNum; 
       //get block color 
       right_bravo_color = b.color_str; 
       //get block suit 
       right_bravo_suit = b.suit_str; 



      } 

      //center bounding box for cross checker 
       if (Intersector.overlapRectangles(rect_mouse, b.getBounds())) { 

       //get block indexNum 
       center_charlie_indexNum = b.indexNum; 
       //get block color 
       center_charlie_color = b.color_str; 
       //get block suit 
       center_charlie_suit = b.suit_str; 

       } 


      if (Intersector.overlapRectangles(b.getBounds(), top_bounds_alpha)) { 

       //get block indexNum 
       top_alpha_indexNum = b.indexNum; 
       //get block color 
       top_alpha_color = b.color_str; 
       //get block suit 
       top_alpha_suit = b.suit_str; 


      } 

      if (Intersector.overlapRectangles(b.getBounds(), top_bounds_bravo)) { 

       //get block indexNum 
       top_bravo_indexNum = b.indexNum; 
       //get block color 
       top_bravo_color = b.color_str; 
       //get block suit 
       top_bravo_suit = b.suit_str; 


      } 

      if (Intersector.overlapRectangles(b.getBounds(), bottom_bounds_alpha)) { 

       //get block indexNum 
       bottom_alpha_indexNum = b.indexNum; 
       //get block color 
       bottom_alpha_color = b.color_str; 
       //get block suit 
       bottom_alpha_suit = b.suit_str; 


      } 

      if (Intersector.overlapRectangles(b.getBounds(), bottom_bounds_bravo)) { 

       //get block indexNum 
       bottom_bravo_indexNum = b.indexNum; 
       //get block color 
       bottom_bravo_color = b.color_str; 
       //get block suit 
       bottom_bravo_suit = b.suit_str; 



      } 
//X******************************************************************************************* 
if (left_alpha_suit == "X" && left_bravo_suit == "X" && center_charlie_suit == "X") { 

      Gdx.app.log("3-pair", "X:123:lr"); 

      blocks_L.remove(left_alpha_indexNum);   
      blocks_L.remove(left_bravo_indexNum);  
      blocks_L.remove(center_charlie_indexNum -2); 

      //blocks_.removeValue(blocks_.get(left_alpha_indexNum), true);    
      //blocks_.removeValue(blocks_.get(left_bravo_indexNum), true);   
      //blocks_.removeValue(blocks_.get(blockCount), true);    
      //blocks_.removeValue(blocks_.get(center_charlie_indexNum), true); 

     } 

if (left_bravo_suit == "X" && center_charlie_suit == "X" && right_bravo_suit == "X") { 

      Gdx.app.log("3-pair", "X:234:lr"); 

      blocks_L.remove(left_bravo_indexNum);  
      blocks_L.remove(right_bravo_indexNum); 
      blocks_L.remove(center_charlie_indexNum -2); 

      /*blocksRemove_.add(blocks_.get(left_bravo_indexNum)); 
      blocksRemove_.add(blocks_.get(center_charlie_indexNum)); 
      blocksRemove_.add(blocks_.get(right_bravo_indexNum)); 

      blocks_.removeAll(blocksRemove_, true);*/ 
     } 

if (center_charlie_suit == "X" && right_bravo_suit == "X" && right_alpha_suit == "X") { 

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

      blocks_L.remove(right_alpha_indexNum); 
      blocks_L.remove(right_bravo_indexNum); 
      blocks_L.remove(center_charlie_indexNum -2);  

      /*blocksRemove_.add(blocks_.get(center_charlie_indexNum)); 
      blocksRemove_.add(blocks_.get(right_alpha_indexNum)); 
      blocksRemove_.add(blocks_.get(right_bravo_indexNum)); 
      blocks_.removeAll(blocksRemove_, true);*/ 

     } 
} 

button01bool = false; 

    } 

if (button == 1) { 

    if (overlap) { 

     //remove block  
     //blocks_.removeValue(blocks_.get(blockCount), true);  

     blocks_L.remove(blockCount); 

    } 

    button02bool = false; 

    } 

    return false; 
} 

это метод mouseMoved():

@Override 
    public boolean mouseMoved(int x, int y) { 

    camera.unproject(tmp1.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 

    mouseVec.x = tmp1.x ; 
    mouseVec.y = tmp1.y ; 

    rect_mouse.x = (int)mouseVec.x; 
    rect_mouse.y = (int)mouseVec.y; 


    for (Block b : getBlocks_L()) { 


    if (Intersector.overlapRectangles(rect_mouse, b.getBounds())) { 

     //mouse and block overlap is true     
     overlap = true; 

     //get block index 
     blockCount = b.indexNum; 

     tmpColorStr = b.color_str; 
     tmpSuitStr = b.suit_str; 

     break; 

    } else { 

     overlap = false; 

     left_alpha_indexNum = 0; 
     left_alpha_color = ""; 
     left_alpha_suit = ""; 

     left_bravo_indexNum = 0; 
     left_bravo_color = ""; 
     left_bravo_suit = ""; 

     right_alpha_indexNum = 0; 
     right_alpha_color = ""; 
     right_alpha_suit = ""; 

     right_bravo_indexNum = 0; 
     right_bravo_color = ""; 
     right_bravo_suit = ""; 

     center_charlie_color = ""; 
     center_charlie_suit = ""; 
     center_charlie_indexNum = 0; 

     top_alpha_indexNum = 0; 
     top_alpha_color = ""; 
     top_alpha_suit = ""; 

     top_bravo_indexNum = 0; 
     top_bravo_color = ""; 
     top_bravo_suit = ""; 

     bottom_alpha_indexNum = 0; 
     bottom_alpha_color = ""; 
     bottom_alpha_suit = ""; 

     bottom_bravo_indexNum = 0; 
     bottom_bravo_color = ""; 
     bottom_bravo_suit = ""; 

    } 




    } 

ответ

0

Вы Шоул рассмотреть возможность использования массива, который предусмотрен самой libgdx. В основном это может сделать, что ArrayList способен, но быстрее и эффективнее.

Возможно, вы можете объяснить, что должен делать код? Очень сложно понять, что вы пытаетесь сделать, просто прочитав описание проблемы.

Массив может также удалить объект, передавая его индекс и с помощью метода

.removeIndex(int index); 

Может быть, это поможет вам.

EDIT:

Вы должны программка все как способ, что ни один массив вне связанного исключения никогда не может произойти. Попробуйте структуру программка так:

пример того, как ваш блок-класса может выглядеть следующим образом:

public class Block { 
    private int x,y; 
    public Block(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
    public boolean check(int x, int y) { 
     if(this.x == x && this.y == y) { 
     return true; 
     } else { 
     return false; 
     } 
    } 
} 

Тогда, когда Mouseclick [LeftClick] произошло:

int x = ...; 
int y = ...; 
calculate here x and y values of the clicked block by using a formular (don't use this slow overlay-stuff, when you're in a gridworld); 
boolean blockAlreadyExists = false; 
for(Block block: yourBlockArray) { 
    blockAlreadyExists = block.check(x, y); 
    if(blockAlreadyExists) { 
     break; // you don't need to check the remaining blocks, aslong you know that the block with the given x and y values already exists 
    } 
} 
if(!blockAlreadyExists) { 
    yourBlockArray.add(new Block(x, y); // add the new block, when it's not already there 
} 

Тогда, когда Mouseclick [RightClick] произошло:

int x = ...; 
int y = ...; 
calculate your x and y values the same way as above; 
Block blockToDelete; 
for(Block block: yourBlockArray) { 
    if(block.check(x, y)) { 
     blockToDelete = block; 
     break; // you don't need to check the remaining blocks, aslong you deleted the clicked block and there cannot exist another one with the same x and y values. 
    } 
} 
if(blockToDelete != null) { 
    yourBlockArray.remove(blockToDelete, true); 
} 

может быть, это поможет вам :)

+0

Вначале я использовал массивы, затем переключился на arraylist, чтобы узнать, будет ли это иначе, и это было немного лучше, но такая же проблема. если я удаляю объект в массиве с помощью массива, массив сортирует себя и любой объект, который был добавлен с номером индекса выше, чем новый отсортированный размер создает «IndexOutOfBoundsException», и именно там я застрял .. – GfxandCode

+1

Ive работает так трудно найти решение этой проблемы и/или работу вокруг так долго .... Chrise ты бог среди богов спасибо человека, я хотел бы показать свою признательность, это действительно помогло, и теперь я может продолжить игру thx thx thx: D – GfxandCode

+0

Мне нравится факт, что я мог бы помочь вам! пожалуйста :) – TheWhiteLlama

Смежные вопросы