1

我对 Actionscript 和 Adob​​e Flash CS6 完全陌生,为了一点乐趣,我决定尝试制作一个小游戏。我有一些关于一般实施方法的新手(或 noob-y)问题要问。

到目前为止,我一直在阅读的文档建议创建一个新的 flash 项目,然后创建一个文档类:

package  {

    import flash.display.MovieClip;

    public class MyMainClass extends MovieClip {


        public function MyMainClass() {

        }

    }

}

我想知道我是使用这个 MainClass 来编写整个游戏还是在一个场景中包含动作脚本并有多个场景,或者两者兼而有之。

假设我的游戏中有 5 个关卡,我会这样做吗:

package  {

    import flash.display.MovieClip;

    public class MyMainClass extends MovieClip {


        public function MyMainClass() {
            StartLevel1();
            StartLevel2();
            StartLevel3();
            StartLevel4();
            StartLevel5();
        }

        public function StartLevel1() {
            // Do something
        }
        public function StartLevel2() {
            // Do something
        }
        public function StartLevel3() {
            // Do something
        }
        public function StartLevel4() {
            // Do something
        }
        public function StartLevel5() {
            // Do something
        }

    }

}

或者在每个场景中创建 5 个带有动作脚本的场景?谁能给我一个起点?谢谢

4

1 回答 1

1

我不知道有谁对场景有什么好说的。

然而,正如您的直觉,时间线本身是一个很好的工具,可以随着时间的推移管理 Flash 资源的状态。如果您使用它,您还可以获得隐藏的优势,即您不必下载 100% 的文件即可使用它(因此您可以通过取消选中“在 N 帧中导出”来减少甚至消除对预加载器的需求“在你的图书馆符号上。

Lars 非常正确地指出,了解这项技术的开发人员非常少,而我确切地知道有一位开发人员能够并且将帮助有兴趣探索这项技术的人。那个人现在正在帮助你。因此,如果您选择这样做,请记住,除非我碰巧注意到您的帖子并做出回应,否则您大部分时间都是靠自己的。

不赞成时间线脚本,除了极少数例外。我建议的是一种“兼而有之”的方法,您可以在其中使用文档类来控制时间线实例。

您的文档类可能如下所示:

public class Game extends MovieClip {
    protected var _level:ILevel;//Interface your Level MovieClips will implement
    protected var levelController:LevelController = new LevelControler();
    protected var currentLevel:int;
    protected var maxLevels:int = 5;

    public function Game() {
        levelController.addEventListener(LevelEventKind.LEVEL_COMPLETE, nextLevel);
        levelController.addEventListener(LevelEventKind.LEVEL_FAILED, gameOver);
        startLevel(currentLevel);
    }

    public function startLevel(levelNumber:int):void {
        goToLabel('Level' + String(levelNumber));
    }
    public function get level():ILevel {
        return _level;
    }
    public function set level(value:ILevel):void {
       _level = value;
       //internally, this should release all listeners to the last 
       //level object (if any) so you don't get a memory leak
       levelController.level = _level;
    }
    protected function nextLevel(e:Event):void {
        if (currentLevel < maxLevels) {
            startLevel(++currentLevel);
        } else {
            //do you won logic here
        }
    }
    protected function gameOver(e:Event):void {
        //do bombed out logic here
    }
    protected function goToLabel(label:String):void {
        for each (var frameLabel:FrameLabel in currentLabels) {
            if (frameLabel.name==label) {    
                //if your swf is media-heavy, may want to check that frame
                //is loaded if you chose to reduce/eliminate preloader
                goToAndStop(label);
                return;
            }
        }
        trace('no such label as', label);
    }
}

这为您带来了一款游戏,您可以在其中更改不同关卡的外观,而无需更改单行 ActionScript,并且您可以通过分配实现 ILevel 的不同基类来更改它们的工作方式。您还可以通过更换不同风格的 LevelController 来更改您的功能,但是您的主文档类(在此实例中为 Game)会知道此更改(而其他更改可以在根本不更改 Game 的情况下进行)。

于 2013-03-30T04:05:43.493 回答