Ошибка 1010 Actionscript 3

#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  ;

}