2015-09-09 3 views
0

Я пытаюсь выяснить, как Vectors работают с классами. Ну, у меня есть это в моих свойствах:AS3 - Создание классов внутри векторов

private var rockets:Vector.<Rocket> = new Vector.<Rocket>(); 
private var rocket:Rocket; 

Rocket класс просто нормальный MovieClip класса со встроенным изображением внутри.

Теперь у меня есть этот код:

if (_pressingSpace) 
{ 
    rocket = new Rocket(); 
    rocket.x = Random; 
    addChild(rocket); 
    rockets.push(rocket); 
} 

При нажатии пространства ракеты создаются при случайном х, создании экземпляра класса Rocket и сохраняет его в ракету вара. AddChild отобразит изображение. Ну, когда вы снова нажимаете пробел, я понимаю, что все это происходит снова, но заменяет данные, которые были внутри ракеты var, с текущими данными (у которых есть новый случайный x). Ну, эта линия сохраняет каждую ракету класса Vector:

rockets.push(rocket); 

Теперь вот что я нашел в моем тестировании: Я создал несколько ракет с пространством, затем прессуют х, чтобы показать мне иксы

if (_pressingX) 
     { 
      trace(rockets[0].x); 
      trace(rockets[1].x); 
      trace(rockets[2].x); 
      trace(rockets); 
      trace(rocket); 
     } 

И я получил все случайные х, включая все ракеты, которые были внутри вектора. Ну вот что я не получаю: если каждый раз я нажимаю пробел, я заменяю данные ракеты var текущим, почему я все еще могу получить к нему доступ через «ракеты»? Разве это не исчезло с этим? Что именно он делает, мне нужно знать для моей дальнейшей работы. btw, когда я делаю

trace(rocket.x); 

Все, что я вижу, это новейшая ракета, которую я создал, а не другие.

+0

Каждый раз, когда вы делаете 'новый Rocket()' создать дополнительное пространство в памяти для этого объекта, со своим собственным адресом и т.д. Вместо того, чтобы поместить переменную в Array/Vector вы помещаете в него свою общую информацию (по которой адрес в ОЗУ может найти объект). Если бы вы не поместили эти созданные Ракеты в массив, они бы были собраны мусором через некоторое время, потому что они больше не используются. – DodgerThud

+0

Так почему я не могу проследить их все с помощью простой трассы (ракеты); Я попробовал трассировать (ракета [1]); и это тоже не сработало. ? Кроме того, как именно выглядит эта информация, например: координаты, случайное имя для дифференциации и т. Д.? – RunningFromShia

+0

Потому что вы переопределяете переменную. 'private var rocket' - это просто местозаполнитель, который сообщает компилятору« когда вы создаете объект этого класса, освобождайте пространство в ОЗУ для хранения информации этого объекта ». Информация об объекте - это переменные и функции в нем. Таким образом, класс, который имеет переменную 'public var index: int', сохранит 4 байта в ОЗУ (поскольку целые числа равны 4 байтам в AS3). Вектор/массив - это одно и то же, но вместо этого он может указывать на несколько объектов, а не только на один. – DodgerThud

ответ

0

A var - это палец. Это указывает на вас. На вас можно было наложить много пальцев, но на один var бывает один палец.

Array много пальцев. Это может быть любое количество пальцев (включая 0 пальцев). Каждый палец может указывать на что угодно (включая ничего). Возможно, массив содержит 1000 пальцев, указывающих на вас. Возможно, один палец указывает на вас, а второй указывает на меня.

Ваша бабушка Array. Она указывает на всех членов семьи (включая вас) с отдельными пальцами.

Дедушка - var. Он указывает на последнего родившегося члена семьи, который, оказывается, вы в этом примере.

Вы формируете babby.

Дедушка теперь указывает пальцем на user2081462 Jr. Он больше не указывает на вас.

Вопрос: Есть ли кто-нибудь, указывающий на вас пальцем? Ответ: Да, бабушка.

Другими словами: Удаление изображения человека на телефоне не означает, что все другие изображения этого человека, существующие на других телефонах или даже самом человеке, удаляются.

0

На самом деле это не имеет ничего общего с векторами. Замена ссылки не заменяет все ссылки на один и тот же объект - ссылки могут быть в векторах, массивах, картах объектов или любой другой переменной.Например:

var a:Rocket = new Rocket(); 
var b:Rocket = a; 
trace(a == b); // true; a and b refer to the same rocket 
a = new Rocket(); 
trace(a == b); // false; a is a new rocket, b refers to the old rocket 

Невозможно автоматически удалить все ссылки на объект. Вам придется сделать это сами. Чтобы удалить элементы из вектора, вы используете splice(). Например, чтобы удалить существующую ракету из вектора:

var indexOfRocket:int = rockets.indexOf(rocket); 
if(indexOfRocket > -1){ 
    rockets.splice(indexOfRocket, 1); // remove 1 element from index of rocket 
} 
Смежные вопросы