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)
完全披露:我是一名肛门和迂腐的评论家,所以不要亲自接受.一般来说,你的代码很好.
ENTER_FRAME延迟init呢?也许你有充分的理由,但我不知道.您应该可以init直接从构造函数调用.TweenLite)进行动画制作.+1for (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成为一个成员函数.当我想要一个闭包时,我倾向于只使用匿名函数.building[e.target.name].buttonMode = true;你应该在建造建筑物时(在期间handleXML)只设置一次,而不是每次都被建造loadImage您定义了两个命名函数中命名loaderProgressStatus和loaderComplete.这些应该在类级别定义,因为它loaderProgressStatus是空的 - 不要定义它,也不要将它指定为监听器(code-cruft)*import语句中的通配符符号().明确声明每个导入可能需要更多的工作,但它可以最大限度地减少可能的名称冲突的可能性.就像我说的 - 我很挑剔.您的代码风格一致,显示出良好的潜力.只有几种主要类型的错误:
traces应仅在调试期间存在,并应尽快消失.int以上Number)