#actionscript-3 #loops #error-handling
#actionscript-3 #циклы #обработка ошибок
Вопрос:
я получаю ошибку # 1010 при использовании этого цикла while:
while (pos.length>0)
{
coo = pos.splice(Math.floor(Math.random() * pos.length),1)[0];
(pos_array[index]).x = coo.x;
(pos_array[index]).y = coo.y;
index ;
}
Ошибка гласит: A term is undefined and has no properties.
Что не так с моим циклом, потому что я использовал тот же цикл для других программ, и я не получил такой ошибки.
Спасибо за внимание.
Комментарии:
1. Не могу сказать из этого кода. ‘pos’, ‘pos_array’, любой элемент в ‘pos_array’, любой элемент в ‘pos’ и ‘index’ могут быть неопределенными.
2. все они определены: var coo:Object: var pos_array:Array= новый массив(); var index:uint=0;
3. Что насчет элементов в ‘pos’ и ‘pos_array’? В какой строке выдается ошибка? В вашем распоряжении нет отладчика?
4. все в порядке. Я использовал отладчик, чтобы увидеть, какая это строка. и ошибка находится в цикле. но не знаю, где
5. Существует ли элемент в ‘pos_array’ уже при установке его свойства ‘x’? например, когда вы выполняете ‘(pos_array[0]).x = coo.x’, есть ли экземпляр класса с атрибутом x в этой позиции в массиве?
Ответ №1:
Ваш цикл while прерывается.
pos.length никогда не изменится и в конечном итоге pos_array[index]
выйдет за пределы.
Когда вы выходите за пределы, это не определено. Так что в основном вы делаете.
undefined.x = coo.x;
И точно так же, как ошибка говорит, что undefined не имеет свойств.
Я не вижу, как этот цикл когда-либо работал.
Попробуйте это вместо гораздо более чистого
var savedX:Number = 0
for each( var obj:Object in pos_array ){
coo = new MovieClip()
coo = pos.splice(Math.floor(Math.random() * pos.length),1)[0];
obj.x = savedX;
obj.y = 0;
savedX = coo.width;
}
Комментарии:
1. я попробовал это, и я не получил никакой ошибки, но mc не расположены рядом, как раньше. теперь они сложены. как я могу расположить их сбоку? у меня уже есть все сохраненные позиции в массиве pos
2. ваша логика ошибочна. вы используете массив для хранения позиций, что, однако, нормально, вы обращаетесь к ним случайным образом, что позволяет использовать одну позицию более одного раза. вам нужно удалить элемент из массива pos, как только вы «использовали» эту позицию.
3. я бы сделал это так: для каждого ( var obj:объект в pos_array ){ coo = pos.splice(Math.floor(Math.random() * pos.length),1)[0]; obj.x =loader.width/4; obj.y =0; if(x>loader.width) { x=0; y=loader.height/2; } }
4. Я не уверен, что этот код будет делать то, что вы ожидаете от него. Я бы начал с проверки значений pos и убедился, что все они являются хорошими местоположениями.
5. хорошо, можете ли вы сказать мне, как это сделать. Я сохранил несколько mc в массиве, и я хочу поместить эти mc на сцену рядом друг с другом. как я могу это сделать? Спасибо
Ответ №2:
Не зная, что содержит коллекция, я предполагаю, что она заполнена DisplayObjects или объектом, который имеет свойства x и y?
Приведите ссылку, чтобы компилятор понял, что содержит коллекция. Например:
DisplayObject(pos_array[index]).x = coo.x;
DisplayObject(pos_array[index]).y = coo.y;
… или любой другой тип, который содержит ваша коллекция.
Комментарии:
1. если я изменю условие цикла на: «while (поз.длина == 0)», это сработает
2. да, массив содержит видеоклипы, но это не решение, потому что я получаю новую ошибку «неопределенный метод»
Ответ №3:
Возможно, pos.length и pos_array.length не равны при запуске цикла.
Попробуйте это:
while (pos.length>0)
{
coo = pos.splice(Math.floor(Math.random() * pos.length),1)[0];
if (pos_array[index])
{
(pos_array[index]).x = coo.x;
(pos_array[index]).y = coo.y;
}
index ;
}