AS3代码反馈

时间:2009-09-06 00:36:17

标签: flash actionscript-3 actionscript feedback

我刚开始在AS3编码,从专家那里得到一些反馈真的很棒;关于我的编码风格,我做错的事情,我可以改进的事情,最佳实践等等......如果你有一些额外的提示或技巧,那就太棒了。

这是我的第一段AS3代码,花了我5个小时,puh:

package {

    import flash.display.Sprite;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.*;
    import flash.errors.*;
    import flash.display.MovieClip;
    import gs.*;
    import flash.display.Loader;
    import net.stevensacks.preloaders.CircleSlicePreloader;

    public class FlatSelector extends MovieClip {

        var preloader:CircleSlicePreloader = new CircleSlicePreloader();
        var imageLoader:Loader = new Loader();
        var globalXML:XML;

        public function FlatSelector() {
            stage.addEventListener(Event.ENTER_FRAME, init);
            building.alpha = 0;
        }

        public function init(event:Event):void {
            stage.removeEventListener(Event.ENTER_FRAME, init);
            var loader:URLLoader = new URLLoader(); 
            loader.addEventListener(Event.COMPLETE, handleXML);
            loader.load(new URLRequest('http://localhost/boligvelger/flats.xml'));
            TweenLite.to(building, 2, {alpha:1});
            TweenLite.to(building.flat, 2, {alpha:0.5, tint:0x00FF23});
            //var myTween:TweenLite = TweenLite.to(mc, 1, {x:200});
            //var myTween:TweenLite = new TweenLite(mc, 1, {x:200});
        }

        public function handleXML(e:Event):void {
            var xml:XML = new XML(e.target.data);
            globalXML = xml;
            for (var i:Number = 0; i < xml.leiligheter.leilighet.length(); i++) {
                var flatName = xml.leiligheter.leilighet[i].navn;
                if(movieClipExists(building[flatName])) {
                    building[flatName].addEventListener(MouseEvent.MOUSE_UP, flatMouseClick);
                    building[flatName].addEventListener(MouseEvent.MOUSE_OVER, flatMouseOver);
                    building[flatName].addEventListener(MouseEvent.MOUSE_OUT, flatMouseOut);
                    building[flatName].alpha = 0;
                    TweenLite.to(building[flatName], 2, {alpha:0.5, tint:0x00FF23});
                }
            }
        }

        public function showInfoBox():void {

        }

        public function showFlat(flatName:String):void {
            trace('flatName: '+flatName);
            trace('flat shown');
            var imageURL;
            for (var i:Number = 0; i < globalXML.leiligheter.leilighet.length(); i++) {
                if(globalXML.leiligheter.leilighet[i].navn == flatName) {
                    imageURL = globalXML.leiligheter.leilighet[i].plantegning;
                }
            }
            trace(imageURL);
            loadImage(imageURL);
        }

        public function showBuilding():void {
            TweenLite.to(imageLoader, 0.5, {alpha:0, onComplete:function(){
                removeChild(imageLoader);           
            }});
        }

        public function flatMouseClick(e:MouseEvent):void {
            trace('clicked');
            TweenLite.to(building, 0.7, {alpha:0, onComplete:showFlat(e.target.name)});
            TweenLite.to(building, 2, {y:stage.stageHeight, overwrite:0});
        }

        public function flatMouseOver(e:MouseEvent):void {
            TweenLite.to(building[e.target.name], 0.5, {tint:0x62ABFF});
            building[e.target.name].buttonMode = true;
        }

        public function flatMouseOut(e:MouseEvent):void {
            TweenLite.to(building[e.target.name], 0.5, {tint:0x00FF23});
        }

        public function showPreloader():void {
            preloader.x = (stage.stageWidth-preloader.width)/2;
            preloader.y = (stage.stageHeight-preloader.height)/2;
            preloader.alpha = 0;
            addChild(preloader);
            TweenLite.to(preloader, 0.5, {alpha:1});
        }

        public function hidePreloader():void {
            TweenLite.to(preloader, 0.5, {alpha:0, onComplete:function(){
                removeChild(preloader);         
            }});
        }

        public function loadImage(url):void {
            imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loaderProgressStatus);
            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete);
            var imageURL:URLRequest = new URLRequest(url);
            imageLoader.load(imageURL);
            showPreloader(); 
            function loaderProgressStatus(e:ProgressEvent) {  
                //trace(e.bytesLoaded, e.bytesTotal); 
            }
            function loaderComplete(e:Event) {
                hidePreloader();
                imageLoader.alpha = 0;
                imageLoader.y = (stage.stageHeight-imageLoader.height)/2;
                addChild(imageLoader);
                TweenLite.to(imageLoader, 2, {alpha:1});
            }
        }

        public function movieClipExists(mc:MovieClip):Boolean {
            return mc != null && contains(mc);
        }




    }

}

4 个答案:

答案 0 :(得分:9)

