1


0

私はAS3でコーディングを始めたばかりで、専門家からいくつかのフィードバックを得るのは本当に素晴らしいでしょう。コーディングスタイル、間違っていること、改善できること、ベストプラクティスなど あなたがいくつかの追加のヒントやトリックを持っているならまた、それは素晴らしいでしょう。

これが私のAS3コードの最初のビットです、5時間かかりました、puh:

パッケージ {

import flash.display.Sprite; flash.net.URLLoaderをインポートします。 flash.net.URLRequestをインポートします。 flash.events。*をインポートします。 import flash.errors。*; import flash.display.MovieClip; import gs。*; import flash.display.Loader; import net.stevensacks.preloaders.CircleSlicePreloader;

パブリッククラスFlatSelectorはMovieClipを拡張します。

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

パブリック関数FlatSelector(){stage.addEventListener(Event.ENTER_FRAME、init); building.alpha = 0; }

パブリック関数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:イベント):void {var xml:XML = new XML(e.target.data); globalXML = xml; (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}); }}}

パブリック関数showInfoBox():void {

}

パブリック関数showFlat(flatName:String):void {trace( 'flatName:' flatName);}トレース( 'flat drawn'); 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プランニング。 trace(imageURL); loadImage(imageURL); }

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

パブリック関数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、上書き: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}); }

パブリック関数showPreloader():void {preloader.x =(stage.stageWidth-preloader.width)/ 2;} preloader.y =(stage.stageHeight-preloader.height)/ 2; preloader.alpha = 0; addChild(プリローダー); TweenLite.to(プリローダー、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();関数loaderProgressStatus(e:ProgressEvent){//trace(e.bytesLoaded、e.bytesTotal);関数loaderComplete(e:Event){hidePreloader();} imageLoader.alpha = 0; imageLoader.y =(stage.stageHeight-imageLoader.height)/ 2; addChild(imageLoader); TweenLite.to(imageLoader、2、{alpha:1}); }}

パブリック関数movieClipExists(mc:MovieClip):ブール{return mc!= null


}

}

4 Answer


9


完全な開示:私は肛門でペディキュアな査読者ですので、個人的には考えないでください。 一般的にあなたのコードは良いです。

  • なぜ ENTER_FRAME`が init`の前に遅れるのですか? おそらくあなたには正当な理由がありますが、私はそれを知りません。 あなたは自分のコンストラクタから直接 `init`を呼ぶことができるはずです。

  • アドビはクラスのプロパティ定義で静的にインスタンス化を推奨することを知っていますが、私はそれを悪いスタイルと考えています。 私はそれをコンストラクタの中で、あるいはそれが最初に使われると確信できるところならどこでもそれをします(それが初期化されることを意図している場所を知っている場合がほとんどです)。

  • アニメーションのためのlib関数( TweenLite)を上手に使います。 1

  • 使用されていないコメントアウトされたコードを削除してください。 いつか古いリビジョンに戻る必要があると思う場合は、ソース管理を使用してください。 コメントアウトされたコードをライブソースのままにしないでください - それは_code rot_です。

  • 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;それぞれについて(var node:子内のXML){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(){} { - ここに無名関数を書くのは簡単なことだと思いますが、メンバー関数を作るのは私見のほうがいいです。 私はクロージャーが欲しいときだけ無名関数を使う傾向があります。

  • TweenLite.to(building、0.7、\ {alpha:0、onComplete:showFlat(e.target.name)}); < - この呼び出しはすぐに平らに表示されます…​ あなたが考えるかもしれないようにそれはonCompleteを待ちません。

  • `building [e.target.name] .buttonMode = true;`建物を建設している時( `handleXML`の間)に一度だけこれを設定すべきであり、それがマウスオーバーされるたびにではない

  • loadImage`では、 loaderProgressStatus`と `loaderComplete`の中に2つの名前付き関数が定義されています。 これらはクラスレベルで定義されるべきであり、 `loaderProgressStatus`は空なので定義しないでリスナとして割り当てないでください(code-cruft)

  • インポートステートメントでは、ワイルドカード記号( *)を避けてください。 各インポートを明示的に宣言するのはもう少し手間がかかりますが、名前が衝突する可能性は最小限に抑えられます。

私が言ったように - 私はとてもうるさいです。 あなたのコードスタイルは一貫しており、良い可能性を示しています。 主な種類のエラーはわずかしかありません。

  1. 未使用のコードがアクティブファイルに残ることはありません。

  2. `trace`はデバッグ中にのみ存在し、できるだけ早く消えるはずです。

  3. クロージャを必要としない限り、無名関数や内部関数は避けてください。

  4. XMLのE4Xスタイルの処理に慣れ親しんでください。そうすれば、不必要にXML構造を詳しく調べる必要がなくなります。

  5. 常に型と最も適切な型( int`より int`)を使うようにしてください

  6. コールバックの割り当てに気をつけてください - あなたは間違った時に関数を実行しています。


3


クラスをインポートするときは、ワイルドカード "*"を使用しないでください。 例えば

flash.events。*をインポートします。

使用するクラスを正確に指定してください。

理由:

  1. プロジェクトが大きくなると、他のクラスをインポートする必要が生じることがあります。ワイルドカードを使用してインポートされたクラスの1つと競合し、競合を引き起こすクラスがまったく使用されていない可能性があります。

  2. デバッグが容易になります。 問題が発生したときにどのパッケージを探す必要があるかがわかります。


2


注意が必要なことの1つは、メモリリークを回避するために、イベントリスナで弱い参照を使用することです。 これは、すべての参照がオブジェクトから削除されていても、他のオブジェクトのイベントに登録されている関数を持っていても、オブジェクトがガベージコレクションされないためです。弱い参照を使用しました。

詳細情報:http://www.gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

この記事ではまた、無名関数と弱い参照に関する問題も指摘しています。これは、不注意なことで頭痛の種になることがあります。

また、私はあなたが過度にオブジェクトを作成して「破壊」している場合にのみこれが問題になることを付け加えなければなりません。


-2


今年の夏、AS3で折れ線グラフを作成するためのグラフクラスを作成しました。 その経験に基づいて、私はあなたのコードがかなり良いと言うことができます、しかし私はクラス変数と関数の前に* this *キーワードを明示的に書くことを好む ですから、似たようなローカル変数を宣言すれば、それらの間で迷子になることはありません。