使用AS运算符转换元素

时间:2013-12-09 18:29:53

标签: actionscript-3

所以即时创建现在已经完成的东西,我想不是每次都创建元素,而是创建它们(ObjectPooling)

问题来自于我的池中的对象没有来自它模仿的类的变量,或者至少我理解它的方式,因为它没有做它应该做的事情。

有人可以告诉我这件事吗

var myNewBox:Box = Pool_myBox.getSprite() as Box;

意味着类 Box()所具有的所有属性和参数都将被赋予并且可以被新变量 myNewBox 使用,或者它更加棘手这个?

或换句话说是 var myNewBox:Box = new Box();

相同

var myNewBox:Box = Pool_myBox.getSprite()为Box;

------------ ----------- EDIT

所以我在主类中执行 private var Pool_myBox:SpritePool;

并设置 Pool_myBox = new SpritePool(Bullet,20); 所以在第一时间它生成了20个对象。 整个 SpritePool 类就是这个

package {
import flash.display.DisplayObject;

public class SpritePool {
    private var pool:Array;
    private var counter:int;
    private var classRef:Class;

    public function SpritePool(type:Class, len:int) {
        pool = new Array();
        counter = len;
        classRef = type;

        var i:int = len;
        while (--i > -1) {
            pool[i] = new type();
        }
    }

    public function getSprite():DisplayObject {
        if (counter > 0) {

            return pool[--counter];
        } else {
            increasePool(10);
            return getSprite();
        }
    }

    public function increasePool(amount:int):void {
        counter +=  amount;
         while( --amount > -1 ) 
                pool.unshift ( new classRef() ); 
    }


    public function returnSprite(s:DisplayObject):void {
        pool[counter++] = s;

        //trace(pool.length)
    }
}

}

2 个答案:

答案 0 :(得分:1)

绝对不是。如果你的getSprite()方法没有返回一个Box实例(或它的一些后代),它将不会'继承'Box的属性。 as没有执行任何内部魔术 - 它只是转换并告诉编译器您知道自己在做什么以及该对象确实是一个XXX实例(填写)。你应该只在从更一般的类型转到更具体的类型时使用强制转换,让我们假设:

var child:Sprite = parent.getChildAt(0); //what does this return? A display object instance => compiler will throw an error as Sprite is not DisplayObject
/*
Implicit coercion of a value with static type flash.display:DisplayObject to a possibly unrelated type flash.display:Sprite.
*/
//so you cast it:
var child:Sprite = parent.getChildAt(0) as Sprite; //this won't throw anything cos you casted it correctly

另请注意:

myObj as MyObj

与:

相同
MyObj(myObj)

答案 1 :(得分:0)

如果Pool_myBox.getSprite只返回Box对象,则不需要强制转换。 getSprite函数应该类似于:

public function getSprite():Box {
    var recycled_box:Box = ...  // get box from pool
    return recycled_box;
}

var myNewBox = Pool_myBox.getSprite();

然后,myNewBox看起来就像一个盒子。请注意,如果您需要Box的“新鲜”实例,则在返回到池中时,必须撤消先前Box实例上发生的任何初始化或处理。

好的,给定池类,看起来它应该适用于强制转换。请注意,您的文本说您正在传递“Bullet”作为类,而您的代码似乎想要Box(我假设这是一个拼写错误,或者Bullet是Box的超类?)。如果它在前20个工作,但在你开始回收后不工作,那么检查可能需要撤消的东西(如上所述)。

您认为哪种行为会让您认为它没有返回合适的班级?