完全披露:我是一名肛门和迂腐的评论家,所以不要亲自接受。一般来说,你的代码很好。

  • 为什么ENTER_FRAMEinit之前延迟?也许你有充分的理由,但我不知道。您应该可以直接从构造函数中调用init
  • 我知道Adobe建议在类属性定义中静态实例化,但我认为它风格不好。我在构造函数中或在我确定它将首先被使用的任何地方都这样做(通常情况下我知道它应该初始化的位置)。
  • 很好地使用了lib函数(TweenLite)来制作动画。 1
  • 删除未使用的已注释掉的代码。如果您认为有一天需要返回旧版本,请使用源代码管理。永远不要将注释掉的代码留在实时源代码中 - 它是代码腐烂
  • for (var i:Number&lt; - 应该使用int作为整数计数器。
  • xml.leiligheter.leilighet.length()&lt; - 考虑在var len:int = ...
  • 中缓存此内容
  • var flatName =&lt; - 不要懒惰,忘记你的类型。
  • xml.leiligheter.leilighet[i].navn&lt; - 在那里深挖。你可能宁愿这样做:
    var children:XMLList = xml.leiligheter.leilighet;
    for each(var node:XML in children) 
    {
        var flatName:String = String(node.navn);
        if(movieClipExists(building[flatName])) 
        {
            building[flatName].addEventListener(MouseEvent.MOUSE_UP, flatMouseClick);
            building[flatName].addEventListener(MouseEvent.MOUSE_OVER, flatMouseOver);
            building[flatName].addEventListener(MouseEvent.MOUSE_OUT, flatMouseOut);
            building[flatName].alpha = 0;
            TweenLite.to(building[flatName], 2, {alpha:0.5, tint:0x00FF23});
        }
    }
  • public function showInfoBox&lt; - 空函数?代码腐烂,摆脱它。
  • trace('flatName: '+flatName);&lt; - 我养成去除痕迹的习惯。您的代码中有几个。只要你绝对需要它们就把它们留在那里然后去除它们。
  • 在函数showFlat中有更多痕迹和糟糕的XML处理。
  • TweenLite.to(imageLoader, 0.5, {alpha:0, onComplete:function(){&lt; - 我知道在这里写一个匿名函数很容易,但更好的做法是使IMHO成为一个成员函数。当我想要一个闭包时,我倾向于只使用匿名函数。
  • TweenLite.to(building,0.7,{alpha:0,onComplete:showFlat(e.target.name)}); &lt; - 此调用会立即显示为flat ...它不会像您想象的那样等待onComplete。
  • building[e.target.name].buttonMode = true;在构建建筑物时(handleXML期间),您应该只设置一次,而不是每次都将其设置为
  • loadImage中,您在名为loaderProgressStatusloaderComplete的内部定义了两个命名函数。这些应该在类级别定义,因为loaderProgressStatus是空的 - 不要定义它,也不要将它指定为监听器(code-cruft)
  • 在import语句中避免使用通配符(*)。明确声明每次导入可能需要更多的工作,但它可以最大限度地减少可能发生名称冲突的可能性。

就像我说的那样 - 我非常挑剔。您的代码风格一致,显示出良好的潜力。只有几种主要类型的错误:

  1. 未使用的代码不应保留在活动文件中。
  2. trace应仅在调试期间存在,并且应尽快消失。
  3. 除非您需要关闭,否则请避免使用匿名函数和内部函数。
  4. 更好地熟悉XML的E4X样式处理,这样您就不必不必要地挖掘XML结构。
  5. 确保始终使用类型和最合适的类型(int而不是Number
  6. 注意分配回调 - 您正在错误的时间执行功能。

答案 1 :(得分:3)

导入类时,请尽量不要使用通配符“*”。 e.g。

import flash.events.*;

请准确说明您要使用的课程。

原因:

  1. 当你的项目变大时,你 它可能需要导入其他类 可能与其中一个班级发生冲突 这是使用外卡进口的, 以及引起冲突的阶级 没有被使用。
  2. 更容易调试。你知道哪个 包需要查找的时间 出了点问题。

答案 2 :(得分:2)

需要注意的一点是:避免内存泄漏使用带有事件侦听器的弱引用。这是建议的,因为即使所有引用都从一个对象中删除,但它有一个注册到另一个对象事件的函数,该对象也不会被垃圾收集(因为还有某种引用),除非你使用了弱引用。

更多信息:http://www.gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

本文还指出了匿名函数和弱引用的问题,这可能会引起不小心的头痛。

此外,我必须补充一点,如果您过度创建和“销毁”对象,这只是一个问题。

答案 3 :(得分:-2)

今年夏天,我写了一个用于在AS3中创建折线图的图表类。基于这种经验,我可以说你的代码非常好,但我更喜欢在类变量和函数之前明确地编写 this 关键字。因此,如果您声明一些类似的局部变量,那么它们之间就不会丢失。