AS3如何从各个类中删除舞台中的对象

时间:2015-08-23 19:28:27

标签: actionscript-3 flash

所以我创造了一种可以生成不同类型鱼的游戏。我有主类初始化所有东西然后用另一个类生成鱼。然后,我有另一个班级,当他们被添加到控制他们的运动的舞台时。鱼离开现场之后,我已经将它们删除了,但是一旦鱼被点击,我就无法将它们全部删除。我有一个听众,当点击一条鱼时会收到但是我在删除所有其他生成的鱼时遇到问题,以便我可以加载鱼的信息。

我可能有很多问题,但这是我的主要课程:

 package 
{

    import flash.display.MovieClip;
    import flash.display.SimpleButton;
    import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
    import Crappie;
    /*import Bass;
    import Bluegill;
    import LongGar;
    import Muskellunge;
    import Perch;
    import PumpkinSeed;
    import ShortGar;
    import SpotGar;*/
    import GenerateFish;

    public class FishGame extends MovieClip
    {

        private var randomFish:Number;

        public function FishGame() //First function to be called
        {
            startMenu();
        }


        public function startMenu() //Loads the start menu
        {
            gotoAndStop("Start Menu");
            StartButton.addEventListener(MouseEvent.CLICK, gotoStartGame);
        }

        private function gotoStartGame(evt:MouseEvent) //links to the start of th game
        {
            StartButton.removeEventListener(MouseEvent.CLICK, gotoStartGame);
            gotoAndStop("Game");
            game();

        }

        public function game() /generates fish
        {
            var genFish:GenerateFish = new GenerateFish();
            this.addChild(genFish);
            var genFish2:GenerateFish = new GenerateFish();
            this.addChild(genFish2);
        }

//This is where I need help. All the fish are children of other class. I tried deleting them in their own class but it seems like it would work best if it was in this class but I'm having trouble calling this class.

        public function removeFish()
        {
            trace("Here");
        }
    }
}

这是生鱼类:

    package  {

        import flash.display.MovieClip;
        import flash.events.*;
        import flash.display.*;
        import Crappie;
        //import Bass;
        //import Bluegill;
        //import LongGar;
        //import Muskellunge;
        //import Perch;
        //import PumpkinSeed;
        //import ShortGar;
        //import SpotGar;
        import FishGame;

        public class GenerateFish extends MovieClip {

            private var randomFish:Number;


            public function GenerateFish()  //When this is added via addchild it adds a fish
            {
                this.addEventListener(Event.ADDED_TO_STAGE, addFish, false, 0, true);
                //addFish();
            }

            private function addFish(e:Event) //adds fish to scrence
            {                       
                this.removeEventListener(Event.ADDED_TO_STAGE, addFish);
                randomFish = Math.floor(Math.random() * 2);
                randomFish = 0; //for testing purposes
                    switch(randomFish) 
                    { 
                        case 0: 
                            var crappie:Crappie = new Crappie();
                            this.addChild(crappie); //Calls the crappy funciton
                            break;
                        case 1: 
                            var longgar:LongGar = new LongGar();
                            this.addChild(longgar);
                            break; 
                        case 2: 
                            var bluegill:Bluegill = new Bluegill();
                            this.addChild(bluegill);
                            break; 
                        case 3: 
                            var spotgar:SpotGar = new SpotGar();
                            this.addChild(spotgar);
                            break; 
                        case 4: 
                            var muskellunge:Muskellunge = new Muskellunge();
                            this.addChild(muskellunge);
                            break; 
                        case 5: 
                            var pumpkinseed:PumpkinSeed = new PumpkinSeed();
                            this.addChild(pumpkinseed);
                            break; 
                        case 6: 
                            var bass:Bass = new Bass();
                            this.addChild(bass);
                            break;
                        case 7: 
                            var perch:Perch = new Perch();
                            this.addChild(perch);
                            break; 
                        case 8: 
                            var pike:Pike = new Pike();
                            this.addChild(pike);
                            break; 
                        default: 
                            break; 
                    }

            }


        }

    }

这是一个特定的鱼类:

