【问题标题】:setting up frame by frame menu navigation vs. All Code逐帧设置菜单导航与所有代码
【发布时间】:2010-01-06 19:03:54
【问题描述】:

当涉及到包括闪存在内的任何事情时,我都是程序员。不久前我开始制作游戏,有些人使用框架从主菜单导航到游戏屏幕等等(我不知道该怎么做)。有些人将游戏封装在一个类中,并从文档类中调用它,并在需要时添加和删除它。

我只是好奇什么是最佳实践,什么是最有益的。专业人士是做什么的。

【问题讨论】:

  • 可以给框架分配标签并使用gotoAndPlay(frameNum or label)

标签: flash actionscript-3 actionscript flash-cs4


【解决方案1】:

使用时间线通常被认为不是最佳做法。你会发现开始编程的设计师往往会像他们习惯的那样经常使用时间线。此外,从 AS1 或 AS2 开始的程序员往往有坏习惯。如果某件事值得做,那么它就值得做正确的事情。

使用时间线的问题在于管理变量状态。如果您随后移动到另一帧(第一帧除外),则在一个帧中声明的任何变量都将丢失。为了演示这个基本示例:

在第一帧有一个选项按钮,单击该按钮会转到另一帧“选项”。这个选项框架有一个检查按钮,还声明了另一个对象。它还有一个返回主菜单的按钮。这是编译器生成代码后的样子:

package DemoAvoid_fla
{
    import fl.controls.*;
    import flash.display.*;
    import flash.events.*;

    dynamic public class MainTimeline extends MovieClip
    {
        public var btnOptions:SimpleButton;
        public var chkHints:CheckBox;
        public var myWorld:Object;
        public var btnReturnToMainMenu:SimpleButton;
        public var declareSomeInstace:Object;

        public function MainTimeline()
        {
            addFrameScript(0, this.frame1, 1, this.frame2);
            return;
        }// end function

        public function onOptionsClick(event:MouseEvent) : void
        {
            gotoAndStop("options");
            return;
        }// end function

        function frame1()
        {
            stop();
            this.myWorld = new Object();
            this.btnOptions.addEventListener(MouseEvent.CLICK, this.onOptionsClick);
            return;
        }// end function

        public function onReturnToMainMenu(event:Event) : void
        {
            gotoAndStop("mainMenu");
            return;
        }// end function

        function frame2()
        {
            stop();
            this.chkHints.addEventListener(Event.CHANGE, this.onHintsChange);
            this.btnReturnToMainMenu.addEventListene(MouseEvent.CLICK,this.onReturnToMainMenu);
            this.declareSomeInstace = new Object();
            return;
        }// end function

        public function onHintsChange(event:Event) : void
        {
            var _loc_2:* = event.target.selected;
            trace(_loc_2);
            return;
        }// end function

    }
}

现在这就是问题所在。如果您要导航到选项页面然后返回到主菜单,您最终将重置您的变量状态,因为您现在创建了我的世界的一个新实例(并且内存使用量上升,因为垃圾收集器不会是即时的)。您现在还在选项页面中丢失了您的实例。

我的菜单编码风格是将每个屏幕创建为一个影片剪辑。然后将每个影片剪辑放在第一帧上,但放在不同的层上。然后我隐藏/显示我想要的图层。它也很容易从外部类进行控制,并且设计起来也一样快,并且避免了我提到的任何陷阱:)

【讨论】:

  • 嗯,我感到更放心了。无论如何,我不打算使用时间线。但编程最大的挑战仍然是管理所有这些显示对象。您不仅必须手动将它们全部删除。但您还必须确保所有事件侦听器也被销毁。我刚开始使用actionscript,所以我正在学习一切。但仍然试图养成这种习惯。以及将要与侦听器一起销毁的显示对象分组的最佳实践
  • 非常有趣的是,毕竟根植于框架隐喻的 Flash 已成为 ActionScript 与图形对象对话的容器。 (如果说)。几乎所有我认识的 AS 开发人员,包括我自己,都尽量减少在 Flash IDE 中花费的时间,而宁愿使用纯 ActionScript 项目并在运行时导入图形资源。只是一时的困惑。 :)
  • 当然是:)。我现在发现我什至避免使用 Adob​​e 的编译器并用另一种语言编写 AS3。
【解决方案2】:

如果您从 Flash 开始,只使用 IDE,然后学习如何编码,那么在框架中导航是有意义的,因为它非常容易理解/实现。

我能想到的唯一优点是对象总是在那里,所以当你从一帧转到另一帧时,一旦对象被实例化,它们就会在你身边,所以不需要删除所有东西,再次添加所有内容。

我猜像Keith Peters 这样的专业人士会在视图和菜单中 100% 编码。一旦你准备好可以重复使用的漂亮的小游戏引擎(带有菜单和屏幕)(Asobu),时间线对于切换视图似乎有点毫无意义。从这个角度来看,PushButtonEngine 看起来很棒。

如果您与设计师合作,并且他/她正在设计屏幕并且时间线导航在原型设计时对他/她来说更有意义,我猜有一个中间立场。只要每个屏幕都是它自己的 MovieClip,在主时间轴内,您可以为每个屏幕 MovieClip 设置一个 Class 并从那里继续。如果你需要一些东西来为你声明舞台实例,我写了一个tiny extension 可以帮助你。然后,您可以在首选 IDE 中继续执行逻辑。

我的猜测是快速添加按钮抨击短的 indy 游戏时间线会做得很好。如果您打算重用基本引擎并制作更复杂的游戏,从长远来看,actionscript 将证明是正确的决定。基本经验法则:不要无缘无故地把事情复杂化。

【讨论】:

  • 我的代码没有那么复杂,但我明白你在说什么。我不妨坚持对我最好的东西。编码。谢谢
  • 是的,有很多方法可以做同样的事情。做任何让你感到舒服和开心的事情。很高兴我能帮忙:)
【解决方案3】:

我认为使用时间线被认为不是最佳做法真的很遗憾。我觉得这在很大程度上是 Adob​​e 的错,因为在 AS3/CS3 出来时没有提供如何按照良好的开发实践使用时间线的文档。

如果您使用时间线,您可以在加载嵌入对象时有更多选择,这意味着您不必在电影开始之前下载太多代码 - 所以您不需要那个很长的预加载器来宣传你是这样一个编码忍者,你在第一帧之前嵌入了所有内容。当然,当用户知道他们正在查看由编码忍者创建的东西时,他们会更开心,所以他们愿意等待特权。

您可能会发现这种另类视角很有趣http://www.developria.com/2010/04/combining-the-timeline-with-oo.html

【讨论】:

    【解决方案4】:

    我个人倾向于只使用 Flash IDE 来创建资产 SWC 文件。我所有的逻辑和编译都是使用FDT 完成的。编译时间更快,并且调试器工作

    这方面的主要例外是横幅,因为大多数广告服务公司使用 Flash 扩展程序与他们的后端通信,因此需要在 IDE 中工作。此外,横幅的大部分工作都是由设计师完成的,而我只有在需要处理无法在时间轴上完成的更复杂的交互时才会真正参与其中。

    底线:尽你所能以你感到舒适的方式工作,但也能以你需要的方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多