2009年10月26日 星期一

氣泡事件與客製化事件

AS3最好用的就是新的事件流
而且可以使用氣泡事件的方法, 一路往上打, 非常的好用
不要再寫像是AS2的 parent.parent.parent.gotoAndPlay(2)了

假設場景結構如下
Stage MainTimeline Loader(載入Child.swf)
當Child.swf裡的按鈕被按下時, 主時間要開始播放
可以用類似AS2的寫法是 MovieClip(parent.parent).gotoAndPlay(2);

AS3,可以叫Child.swf發送氣泡事件往上層打, 一路的可視可件都可以偵聽的到。
如果想要發事件時, 一起帶個參數出去
可以寫個 get 的屬性, 透過偵聽者函式 e.target即可得到發出事件者
或是可以發送一個客製化的事件, 就不需要寫 get 屬性。


Child.swf Child.as
該swf上有二個按鈕, 名稱為:btn_mc , btn2_mc
package  {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import milkmidi.CustomEvent;
/**
* ...
* @author milkmidi
*/
public class Child extends Sprite {  

public var btn_mc :MovieClip;  
public var btn2_mc :MovieClip;  
private var _msg :String = "我是Child.swf的變數";
public function Child() {
btn_mc.buttonMode = true;
btn_mc.addEventListener(MouseEvent.CLICK , _btnClickHandler);

btn2_mc.buttonMode = true;
btn2_mc.addEventListener(MouseEvent.CLICK , _btn2ClickHandler);
}  
private function _btnClickHandler(e:MouseEvent):void {

//發送氣泡事件, 事件名稱為:ChildEvent, 
trace('Child.swf 發送 dispatchEvent(new Event( "ChildEvent" , true))')   
dispatchEvent(new Event( "ChildEvent" , true));   
}

private function _btn2ClickHandler(e:MouseEvent):void {
trace('Child.swf 發送 dispatchEvent(new CustomEvent(CustomEvent.CHILD_EVENT , true))')   
dispatchEvent(new CustomEvent( CustomEvent.CHILD_EVENT , true , "CustomEvent 並加送參數"));   
}  
public function get msg():String { return _msg; }  
}
}

CustomEvent.as
package  milkmidi{
import flash.events.Event; 
public class CustomEvent extends Event {
public static const CHILD_EVENT:String = "childEvent";  
public var msg:String;
public function CustomEvent(pType:String, pBubble:Boolean = false , pMsg:String = "") { 
super(pType, pBubble, false);
msg = pMsg;
} 

public override function toString():String { 
return formatToString("CustomEvent", "type", "msg");    
}

}

}

主檔:Main.swf Main.as
package  {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import milkmidi.CustomEvent;
/**
* ...
* @author milkmidi
*/
public class Main extends Sprite {  

private var _ldr:Loader;
public function Main() {
_ldr = new Loader();
_ldr.addEventListener("ChildEvent" , _childEventHandler);   
_ldr.addEventListener(CustomEvent.CHILD_EVENT , _customEventHandler);      
_ldr.load(new URLRequest("Child.swf"));
addChild(_ldr);
}

private function _customEventHandler(e:CustomEvent):void {
trace(e);
trace(e.msg);
//在偵聽CustomEvent,可以一起發送參數, 這樣就不需要在發送物件者寫一個 get 屬性。
}

private function _childEventHandler(e:Event):void {
trace(e.currentTarget , e.target);
//e.currentTarget 得到一開始注冊的物件, 也就是 _ldr
//e.target 得到真正送出事件的物件, 也就是 Child.swf
trace(e.target.msg);
//該物件有個 msg 的 get 屬性
//即可得到該變數
}

}

}
SourceCodeDownload
這樣就可以完成二個不同的.swf檔, 發送事件並加送參數, 相當的好用

2009年10月19日 星期一

二篇很實用的Facebook App開發心得

最近的 facebook 非常的火紅, 什麼活動都想辦法要跟 fb 結合一下
必竟朋友之間的傳遞是最有效的廣告
我自己只研究了一點點的fb app應用, 還沒有很熟
有興趣的朋友可以先參考這二篇教學, 寫的很清楚喔
Jason
http://blog.iamjason.com/2009/09/facebook-flash-application4.html
網路基因
http://blog.webgene.com.tw/?p=1085

