使用已经在另一个类的舞台上的实例

时间:2011-02-23 04:02:17

标签: actionscript-3 oop actionscript class-design multiple-instances

我是这个OOP的新手,我很难理解这一切。

我正在尝试在AS3.0中使用时间轴编码在AS2.0中创建一个简单的whack-a-mole游戏。

我已经阅读了很多论坛,但我仍然不明白我到底做错了什么。

继承我的设置:

  1. 我有一个名为mrBunny的电影剪辑(我的女朋友告诉我把它改成兔子因为痣太难看了。)。现在舞台上有6个mrBunny个实例,每个实例都名为mrBunny0-5
  2. mrBunny符号与com.mrBunny类相关联。
  3. 该类有一个名为randomPlay();的方法,我用它来随机化mrBunny的动画时间。
  4. 我在舞台上还有一个按钮stageBtn
  5.   

    package com {

    import flash.display.SimpleButton;
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.MouseEvent;
    
    public class startBtn extends SimpleButton {
    
        //Constructor
        public function startBtn() {
            this.addEventListener(MouseEvent.CLICK, startClick);
        }
    
        public function startClick(event:MouseEvent):void {
    
          mrBunny0.randomPlay();
          mrBunny1.randomPlay();
          mrBunny2.randomPlay();
          mrBunny3.randomPlay();
          mrBunny4.randomPlay();
          mrBunny5.randomPlay();
    
        }
    }
    
         

    }

    我希望能够使用startBtn来启动mrBunny#instances的动画。

    据我所知,我并没有完全掌握课程和OOP的情况。

2 个答案:

答案 0 :(得分:2)

(兔子太可爱了,不能传递这个问题,所以这里......)

您的代码中有几个关于OOP的问题需要考虑。我会尝试解释一下。

套餐名称:

给出包名称以便唯一地标识类。当您使用具有StringUtils类的第三方库时,请考虑这种情况。你自己也碰巧有一个StringUtils类。你如何将它们存储在工作文件夹中?您如何在代码中解决每个问题?

如名称所示,包提供了一种对类进行分组的机制。因此,当您引用课程时,您可以将其作为com.joemidi.utils.StringUtils,将另一个称为com.someoneelse.utils.StringUtils。包名称可以是您喜欢的任何内容,只要它反映文件夹结构即可。但是,作为行业标准,人们在其包名中使用URL,因为它们保证是唯一的。这就是您在许多软件包中看到com的原因。在您的情况下,最好根据此重构您的包(和文件夹结构)。

来自IDE的

舞台实例:

在Flash IDE中创建实例时,必须记住放置它们的位置以及代码是否知道它们。正如@weltraumpirat所说,兔子不是你的startBtn里面。做你想做的事的正确方法是:

Main:
    + contains the bunnies.
    + listens to startButton for MouseEvent.CLICK
    + when startButton is clicked, manipulates the bunnies.

那就是说,我们意识到还有另一个问题:

不依赖于实例名称:

您应该在代码中实例化(即创建新的)兔子,而不是在Flash IDE中;并从中心变量访问它们。例如:

public class Main extends MovieClip {

    var bunnies:Array = new Array();

    public function Main() {
        createBunnies(7);
        startButton.addEventListener(MouseEvent.CLICK, onStartClicked)
    }

    protected function createBunnies(bunnyCount:int):void {
        for (var i:int = 0; i < bunnyCount; i++) {
            var bunny:Bunny = new Bunny();
            addChild(bunny);
            // configure bunny.x, bunny.y, etc. here.
            bunnies.push(bunny);
        };
    }

    protected function onStartClicked(e:MouseEvent) {
        for (var i:int = 0; i < bunnies.length; i++) {
            var bunny:Bunny = bunnies[i];
            bunnies.randomPlay();
        };
    }

在这里,您不再受限于您给兔子的实例名称。 (当然,我只是在这里假设你的舞台结构。)这样,兔子就比他们上面的代码更“独立”了。此外,您可以使用持有人精灵并从那里跟踪兔子,但现在可能有点先进。

希望这些可能对您有用。如果您认真对待这个主题,您可能希望阅读更多有关OOP的内容,特别是有关它的原因,以及关于它的关键术语:去耦,继承,封装等。

答案 1 :(得分:0)

startBtn没有成员mrBunny0-5,主时间轴。请改为root.mrBunny0