2013-06-07 2 views
1

У меня возникла проблема с работой внутри вызова обработчика. Проблема заключается в следующем: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]); 
} 

Каждый раз, когда он показывает ошибку, говорящую о том, что я заканчиваю привязкой к массиву. Это означает, что вызов обработчика выполняется после окончания цикла, и поэтому я уже пересекаю его предел. Как я могу сделать что-то вроде выше правильно?

Edit:

Извините за мою предыдущую ошибку. Первая строка кода будет:

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

не так:

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

Я просто подумал, что эти линии не очень важно отметить, что именно поэтому сделал ошибку. Но проблема остается такой же.

Edit-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]); 
} 
+1

В проблемной линии, вы получите компиляции ошибки о: i не является конечной переменной? Попробуйте добавить 'final int id = i;' внутри «нового блока IUpdateHandler() {}» и измените на «float anyVar = sprite [id] .getX();» –

+0

Нет, на самом деле я получаю ошибку времени «массив вне границ». Скажем, размер массива равен 6. Итак, последний элемент - 5. Но внутри UpdateHandler он «i» начинается с 6 и выдает ошибку. И я сделал «i» окончательный, даже сделал его глобальным, объявив как поле класса. – Nafis

+0

Что ты сказал мне странно: 1.Не конечная локальная переменная (означает 'i' в указанном выше коде) не может быть доступна в анонимном внутреннем классе (означает внутри' new IUpdateHandler() {...} '), ее невозможно скомпилировать. 2. Вы сказали, что сделали «я» окончательным, как вы можете это сделать с i ++? Его тоже не следует компилировать. –

ответ

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]); 
} 
+0

Кстати, потому что вы опускаете какой-то код в комментарии (// много других действий), вам все равно нужно убедиться, что вы выполнили соответствующий конструктор Sprite для каждого спрайта [] ... –

+0

Ну, таким образом я держу только начальное значение «i». Но он не повторяется. «i» Только дает 0 для каждого обработчика. Кроме того, private предлагается как незаконный модификатор. Итак, я удалил его. :) – Nafis

+0

Извините, я не понимаю вашего комментария. Я не могу связать отношения между вашим комментарием и над моим кодом. –

0

Вы используете индекс переменной i в 2-х различных контекстах.

В своем коде вы делаете это перед циклом с использованием i как индекс массива:

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

затем внутри цикла, вы изменяете значение i и ссылки mm[i] и sprite[i].

Я предполагаю, что вы не правильно инициализирован mm массив нужного размера (spriteArrayLength)

0

Проблема что ваш обработчик обновления содержит ссылку на переменную i, но не оценивается до окончания цикла. Вместо того, чтобы удерживать ссылку на i, дать ему ссылку на конкретный спрайт, и для удобства чтения сделать его 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]); 
} 
Смежные вопросы