2010-10-10 3 views
4

Я очень новичок в AS3, и я смущен тем, как все, что было бы просто в AS2, теперь настолько сложное и сложное. Например, я хочу создать кучу объектов TextField, которые по какой-то причине поднимают каждый кадр (как в: object.y- = 1;). Однако мне также нужно, чтобы каждый TextField ссылался на TextField, который был создан непосредственно перед ним. Я попытался создать переменную, которая проведет такую ​​ссылку: ThisTextField.Ref = LastTextField; но - это возвращает ошибку «Доступ, возможно, неопределенного свойства ...». Кажется, у меня есть только пользовательские свойства на простых объектах! Это раздражает, потому что объект, похоже, не принимает слушателей событий (помните, мне нужно, чтобы они делали что-то в каждом кадре).AS3: Как предоставить пользовательские свойства DisplayObjects?

Есть ли способ просто установить пользовательские свойства на моем TextFields, не используя пользовательские пакеты? Или есть способ использовать прослушиватели событий на объектах? Я читал что-то о строгом режиме, который мог бы задавать свойства на других объектах - каковы риски его отключения?

(это мой первый раз здесь, так что я извиняюсь, если я звук запутанным, или запутался!)

ответ

1

Они действительно не являются ни сложными, ни хитрым, теперь они просто так, чтобы следовать логическим правилам OO.

Это говорит ...

Вы не можете создавать свойства на лету с каждым типом объекта в ActionScript 3, только объекты, которые заявлены в качестве динамических (например: Object и Array). Если вам нужен такой контроль, вы должны создать подкласс и расширить TextField или придумать некоторые другие способы ссылки на prev/next, такие как двунаправленный связанный список.

+0

Ну, черт побери, поэтому мне действительно нужно написать пакет для этого? (если это то, что означает «создание подкласса»?) Могу ли я добавить возможность получать EventListeners в объекты через пакеты тоже? – Orteil

+0

Нет, пакет может быть набором классов (например: flash.display - пакет, содержащий Sprite, Shape и т. д.), тогда как класс - Sprite. Подкласс будет вашим собственным пользовательским объектом, который расширяет класс. – Aaron

+0

А, ладно! Спасибо. Тогда я это рассмотрю. – Orteil

0

Вместо задания свойств экземпляра объекта вы должны использовать Структуры данных, такие как класс словаря или массив. В вашем примере выше, где вы хотели бы сослаться на «предыдущий» TextField, массив может быть использован для поддержания ссылки на все из них (и затем использоваться для итерации (цикл), через них):

// Create the array which will be populated with the TextFields we want 
// to move. 
var textFields : Array = [ myTextField1, myTextField2 .... etc ]; 

// Loop through each TextField in the array and modify it's y property. 
for each (var thisTextField : TextField in textFields) { 
    thisTextField.y -= 1; 
} 

Как для использования EventListeners вам нужно добавить EventListner к объекту, который реализует IEventDispatcher; все MovieClips, спрайты и т.д. осуществлять IEventDispatcher и поэтому способны диспетчеризация события, если вы работаете в Flash IDE, вы могли бы код:

// Listen out for the ENTER_FRAME event which will be dispatched by this MovieClip 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 

// This function will be called each time it is dispatched. 
function onEnterFrame(event : Event) : void { 
    trace("onEnterFrame!"); 
} 
5

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

var myWhat: Object = myThing as Object; // где myThing - это ваш исходный объект; myWhat.customProp = "желтый";

var myNewThing: WhatEverMyObjectWasOrignially = myWhat как WhatEverMyObjectWasOrignially; след (myNewthing.customProp);

Это было очень удобно для меня ...

Смежные вопросы