从类中添加子场景

时间:2010-05-11 13:42:09

标签: actionscript-3 class flash-cs4 addchild

我是flash的新手,一直在编写一个包含两个扩展MovieClip(Stems和Star)的类的程序。

当用户停止拖动Star对象时,我需要创建一个新的Stems对象作为场景的子对象,但是不知道如何从Star类的代码中引用该场景。

我已经尝试将场景传递给Star的构造函数并执行类似的操作:

this.scene.addChild (new Stems ());

但显然这不是怎么做的......下面是Stems and Stars的代码,任何建议都会受到很大的赞赏。

package {
import flash.display.MovieClip;
import flash.events.*;
import flash.utils.Timer;


public class Stems extends MovieClip {
    public const centreX=1026/2;
    public const centreY=600/2;
    public var isFlowing:Boolean;
    public var flowerType:Number;
    public const outerLimit=210;
    public const innerLimit=100;

    public function Stems(fType:Number) {
        this.isFlowing=false;
        this.scaleX=this.scaleY= .0007* distanceFromCentre(this.x, this.y);
        this.setXY();
        trace(distanceFromCentre(this.x, this.y));
        if (fType==2) {
            gotoAndStop("Aplant");
        }

    }

    public function distanceFromCentre(X:Number, Y:Number):int {
        return (Math.sqrt((X-centreX)*(X-centreX)+(Y-centreY)*(Y-centreY)));
    }

    public function rotateAwayFromCentre():void {
        var theX:int=centreX-this.x;
        var theY:int = (centreY - this.y) * -1;
        var angle = Math.atan(theY/theX)/(Math.PI/180);
        if (theX<0) {
            angle+=180;
        }
        if (theX>=0&&theY<0) {
            angle+=360;
        }
        this.rotation = ((angle*-1) + 90)+180;

    }

    public function setXY() {
        do {
            var tempX=Math.random()*centreX*2;
            var tempY=Math.random()*centreY*2;
        } while (distanceFromCentre (tempX, tempY)>this.outerLimit || 
                distanceFromCentre (tempX, tempY)<this.innerLimit);
        this.x=tempX;
        this.y=tempY;
        rotateAwayFromCentre();
    }

    public function getFlowerType():Number {
        return this.flowerType;
    }
}

}

包{     import flash.display.MovieClip;     import flash.events。*;     import flash.utils.Timer;

public class Star extends MovieClip {
    public const sWide=1026;
    public const sTall=600;
    public var startingX:Number;
    public var startingY:Number;
    public var starColor:Number;
    public var flicker:Timer;
    public var canUpdatePos:Boolean=true;
    public const innerLimit=280;

    public function Star(color:Number, basefl:Number, factorial:Number) {
        this.setXY();
        this.starColor=color;
        this.flicker = new Timer (basefl + factorial * (Math.ceil(100* Math.random ())));
        this.flicker.addEventListener(TimerEvent.TIMER, this.tick);

        this.addEventListener(MouseEvent.MOUSE_OVER, this.hover);
        this.addEventListener(MouseEvent.MOUSE_UP, this.drop);
        this.addEventListener(MouseEvent.MOUSE_DOWN, this.drag);

        this.addChild (new Stems (2));

        this.flicker.start();
        this.updateAnimation(0, false);
    }

    public function distanceOK(X:Number, Y:Number):Boolean {
        if (Math.sqrt((X-(sWide/2))*(X-(sWide/2))+(Y-(sTall/2))*(Y-(sTall/2)))>innerLimit) {
            return true;
        } else {
            return false;

        }
    }

    public function setXY() {
        do {
            var tempX=this.x=Math.random()*sWide;
            var tempY=this.y=Math.random()*sTall;
        } while (distanceOK (tempX, tempY)==false);
        this.startingX=tempX;
        this.startingY=tempY;
    }

    public function tick(event:TimerEvent) {
        if (this.canUpdatePos) {
            this.setXY();
        }
        this.updateAnimation(0, false);
        this.updateAnimation(this.starColor, false);
    }

    public function updateAnimation(color:Number, bright:Boolean) {

        var brightStr:String;

        if (bright) {
            brightStr="bright";
        } else {
            brightStr="low";

        }
        switch (color) {
            case 0 :
                this.gotoAndStop("none");
                break;
            case 1 :
                this.gotoAndStop("N" + brightStr);
                break;
            case 2 :
                this.gotoAndStop("A" + brightStr);
                break;
            case 3 :
                this.gotoAndStop("F" + brightStr);
                break;
            case 4 :
                this.gotoAndStop("E" + brightStr);
                break;
            case 5 :
                this.gotoAndStop("S" + brightStr);
                break;
        }
    }

    public function hover(event:MouseEvent):void {
        this.updateAnimation(this.starColor, true);
        this.canUpdatePos=false;
    }

    public function drop(event:MouseEvent):void {
        this.stopDrag();
        this.x=this.startingX;
        this.y=this.startingY;
        this.updateAnimation(0, false);
        this.canUpdatePos=true;



    }

    public function drag(event:MouseEvent):void {
        this.startDrag(false);
        this.canUpdatePos=false;

    }

}

}

1 个答案:

答案 0 :(得分:1)

最快的方法是使用引用DisplayObject父级的父变量。

var stem:Stems = new Stems(2);
stem.x = x; //optional: set stem coordinates to that of Star
stem.y = y; 
parent.addChild(stem);

如果你想在每次星拖动作停止时将Stems对象添加到舞台上,你需要将上面的代码放在 drop 函数中。