2009年10月18日 星期日

stage與AddedToStage

無法取存 null 的參考屬性或方法
這大概是 AS3 最常出現的 error
最容易發生在 stage 的屬性使用
所有的 DisplayObject 物件都有
parent(上一層的容器)
root(該swf的最上一層容器)
stage(唯一的 Stage 類別)
但這三個屬性一開始都是 null
一定要當該可視物件被加入到清單裡, 屬性才會有值
var _mc:MovieClip = new MovieClip();
_mc.parent;
_mc.root;
_mc.stage;
//通通都是 null

var _spr:Sprite = new Sprite();
_spr.addChild(_mc);
_mc.parent; //可以得到 _spr物件, 因為被加入了
//但root和stage還是null

//this是主時間軸
this.addChild(_spr);
//這時_mc.root, _mc.stage才會有值。
而在寫 Class 時也一樣
package  {  
import flash.display.Sprite; 
import flash.events.Event;
public class Main extends Sprite {    
public function Main()  {   
trace(stage);
//如果直接執行該swf, stage是有值的
//但如果是被載入, stage一開始是null
//要避免這樣的問題, 就直接偵聽 AddedToStage 事件即可   
if (stage) init(null);
else addEventListener(Event.ADDED_TO_STAGE , init);
}    
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//把要做的事寫在這兒
//這樣就可以確保 stage 屬性一定有值
}
} 
}

2009年10月12日 星期一

米蘭數位2010強力徵才

2010強力徵才 資深網頁設計師+資深創意企劃+網路媒體企劃+專案執行+行政助理
因應2010年之業務發展需求及組織調整
米蘭2010年強力大徵才行動開始囉!!!
如果你(妳)對數位行銷有相當的興趣與熱忱
能體認這行業的辛酸甘苦 歡迎您來一同在浪頭上向前進!
原文網址:
http://medialand.com.tw/blog/article.asp?id=1007

2009年10月9日 星期五

使用mxml來製作Flash

一般來說, 要產生swf格式有很多方法
1.直接使用Flash發怖.fla , 但大部份 Flex mx 類別都無法使用
2.使用 Flex 標準 mxml發怖, 但檔案 200k 起跳
經過不斷的爬文, 發現 mxml 只是一個序述的格式, 也就是可以完全的客製化表籤名稱
這樣就可以使用 mxml 來寫 as, 只要不用到 mx 類別, 就不會變胖。
參考了這幾個網站得來的心得:
http://www.ryancampbell.com/2009/08/26/using-mxml-without-flex-example-and-source/
http://pv3d.org/2009/03/17/mxml-without-the-flex-framework/
最好用的當然是 Bindable 了呀
只要寫{xxxx}就可以直接挷定, 不需再像寫.as一樣寫一大堆了。
而視覺元件可以用Flash製作成.swc來使用
程式碼:

MXMLContainer基底用的類別, 是 extends Sprite不是UIComponent喔

把之前練習過的CoverFlow拿出來改一下, 這個就很一般。

MXML登場

經過 release 發怖, 檔案也才 18kb
之後再來想想要怎麼應用好了。
SourceCodeDownload
需要使用FlexBuilder發怖或是用 FlashDevelop + FlexSDK

2009年10月4日 星期日

MQuery2.0.2發怖

這次更新了自己的類別檔MQuery, 版本為2.0.2
和之前的1.0用法都一樣, 新增了許多的功能, 為了都是要減化 AS3 的程式碼。


還可以搭配Flash面版, 選取需要的功能, 按下copy to clipboard , 再貼到影格上即可
MQuery 2.0 Project page:http://code.google.com/p/milkmidi/
完整類別檔下載:http://milkmidi.googlecode.com/files/MQuery2.0.2.src.zip
Example下載:http://milkmidi.googlecode.com/files/MQuery2.0.2Examples.zip
線上說明文件:MQuery2.0.2 doc