AndEngine - 无法遍历处理程序调用中的数组项

时间:2013-06-07 13:43:54

标签: android andengine

我在处理程序调用中遇到问题。问题如下:

Sprite sprite = new Sprite[spriteArrayLength];
IUpdateHandler mm[i] = new ........// you know what
for(int i = 0; i < spriteArrayLength; i++){
   //many other actions
   mm[i] = new IUpdateHandler() {

       //do somthing with sprite array items
       float anyVar = sprite[i].getX();//problem rises here
   };
   sprite[i].registerUpdateHandler(mm[i]);
}

每次显示错误,表示我已超出数组范围。这意味着处理程序调用在循环结束后执行,因此我已经超过了它的限制。我怎样才能以适当的方式做出类似的事情?

修改:

抱歉我之前的错误。代码的第一行是:

Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new ........// you know what

不是这个:

Sprite sprite = new Sprite[spriteArrayLength];
IUpdateHandler mm[i] = new ........// you know what

我只是认为这一行不是很重要,这就是为什么犯了错误。但问题仍然存在。

修改-2:

我得到“数组越界”类型运行时错误。假设,数组大小为6.因此,最后一个元素是5.但在UpdateHandler中,“i”以6开头并抛出错误。我尝试将“i”作为最终版本,甚至通过宣布作为一个类字段使其成为全局。我试图在这里编写短代码示例,因为它包含许多代码。更好的版本如下:

public int i;//global declaration
//inside some method:
Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new IUpdateHandler[spriteArrayLength];
for(i = 0; i < spriteArrayLength; i++){
    //many other actions
    mm[i] = new IUpdateHandler() {

       //do somthing with sprite array items
       float anyVar = sprite[i].getX();//problem rises here
    };
    sprite[i].registerUpdateHandler(mm[i]);
}

3 个答案:

答案 0 :(得分:1)

根据Edit-2中的代码,我的建议是:

Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new IUpdateHandler[spriteArrayLength];
for(i = 0; i < spriteArrayLength; i++){
    //many other actions
    mm[i] = new IUpdateHandler() {

       private final int id = i; /* add this line */
       // call Log.i() here is compiling error

       @Override
       public void onUpdate(float pSecondElapsed) {
           //do somthing with sprite array items
           /* And access id, instead of i in below code. 
              Here, I assume this statement is located 
              within onUpdate() or reset().
            */
           float anyVar = sprite[id].getX();
       }

       @Override
       public void reset() {
       }
    };
    sprite[i].registerUpdateHandler(mm[i]);
}

答案 1 :(得分:0)

您在2个不同的上下文中使用索引变量i

在代码中,在使用i作为数组索引的循环之前执行此操作:

IUpdateHandler mm[i] = new ........// you know what

然后在循环中,您正在更改i的值并引用mm[i]sprite[i]

我假设您没有正确地将mm数组初始化为正确的大小(spriteArrayLength

答案 2 :(得分:0)

问题是您的更新处理程序包含对变量i的引用,但直到循环结束后才会对其进行求值。不要保留对i的引用,而是给它一个特定sprite的引用,为了便于阅读,使它final避免任何可能改变的疑问:

for(i = 0; i < spriteArrayLength; i++){
    final Sprite currentSprite = sprite[i];

    //many other actions
    mm[i] = new IUpdateHandler() {
        //do somthing with sprite array items
        float anyVar = currentSprite.getX();
    };
    currentSprite.registerUpdateHandler(mm[i]);
}