我对AS3很新,而且我很困惑AS2中那些简单易懂的东西现在如此复杂和棘手。例如,我想创建一堆TextField对象,由于某种原因,每个帧都会出现(如: object.y- = 1; )。 但是,我还需要每个TextField来引用之前创建的TextField。 我尝试创建一个包含这样一个引用的变量: ThisTextField.Ref = LastTextField; 但是 - 这会返回“可能未定义的属性的访问...”错误。看来我只能在对象上拥有自定义属性!这很烦人,因为Object似乎不接受事件监听器(记住,我需要它们每帧都做一些事情)。
有没有办法简单地在我的TextFields上设置自定义属性,而不必使用自定义包?或者有没有办法在对象上使用事件监听器? 我已经阅读了一些关于严格模式的内容,它可以允许在其他对象上设置属性 - 将其关闭的风险是什么?
(这是我第一次来这里,所以如果我听起来令人困惑或困惑,我很抱歉!)
答案 0 :(得分:5)
您还可以使用强制转换来节省时间,方法是将扩展对象转换为基类,分配属性,然后再切换回来。 例如,所有内容都扩展了Object:
var myWhat:Object = myThing as Object; // myThing是你的原始对象; myWhat.customProp =“yellow”;
var myNewThing:WhatEverMyObjectWasOrignially = myWhat as WhatEverMyObjectWasOrignially; 迹(myNewthing.customProp);
这对我来说非常方便......
答案 1 :(得分:1)
它们既不复杂也不棘手,它们现在恰好遵循逻辑OO规则。
那说......
您无法在ActionScript 3中使用每种对象类型动态创建属性,只能声明为动态的对象(例如:Object和Array)。如果你需要这种控制,你应该创建一个子类并扩展TextField,或者提出一些其他的prev / next参考方法,比如双向链表。
答案 2 :(得分:0)
您应该使用数据结构(如Dictionary Class或Array),而不是在Object实例上设置属性。在上面的示例中,您要引用“之前的”TextField,可以使用Array来维护对所有这些文本的引用(然后用于迭代(循环)它们):
// 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,Sprite等都实现了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!");
}