package 
{
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.*;
    import FishGame;
    import GenerateFish;


    public class Crappie extends MovieClip
    {

        private var Speed:Number;
        private var randomBoolean:Boolean = (Math.random() > .5) ? true : false;
        private var fishOnScreen:Boolean = false;
        //public var remFish:FishGame = new FishGame();


        public function Crappie() //Adds event listeners to control the fish
        {
            this.addEventListener(Event.ADDED_TO_STAGE, Setup, false, 0, true);
            this.addEventListener(MouseEvent.CLICK, GoToFishInfo);
            fishOnScreen =true;

        }

        public function GoToFishInfo(evt:MouseEvent):void //When fish is clicked Info pops up. It is here i want every fish to be deleted.
        {   
            this.removeEventListener(Event.ADDED_TO_STAGE, Setup);

            /*while (MovieClip(root).numChildren >= 1) //What I tried to delete all objects
            {
                MovieClip(root).removeChildAt(1);
            }*/
            var remFish:FishGame = new FishGame(); //Creates  The SWF file file:///FishGame/classes/FishGame.swf contains invalid data.
            remFish.removeFish();

            MovieClip(root).gotoAndStop("FishInfo", "Scene 1");
            var crappieinfo:CrappieInfo = new CrappieInfo();
            stage.addChild(crappieinfo);
            crappieinfo.x = 512;
            crappieinfo.y = 384;
            crappieinfo.alpha = 100;

        }

        private function Setup(e:Event) //Setup the fish position and adds info for movement
        {
            var randomBoolean:Boolean = (Math.random() > .5) ? true : false;
            //true forwards
            //false is backwards
            if (randomBoolean)
            {
                this.x = 1030;
            }
            else
            {
                this.scaleX = -1;
                this.x = -10;
            }

            this.y = this.GetRandomYPosition();

            this.alpha = 100;

            this.addEventListener(Event.ENTER_FRAME, MoveCircle);
            Speed = GetRandomSpeed();
            if (randomBoolean)
            {
                Speed *= -1
            }
        }

        private function GetRandomSpeed():Number
        {

            return (Math.floor(Math.random() * 5) +5);
        }

        private function GetRandomYPosition():Number
        {
            //
            //basic formula: Math.floor(Math.random()*(1+High-Low))+Low; 
            //
            return (Math.floor(Math.random() * (650-this.height)) + 230);
        }

        public function MoveCircle(e:Event) //Moves the fish
        {

                if (fishOnScreen)
                {
                    this.x +=  Speed;
                    if (this.x >1024 || this.x < -10 || this.y >768 || this.y < 200) 
                    {
                        var genExtraFish:GenerateFish = new GenerateFish();
                        stage.addChild(genExtraFish);
                        this.parent.removeChild(this);
                        fishOnScreen = false;
                        this.removeEventListener(MouseEvent.CLICK, GoToFishInfo);

                    }
                }


        }
    }
}

谢谢,我感谢所有帮助!

////////

// //编辑

////////

我已将主类修改为包

{

    import flash.display.MovieClip;
    import flash.display.SimpleButton;
    import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
    import BaseFish;
    import GenerateFish;

    public class FishGame extends MovieClip
    {
        private var randomFish:Number;
        private var basefish:BaseFish = new BaseFish();

        public function FishGame()
        {
            startMenu();
        }


        public function startMenu()
        {
            gotoAndStop("Start Menu");
            StartButton.addEventListener(MouseEvent.CLICK, gotoStartGame);
        }

        private function gotoStartGame(evt:MouseEvent)
        {
            StartButton.removeEventListener(MouseEvent.CLICK, gotoStartGame);
            gotoAndStop("Game");
            basefish.StartFish();

        }       
    }
}

我创建了basefish类:

