0

我是这个 OOP 的新手,我很难理解所有这些。

我正在尝试在 AS3.0 中使用类重新创建一个我在 AS2.0 中使用时间线编码创建的简单的打地鼠游戏。

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

这是我的设置:

  1. 我有一个名为的电影剪辑mrBunny(我的女朋友让我把它改成兔子,因为痣太丑了。)。现在舞台上有 6 个实例mrBunny,每个实例名为mrBunny0-5.
  2. mrBunny符号链接到类com.mrBunny
  3. 该类有一个方法randomPlay();,我用它来随机化mrBunny.
  4. 我在舞台上也有一个按钮与班级stageBtn

包 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# 实例的动画。

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

4

2 回答 2

2

(兔子太可爱了,无法回答这个问题,所以这里……)

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

包名称:

给出包名称是为了唯一标识一个类。考虑使用具有 StringUtils 类的 3rd 方库时的情况。你自己也碰巧有一个 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 的内容,特别是为什么需要它,以及关于它的关键术语:解耦、继承、封装等。

于 2011-02-23T13:06:22.947 回答
0

startBtn 没有成员 mrBunny0-5,主时间线有。试试root.mrBunny0吧。

于 2011-02-23T12:03:50.153 回答