2

我正在用 ActionScript 创建游戏。我在 actionscript 中遇到了面向对象编程的问题。我有一个 game_fla 托管游戏的库组件。导致问题的一个是飞溅影片剪辑。在这个影片剪辑中,我有几层动画和加载一个徽标和两个按钮。在文档类 game.as 中,我有以下代码:

package{
import flash.display.MovieClip;
public class the_game extends MovieClip {
    public var splash_screen:splash;
    public var play_screen:the_game_itself;
    public var how_to_play_screen:how_to_play;



    public function the_game() {
        show_splash();
    }

    public function show_splash() {
        splash_screen = new splash(this);
        addChild(splash_screen);
    }

    public function play_the_game() {
        play_screen = new the_game_itself(this,level);
        remove_splash();
        addChild(play_screen);
    }
etc..

这显然是指一个 splash.as 文件,其中包含有关启动组件的信息。这是 splash.as 的代码:

package {
    import flash.display.MovieClip;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    public class splash extends MovieClip {
    public var main_class:the_game;
    public function splash(passed_class:the_game) {
        main_class = passed_class;
        play_btn.addEventListener(MouseEvent.CLICK, playGame);
        howToPlay_btn.addEventListener(MouseEvent.CLICK, howToPlay);

    }

    public function playGame(event:MouseEvent):void{
        main_class.play_the_game();
    }

    public function howToPlay(event:MouseEvent):void{
        main_class.how_to_play();
    }

}

}

就我而言!我遇到的问题是,当我运行 game.fla 文件时,我收到 splash.as 文件的编译器错误,提示“1120:未定义属性 play_btn 和 howToPlay_btn 的访问”。我提到的这些按钮位于影片剪辑 splash_mc 中​​。(都有实例名称等。)只是不确定我哪里出错了?顺便说一句,我最初使用 Sprite 而不是 Movie Clip 的 as 文件,但无论如何都不起作用。

帮助?请?任何人?

4

1 回答 1

0

就像在生活中一样,让孩子告诉父母该做什么是不好的 OOP。它应该只启动事件,并且如果必须,父母可以做出反应。否则,您将创建依赖项。

你做这样的事情:

//in the parent
public function show_splash() {
        splash_screen = new splash();//get rid of this, remember to delete from main constructor
        splash_screen.addEventListener("PLAY_GAME", play_the_game);//add listener
        addChild(splash_screen);
    }


//in the child you just dispatch the event when you need it
public function playGame(event:MouseEvent):void{
        dispatchEvent(new Event("PLAY_GAME"));
    }

那么当它起作用时,你也会做同样的事情how_to_play

如果需要帧,则仅使用 MovieClips,否则使用 Sprite。此外,有时您无法绕过将父级作为参数传递,但随后您将其作为 a 传递,DisplayObjectContainer甚至更好地给它一个 setter。

于 2013-03-07T22:43:42.980 回答