我刚开始在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);
}
}
}
答案 0 :(得分:9)
完全披露:我是一名肛门和迂腐的评论家,所以不要亲自接受。一般来说,你的代码很好。
ENTER_FRAME
在init
之前延迟?也许你有充分的理由,但我不知道。您应该可以直接从构造函数中调用init
。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成为一个成员函数。当我想要一个闭包时,我倾向于只使用匿名函数。building[e.target.name].buttonMode = true;
在构建建筑物时(handleXML
期间),您应该只设置一次,而不是每次都将其设置为loadImage
中,您在名为loaderProgressStatus
和loaderComplete
的内部定义了两个命名函数。这些应该在类级别定义,因为loaderProgressStatus
是空的 - 不要定义它,也不要将它指定为监听器(code-cruft)*
)。明确声明每次导入可能需要更多的工作,但它可以最大限度地减少可能发生名称冲突的可能性。就像我说的那样 - 我非常挑剔。您的代码风格一致,显示出良好的潜力。只有几种主要类型的错误:
trace
应仅在调试期间存在,并且应尽快消失。int
而不是Number
)答案 1 :(得分:3)
导入类时,请尽量不要使用通配符“*”。 e.g。
import flash.events.*;
请准确说明您要使用的课程。
原因:
答案 2 :(得分:2)
需要注意的一点是:避免内存泄漏使用带有事件侦听器的弱引用。这是建议的,因为即使所有引用都从一个对象中删除,但它有一个注册到另一个对象事件的函数,该对象也不会被垃圾收集(因为还有某种引用),除非你使用了弱引用。
更多信息:http://www.gskinner.com/blog/archives/2006/07/as3_weakly_refe.html
本文还指出了匿名函数和弱引用的问题,这可能会引起不小心的头痛。
此外,我必须补充一点,如果您过度创建和“销毁”对象,这只是一个问题。
答案 3 :(得分:-2)
今年夏天,我写了一个用于在AS3中创建折线图的图表类。基于这种经验,我可以说你的代码非常好,但我更喜欢在类变量和函数之前明确地编写 this 关键字。因此,如果您声明一些类似的局部变量,那么它们之间就不会丢失。