Добавить ребенка в сцену из класса - PullRequest
0 голосов
/ 11 мая 2010

Я новичок во флэш-памяти в целом и пишу программу с двумя классами, расширяющими MovieClip (Stems и 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; импортировать 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 Ответ

1 голос
/ 11 мая 2010

Самый быстрый способ - использовать родительскую переменную, которая ссылается на родительский объект 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 .

...