У меня возникла проблема с работой внутри вызова обработчика. Проблема заключается в следующем: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]);
}
В проблемной линии, вы получите компиляции ошибки о: i не является конечной переменной? Попробуйте добавить 'final int id = i;' внутри «нового блока IUpdateHandler() {}» и измените на «float anyVar = sprite [id] .getX();» –
Нет, на самом деле я получаю ошибку времени «массив вне границ». Скажем, размер массива равен 6. Итак, последний элемент - 5. Но внутри UpdateHandler он «i» начинается с 6 и выдает ошибку. И я сделал «i» окончательный, даже сделал его глобальным, объявив как поле класса. – Nafis
Что ты сказал мне странно: 1.Не конечная локальная переменная (означает 'i' в указанном выше коде) не может быть доступна в анонимном внутреннем классе (означает внутри' new IUpdateHandler() {...} '), ее невозможно скомпилировать. 2. Вы сказали, что сделали «я» окончательным, как вы можете это сделать с i ++? Его тоже не следует компилировать. –