AS3: Как я могу дать свои пользовательские свойства DisplayObjects? - PullRequest
4 голосов
/ 10 октября 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

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

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

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

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

1 голос
/ 10 октября 2010

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

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

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

0 голосов
/ 10 октября 2010

Вместо установки свойств для экземпляра объекта вы должны использовать такие структуры данных, как класс словаря или массив.В приведенном выше примере, где вы хотели ссылаться на «предыдущий» 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;все мувиклипы, спрайты и т. д. реализуют 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!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...