Actionscript:我是否正确删除了这个类实例?

时间:2010-08-17 00:36:39

标签: actionscript-3

好的,正确删除我的意思是我实际上已经摆脱了实例,或者它只是不再被绘制了?我应该提一下,我试图从它自己的类中删除实例,也就是它删除自己。它的“工作原理”在于它绘制的方块不再出现在屏幕上,但我又不确定它是否真的消失了或者没有被绘制。无论如何这里是班级:

package
{
    import flash.display.*;
    import flash.events.*;
    public class OBJECT_bullet_1 extends Sprite
    {
        public var X:int = 0;   public var Y:int = 0;
        public var Y_SPEED:int = 5;
        public var DEPTH:int = 9;
        public var CONTAINER:Sprite = new Sprite();
        public function CREATE(CONTAINER:Sprite,X:int,Y:int):void
        {
            this.CONTAINER = CONTAINER;
            CONTAINER.stage.addEventListener(Event.ENTER_FRAME,STEP);
            this.X = X;     this.Y = Y;
            DRAW();
        }
        public function STEP(event:Event):void
        {
            this.graphics.clear();
            Y -= Y_SPEED;
            if (Y < 20) {Y = 300; CONTAINER.removeChild(this); CONTAINER.stage.removeEventListener(Event.ENTER_FRAME,STEP); CONTAINER.(delete this); CONTAINER = null; return;}
            DRAW();
        }
        public function DRAW():void 
        {
            this.graphics.beginFill(0xCCCC00,1);
            this.graphics.drawRect(X - 2,Y - 2,4,4);
            this.graphics.endFill();
            CONTAINER.addChild(this);
        }
    }
}

我关注的部分是在STEP函数中检查Y&lt;你会注意到它后面会做几件事。我是否正确删除了它?如果有的话我还有什么要删除的,我不需要这样做?

1 个答案:

答案 0 :(得分:4)

对这两个问题都是肯定的。要确保删除对象,您所要做的就是删除对它的所有引用。子引用和事件回调是上面代码知道的唯一内容,并且您已经注意将它们都删除。无论你认为CONTAINER.(delete this)做什么都没有必要,你就不需要自己的容器引用了。

您提供的代码还存在其他一些重大问题。我做了一些改进,并对所有变化进行了大量评论,以解释我制作它们的原因。

// You should avoid using the default package.  Using the default package
// can make it difficult later on if you start having naming conflicts.
package com.stackoverflow.example {

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.utils.getTimer;

    // Class names are spelled in CamelCase by convention.  Also, note
    // that "Object" has a special meaning in AS3 so you should avoid
    // using it to refer to anything else.  I used here "Entity" instead.
    public class EntityBullet1 extends Sprite {
        // ALLCAPS when used are reserved for static const names.
        // A good use of static consts is to store "magic numbers".
        public static const DEFAULT_COLOR:uint     =  0xCCCC00;
        public static const DEFAULT_SPEED_X:Number =  0;
        public static const DEFAULT_SPEED_Y:Number = -100;
        public static const DEFAULT_SIZE:Number    =  4;

        // I'm calculating the time between frames for smoother movement.
        public var lastTime:int;
        public var color:uint = DEFAULT_COLOR;
        public var size:int   = DEFAULT_SIZE;

        // Instead of separate x and y vars, you can use the Point class.
        public var pos:Point;
        public var speed:Point;

        // Instead of a "create" method do all creation inside the constructor!
        public function EntityBullet1(x:Number = 0, y:Number = 0) {
            pos = new Point(x, y);
            speed = new Point(DEFAULT_SPEED_X, DEFAULT_SPEED_Y);

            // You don't need the parent container to access the ENTER_FRAME
            // event.  Every DisplayObject has its own.  Much simpler.
            addEventListener(Event.ENTER_FRAME, firstStep); 
        }

        public function draw():void {
            // Keep all drawing inside the draw function.  Previously,
            // clear() was being called inside the step method.
            graphics.clear();
            graphics.beginFill(color);
            graphics.drawRect(pos.x - size/2, pos.y - size/2, size, size);
            graphics.endFill();
        }

        // On the first frame, the field "lastTime" is still uninitialized.
        // This method initializes it to the current time and hands off 
        // future events to the proper step() method.
        public function firstStep(event:Event):void {
            removeEventListener(Event.ENTER_FRAME, firstStep);
            addEventListener(Event.ENTER_FRAME, step);
            lastTime = getTimer();
            step(event);
        }

        public function step(event:Event):void {
            // To move at a fixed rate regardless of how fast the framerate is,
            // you need to calculate the time delta.
            var cur:int = getTimer();
            var delta:Number = (cur - lastTime) / 1000.0;
            lastTime = cur;

            // Position equals velocity times time.
            pos.x += speed.x * delta;
            pos.y += speed.y * delta;

            draw();

            // Note that all DisplayObjects already have references to their
            // parent containers called "parent"!
            if (pos.y < 20) {
                if (parent != null) parent.removeChild(this);
                removeEventListener(Event.ENTER_FRAME, step);
            }
        }
    }

}