package  
{
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.*;
    import FishGame;

    public class BaseFish extends MovieClip 
    {
        public var FishOnScreen:Array = new Array(); 
        public var FishSpeed:Array = new Array();
        private var Speed:Number;
        private var randomBoolean:Boolean = (Math.random() > .5) ? true : false;
        public var NumFish:int = -1;
        private var randomFish:Number;

        public function BaseFish() 
        {           

        }

        public function StartFish()
        {
            addFish(5);
            this.addEventListener(Event.ENTER_FRAME, MoveCircle);
        }

        public function addFish(NumAdd:Number)
        {                       
            for (var i:Number = 0; i < NumAdd; i++)
            {
                randomFish = Math.floor(Math.random() * 2);
                randomFish = 0;
                switch(randomFish) 
                { 
                    case 0: 
                        var crappie:Crappie = new Crappie();
                        this.addChild(crappie);
                        crappie.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(crappie);
                        trace(FishOnScreen[1]);
                        Setup(crappie);
                        NumFish += 1;
                        break;
                    case 1: 
                        var longgar:LongGar = new LongGar();
                        this.addChild(longgar);
                        longgar.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(longgar);
                        Setup(longgar);
                        NumFish += 1;
                        break; 
                    case 2: 
                        var bluegill:Bluegill = new Bluegill();
                        this.addChild(bluegill);
                        bluegill.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(bluegill);
                        Setup(bluegill);
                        NumFish += 1;
                        break; 
                    case 3: 
                        var spotgar:SpotGar = new SpotGar();
                        this.addChild(spotgar);
                        spotgar.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(spotgar);
                        Setup(spotgar);
                        NumFish += 1;
                        break; 
                    case 4: 
                        var muskellunge:Muskellunge = new Muskellunge();
                        this.addChild(muskellunge);
                        muskellunge.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(muskellunge);
                        Setup(muskellunge);
                        NumFish += 1;
                        break; 
                    case 5: 
                        var pumpkinseed:Pumpkinseed = new Pumpkinseed();
                        this.addChild(pumpkinseed);
                        pumpkinseed.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(pumpkinseed);
                        Setup(pumpkinseed);
                        NumFish += 1;
                        break; 
                    case 6: 
                        var bass:Bass = new Bass();
                        this.addChild(bass);
                        bass.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(bass);
                        Setup(bass);
                        NumFish += 1;
                        break;
                    case 7: 
                        var perch:Perch = new Perch();
                        this.addChild(perch);
                        perch.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(perch);
                        Setup(perch);
                        NumFish += 1;
                        break; 
                    case 8: 
                        var pike:Pike = new Pike();
                        this.addChild(pike);
                        pike.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(pike);
                        Setup(pike);
                        NumFish += 1;
                        break; 
                    default: 
                        this.addChild(crappie);
                        crappie.addEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.push(crappie);
                        Setup(crappie);
                        NumFish += 1;
                        break; 
                }
            }
        }
        private function Setup(mc: MovieClip)
        {
            var randomBoolean:Boolean = (Math.random() > .5) ? true : false;
            //true forwards
            //false is backwards
            if (randomBoolean)
            {
                MovieClip(mc).x = 1030;
            }
            else
            {
                MovieClip(mc).scaleX = -1;
                MovieClip(mc).x = -10;
            }

            MovieClip(mc).y = GetRandomYPosition();

            MovieClip(mc).alpha = 100;

            FishSpeed[NumFish] = GetRandomSpeed();
            if (randomBoolean)
            {
                FishSpeed[NumFish] *= -1
            }
        }

        private function GetRandomSpeed():Number
        {

            return (Math.floor(Math.random() * 5) +5);
        }

        private function GetRandomYPosition():Number
        {
            //
            //basic formula: Math.floor(Math.random()*(1+High-Low))+Low; 
            //
            return (Math.floor(Math.random() * (650-this.height)) + 230);
        }

        public function MoveCircle(e:Event)
        {
            //trace(FishOnScreen.length);

                for (var i:Number = 0; i < FishOnScreen.length; i++)
                {
                    if (FishOnScreen[i]!=null)
                    {
                    MovieClip(FishOnScreen[i]).x +=  FishSpeed[i];
                    if (MovieClip(FishOnScreen[i]).x >1024 || MovieClip(FishOnScreen[i]).x < -10 || MovieClip(FishOnScreen[i]).y >768 || MovieClip(FishOnScreen[i]).y < 200) 
                    {
                        addFish(1);
                        this.removeChild(MovieClip(FishOnScreen[i]));
                        MovieClip(FishOnScreen[i]).removeEventListener(MouseEvent.CLICK, GoToFishInfo);
                        FishOnScreen.splice(i, 1);
                        FishSpeed.splice(i,1);

                    }
                    }
                    //else trace("null");
                }


        }

        public function GoToFishInfo(evt:MouseEvent):void
        {   
            dispose();
            MovieClip(root).gotoAndStop("FishInfo", "Scene 1");
            var crappieinfo:CrappieInfo = new CrappieInfo();
            stage.addChild(crappieinfo);
            crappieinfo.x = 512;
            crappieinfo.y = 384;
            crappieinfo.alpha = 100;

        }

        public function dispose():void
        {
            for (var i : int = this.numChildren-1 ; i >= 0 ; i--)
            {
                if(this.getChildAt(i) is MovieClip)
                {
                    this.removeChildAt(i);
                    MovieClip(FishOnScreen[i]).removeEventListener(Event.ADDED_TO_STAGE, Setup);
                    MovieClip(FishOnScreen[i]).removeEventListener(MouseEvent.CLICK, GoToFishInfo);
                }
            }
        }

    }

}

它没有给我任何错误,但它没有显示任何鱼。如果您可以查看我的更新代码,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

为了使事情变得更好并避免重复代码,请从基类扩展所有类,例如CrappieBass等,例如将其称为BaseFish。您应该在此基类中创建dispose()方法。这样,这种dispose方法将自动可用于扩展它的所有类。实际上,您可以使用此方法在一个位置编写公共代码,避免重复。

此外,如果您觉得它符合需要,也可以从基类扩展GenerateFish,或者在此类中创建一个名为dispose()的类似方法。

然后,当您调用removeFish()方法时,可以为各个类调用这些dispose方法。

创建这样的方法(这只是为了让你入门):

public function dispose():void
{
    for (var i : int = this.numChildren-1 ; i >= 0 ; i--)
    {
        if(this.getChildAt(i) is MovieClip)
        {
            this.removeChildAt(i);
        }
    }
}

此代码删除每个作为影片剪辑的子代。您可能还想删除在此方法中添加到类中的所有事件侦听器。

然后,将变量genFishgenFish2移到类变量中,而不是在方法game()

中声明它们

现在在removeFish()方法中执行此操作:

public function removeFish()
{
    genFish.dispose();
    genFish2.dispose();
}

GenerateFish类中遵循相同的逻辑来处理所有子节点,因为它们现在将成为同一基类的实例。

从性能角度来看,另一件可能非常重要的事情是您要添加的ENTER_FRAME事件。请注意,此事件正被添加到您在GenerateFish中创建的每个实例中。因此,每个实例都有自己的输入框架。也许它在你目前的情况下可以正常工作,因为实例的数量可能更少,但这种方法不可扩展,明天如果你有很多实例,它肯定会阻碍性能。

理想情况下,您应该尝试在主类中只有一个ENTER_FRAME事件侦听器,并使用处理程序来更改子类中的内容。

希望这会对你有所帮助。