2013-10-02 45 views
-1

因此,我的应用程序让用户在网格上放置块,如果用户用相同的套装或颜色排队3个或更多的块,则会发生某些事情。当玩家放置块I调用这个方法:我该如何阻止“IndexOutOfBoundsException”问题?

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

当你把3个或更多在一起,我调用这些方法:

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) 

这是为了去除块,但它导致了这种IndexOutOfBoundsException异常。有没有办法来防止这个错误?

这可能是因为数组自动排序元素的数量并将数量降低到数组中正确数目的元素,并且我仍然有标记为高于数组大小的元素。我仍然是新手,所以我的分析可能不正确。请提醒我,如果是这种情况,并帮助我找到解决办法。 谢谢。

edirted *润色()函数-------

@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); 
         } 
       } 
      } 

剩下的只是很长,只是检查其他块彼此相邻..

+1

首先尝试添加堆栈跟踪,第二个最有可能的错误将在那长长的一行,如何分裂的东西一点点,但所以你可以得到一个更好的stacktrace?创建一个实例并将其作为参数传递。这个错误意味着你正在为数组/列表等调用一个无效的索引。我打赌在这里:'新的Vector2(rect_mouse.x,rect_mouse.y)',但我不知道什么是Vector2。 – porfiriopartida

+0

您可以将堆栈跟踪添加到问题中。 – porfiriopartida

+0

因为无知,你分裂的东西是什么意思? Vector2是块的线,新块是类块的实例,块ID是块的类型,块计数是数组内块的索引号 – GfxandCode

回答

1

你是对的,当你删除块,索引改变。

但是,您不会显示什么类型的集合blocks_是(Vector2?,你写了吗?),但是,而不是跟踪元素的索引,只需跟踪元素本身并调用remove()来查找并删除元件。

+0

public array blocks_ = new Array ();并且它与上面的代码在同一个类中。 – GfxandCode

+0

您正在调用blocks_.get(0),是否可以更新代码以添加blocks_.add ..在哪里调用?还是这个类默认有任何元素? – porfiriopartida

+0

你是否在说:“我可以更新代码以返回被删除块的indexPosition?” Block类有几个元素public Block(Vector2 pos,int id,int index,int color,int suit){ – GfxandCode