Class 动作脚本在单个类中还是在多个场景中?

Class 动作脚本在单个类中还是在多个场景中?,class,actionscript,scene,Class,Actionscript,Scene,我对Actionscript和AdobeFlashCS6完全陌生,为了一点乐趣,我决定尝试制作一个小游戏。关于一般的实现方法,我有一些新手(或noob-y)问题要问 到目前为止,我一直在阅读的文档建议创建一个新的flash项目,然后创建一个文档类,以便: package { import flash.display.MovieClip; public class MyMainClass extends MovieClip { public functio

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

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

package  {

    import flash.display.MovieClip;

    public class MyMainClass extends MovieClip {


        public function MyMainClass() {

        }

    }

}
我想知道我是使用这个main类来编写整个游戏,还是在一个场景中包含动作脚本,并且有多个场景,或者两者的组合

假设我在我的游戏中有一个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
        }

    }

}
或者在每个场景中使用actionscript创建5个场景? 有人能给我一个起点吗?
谢谢

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

然而,正如您直觉所示,时间线本身是一个很好的工具,可以随着时间的推移管理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来改变你的功能,但是你的Main文档类(本例中的游戏)会意识到这一变化(而其他变化完全可以在不改变游戏的情况下进行)。

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

然而,正如你直觉所示,时间线本身是一个很好的工具,用于管理你的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来改变你的功能,但是你的Main文档类(本例中的游戏)会意识到这一变化(而其他变化可以在根本不改变游戏的情况下进行).

一般来说,我会建议不要使用不同的场景构建解决方案。我认为如果你不这样做,你会更容易在SO和其他开发论坛上获得帮助。我已经专业从事ActionScript/Flash开发10多年了,从未使用过场景的概念,也没有遇到同事使用过的项目。场景如果你使用Flash作为时间线动画工具,可能会有用,但我会说,在脚本编写和游戏开发中很少用到。一般来说,我会建议不要使用不同的场景构建解决方案。我认为,如果你不使用Flash,你会更容易在SO和其他开发论坛获得帮助。我一直在做ActionScript/Flash专业开发10年以上,从未使用过场景概念,或遇到同事使用过的项目。如果使用Flash作为时间线动画工具,场景可能会有用,但我会说,脚本和游戏开发中很少使用场景。