AS3代码反馈

Sin*_*hus 1 flash actionscript feedback actionscript-3

我刚刚开始在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);
        }




    }

}
Run Code Online (Sandbox Code Playgroud)

Jam*_*ett 9

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

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

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

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