2009年8月30日 星期日

Progression專案上線, 聖克萊爾

新案上線
聖克萊爾
http://mp3.stclare.com.tw/



這次專案上完整的使用Progression FlashFramework,
嚴格來說, 還真是好用, 決解了swfAddress網址切換的問題
單元進退場的問題, 推薦給大家研究
以後做Event Site, 用他就對了
之後再來分享一下使用心得


2009年8月23日 星期日

Away3D CubeOpen




分享一下小弟在製作miniConcert網站的技術和原始檔:
http://miniconcert.milkmidi.com/
這次練習了使用Away3D, 寫起來和PV3D差不多, 概念上都一樣
而Cube打開是使用六個Plane拼成的, 傳值構通是使用Singleton Model來呼叫
並加入了新的相量3D物件, (PV3D也有)。
原始檔:

需要下載away3d,Tweener,TweenMax三個類別才能發怖程式碼喔!
SourceCodeDownload

PureMVC,Progression,CoverFlow

第一版CoverFlow
http://milkmidi.blogspot.com/2009/03/flash10coverflow.html
把全部的程式碼通通寫在一個.as檔, 日後很難修改。

第二版簡單MVC CoverFlow
http://milkmidi.blogspot.com/2009/05/flashcs4mvccoverflow.html
使用了簡單MVC 概念, 也修正 CoverFlow 移動時的問題。

第三版 PureMVC CoverFlow

CoverFlowCS4_pureMVC_sourceCodeDownload
使用 PureMVC framework來製作這樣的效果, 玩了一次後, 才真正了解 PureMVC的精神

第四版 Progression CoverFlow
progressionCoverFlow_sourceCodeDownload
使用 Progression framework來製作 CoverFlow效果, 寫起來也是滿順的
Progression的強項就是在他的Command模式, 真的很優呀,
一般的Event Site, 單元的進、退場, 用他就搞定了。

2009年8月22日 星期六

ZedBox And Bookmark

新案上線:台灣大哥大, Google Android手機。
http://event.taiwanmobile.com/android/



當然還是要來分享一下技術。
這次使用了 CJCat 同學所寫的ZedBox 2.5D Engine。
輕鬆決解了這樣的2.5D效果, 可以很直覺的對一個容器直接下rotationY。
在這兒並沒有使用到FlashPlayer10的效果。
而要加入 Blur 或是 Alpha, 也只需要再個加一行程式, ZedBox就會自動增加效果。

而最近最熱門的就是一定要在各大微網誌做分享的Icon功能。
在這兒是使用米蘭數位, 我們四位 AS(Jason,milkmidi,Ash,MarkVnn) 共同開發的專案:Anteater技劃。
原理是把各微網誌所需要傳送的值, 定義在一個js檔裡, 然後Flash再去呼叫。
原始檔下載:

2009年8月18日 星期二

上papervisionshowcase網站啦

很榮幸的奶小茶我的個人網站
也收錄在papervisionshowcase
http://www.papervisionshowcase.com/2009/08/17/milkmidi/

跨出成功的一小步呀!。

2009年8月15日 星期六

PureMVC, 快樂玩Part1

PureMVC, 快樂玩Part1
最近除了熱血的工作, 熱血的研究Progression, 當然還有熱血的PureMVC
好吧, 我承認這東西有一定的難度, 但上手後, 真的還滿方便的。
PureMVC是一種程式語言的框架, 不限於 AS3 , 官網有很多的版本可以任君選擇。
主要有三個概念
Model, Proxy
負責將數值變數存起來, 當數值被更改時, 就發送通知, 然後就什麼事也不做了。

View,Mediator
一個Mediator就對映一個View(視覺元件), 當View做了某件事情後, 發送通知。

Controller,Command
當 Mediator 被通知到後, 就執行事件做作好的Command

有了簡單概念後, 來開始試寫看看。
先下載 PureMVC AS3 standard 2.0.4版本

在這兒我們寫了一個小型的相本, 由 xml 管理, 畫面上有左、右鍵,二個動態文字
和一個要載入圖片用的Sprite。

奶小茶的習慣是先從Proxy來開始寫, 因為載入資料是最先要做的事情。
ListProxy.as
package milkmidi.puremvc.model {
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import milkmidi.puremvc.model.vo.ListVO;
import org.puremvc.as3.interfaces.IProxy;
import org.puremvc.as3.patterns.proxy.Proxy;
public class ListProxy extends Proxy implements IProxy {  

public static const NAME    :String = "ListProxy"; 

//當 xml 載入完成後, 會發送notification
public static const DATA_LOAD_COMPLETE :String = 'dataLoadComplete';

//當 xml 索引值改變時
public static const MODEL_CHANGE  :String = 'modelChange';

//當 ListProxy 被設定新值時
public static const SET_CURRENT_INDEX :String = 'setCurrentIndex';  

private var _urlLdr   :URLLoader = new URLLoader();
private var _xml   :XML;
private var _currentIndex :uint = 0;
public function ListProxy(data:Object = null) {
super(NAME, data);
_urlLdr.addEventListener(Event.COMPLETE , completeHandler);
_urlLdr.load(new URLRequest('xml_data.xml'));
//載入 xml 。
}  
private function completeHandler(e:Event):void {
_xml = XML(e.currentTarget.data);
//載入完成後,將得到的 xml 設定到 data裡。
setData( _xml );
sendNotification(DATA_LOAD_COMPLETE , data);   
//記得要發通知喔。
}  
public function setCurrentIndex(pIndex:uint):void {
_currentIndex = pIndex;
//設定索引值
if (_currentIndex < 0) _currentIndex = 0;   
else if (_currentIndex >= length - 1)
_currentIndex = length - 1;
//判斷有沒有爆掉。

var _vo:ListVO = new ListVO();
_vo.img = currentImgURL;
_vo.title = currentTitle;
_vo.page = currentPage;
//將新的數值發送出去。
sendNotification(MODEL_CHANGE , _vo);   
}
public function get length():uint {    return _xml.item.length();  }
public function get currentImgURL():String { return _xml.item[currentIndex].img;  }
public function get currentTitle():String {  return _xml.item[currentIndex].title;  }
public function get currentPage():String {  return (_currentIndex + 1) +'/' + length; }    
public function get currentIndex():uint {   return _currentIndex; }


}
}
//在這兒也準備一個VO(ValueObject), 方便給大家使用。
ListVO.as
package milkmidi.puremvc.model.vo {  

public class ListVO {  
public var title:String = '';
public var img :String = '';
public var page :String = '';

public function ListVO()  {   

}  
} 
}

有了Proxy後,下一步來寫View跟Mediator
在這兒我們就只有一個主場景, 所以就準備一個ApplicationMediator.as
Mediator的工作就是觀查視覺元件的一切, 偵聽他的事件
更改他的數值, 就是他的保母啦。
package milkmidi.puremvc.view {
import flash.events.Event;
import milkmidi.puremvc.model.ListProxy;
import milkmidi.puremvc.model.vo.ListVO;
import org.puremvc.as3.interfaces.IMediator;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.mediator.Mediator;
import milkmidi.puremvc.view.*;
public class ApplicationMediator extends Mediator implements IMediator { 
// Cannonical name of the Mediator
public static const NAME:String = "ApplicationMediator";  
public function ApplicationMediator(viewComponent:Object) {
super(NAME, viewComponent);
//偵聽主場景上的事件。
container.addEventListener('nextItem' , nextItemHandler);
container.addEventListener('prevItem' , prevItemHandler);
}  
private function prevItemHandler(e:Event):void {
sendNotification( ListProxy.SET_CURRENT_INDEX , -1 );   
//發送通知。
}  
private function nextItemHandler(e:Event):void {
sendNotification( ListProxy.SET_CURRENT_INDEX , 1 );
//發送通知。
}
override public function getMediatorName():String {
return ApplicationMediator.NAME;
}     
override public function listNotificationInterests():Array {
return [    
ListProxy.DATA_LOAD_COMPLETE,
ListProxy.MODEL_CHANGE
];
//我只關心這些通知, 其他沒寫的就通通不管。
}
override public function handleNotification(note:INotification):void {   
trace(facade.retrieveProxy( ListProxy.NAME));
//得到發送事件的 ListProxy 實體。
trace(note.getBody())   
//得到發送通知時, 一起帶過來的數值
switch (note.getName()) {        
case ListProxy.DATA_LOAD_COMPLETE:  
sendNotification( ListProxy.SET_CURRENT_INDEX , 0 );
break;
case ListProxy.MODEL_CHANGE:      
var _listVO:ListVO = note.getBody() as ListVO;
container.title_txt.text = _listVO.title + '';
container.numbers_txt.text = _listVO.page;
break;    
default:
break;  
}
}  
private function get container():Main {
return viewComponent as Main;
//轉型用, 給自己看的。
}
}
}
//另一個ImageContainerMediator.as ,是觀查場景上的載入圖片用的Sprite, 寫法差不多,就不多介紹了。

ApplicationFacade, PureMVC 的總代理, 在這奶小茶使用的是 Standard版
所以只會有一個Facade, 如果要多個應用程式, 多個Facade的話,可以選用 MultiCore版本。
所有的 Proxies , Mediators 跟 Commands 註冊
他的程式碼很少, 都是固定的寫法。
package milkmidi.puremvc {
import flash.display.Stage;
import org.puremvc.as3.interfaces.IFacade;
import org.puremvc.as3.patterns.facade.Facade;
import milkmidi.puremvc.model.*;
import milkmidi.puremvc.view.*;
import milkmidi.puremvc.controller.*;
public class ApplicationFacade extends Facade implements IFacade {
// Notification name constants
public static const STARTUP:String = "startup";  
public static function getInstance():ApplicationFacade {
if (instance == null) instance = new ApplicationFacade();
return instance as ApplicationFacade;
}  
// Register commands with the controller
override protected function initializeController():void {
super.initializeController();   
registerCommand(STARTUP, StartupCommand);
}
public function startup( pApp:Main ) : void {   
sendNotification( STARTUP, pApp );
//這兒是用來啟動整個 PureMVC用的
}  
} 
}

啟動用的Command
StartupCommand.as
package milkmidi.puremvc.controller { 
import milkmidi.puremvc.model.ListProxy;
import milkmidi.puremvc.view.ApplicationMediator;
import milkmidi.puremvc.view.ImageContainerMediator;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;
public class StartupCommand extends SimpleCommand{
public function StartupCommand(){
super();
}
override public function execute(notification:INotification):void {   
var _main:Main = notification.getBody() as Main;   
facade.registerMediator( new ApplicationMediator( _main));
//注冊 Mediator
facade.registerMediator( new ImageContainerMediator( _main.container_mc));
//注冊 Mediator, 在這兒是用來載入外圖品片的容器。
facade.registerProxy( new ListProxy());   
//注冊 Proxy。
facade.registerCommand( ListProxy.SET_CURRENT_INDEX , ModelChangeCommand);   
//注冊 Command
}
}
}
//當要更改 ListProxy裡數值用的Command
package milkmidi.puremvc.controller {
import milkmidi.puremvc.model.ListProxy;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;
import org.puremvc.as3.patterns.observer.Notification;
public class ModelChangeCommand extends SimpleCommand {

override public function execute(note:INotification):void {  
var _listProxy :ListProxy = facade.retrieveProxy( ListProxy.NAME ) as ListProxy;
var _data  :int = int(note.getBody());  
_listProxy.setCurrentIndex(_listProxy.currentIndex + _data);   
}

}
}

再來就是整個Clinet的主程式。
package  {  
import flash.display.MovieClip;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import milkmidi.puremvc.ApplicationFacade;  
public class Main extends Sprite {   
//場景上的元件
public var right_btn    :SimpleButton;
public var left_btn     :SimpleButton;
public var numbers_txt  :TextField;
public var title_txt    :TextField;
public var container_mc :MovieClip;  
public function Main()  { 
right_btn.addEventListener(MouseEvent.CLICK , clickHandler);
left_btn.addEventListener(MouseEvent.CLICK , clickHandler);
ApplicationFacade.getInstance().startup( this );
//啟動PureMVC。
}    
private function clickHandler(e:MouseEvent):void {   
//左、右鍵只管發送事件, 就沒啦。
if (e.currentTarget == left_btn) 
dispatchEvent(new Event('prevItem'));
else 
dispatchEvent(new Event('nextItem'));   
}
} 
}

完成啦, 搞的大家都很不熟, 這就是PureMVC的精神呀
下次在專案上實作看看。
SourceCodeDownload

2009年8月11日 星期二

SWFParse

最近公司的媒體部門問我有沒有辦法寫出自動檢測素材的軟體
(Google就有), 好吧, 還沒辦把像Google那麼利害。
那就來個簡單版的吧
至少能分析製作好的SWF檔
寬、高、影格數、FPS、版本
這樣在交素材前就可以先檢查, 但我總覺的這是在製作時就要注意的事。
Thumbnail - Click me

參考了http://flashpanoramas.com/blog/
該作者分享的 SWFParse 類別,
使用 FlashPlayer10 新功能 FileReference的 load, 能直接載入本機的.swf檔。
原始檔下載:

2009年8月8日 星期六

Stardust-Particle-Engine


CJcat 同學新的 Flsh Particle Engine1.0 推出來啦
結合目前最熱血的 PV3D ,等3D Engine一起使用
或是也可以結合他自已寫的 2.5D Engine ZedBox 一起使用
好東西一定要推一下。
一起為台灣的 Flash 屆努力吧

補:
8/30 ,Flash ppt版聚將會有 cj 分享他最新的 超酷炫風爆奈米粒子噴射系統 Particle Engine。
http://www.plurk.com/p/1gd2gs

2009年8月6日 星期四

Progression3 flash Framework

這幾天熱血的研究了
Progression flash Framework
分享一下學習心得, 基本上, 可以不用寫到任何的程式碼, 就可以快速的完成一個小型的專案
最酷的是, 他把 SWFAddress 整合的很好, 還有一些現成的轉場效果, 這些都不需要寫任何的程式。
1.先下載 3.1.62 mxp 外掛, 並安裝, 重新啟動 Flash CS3。
2.上方工具列:Window /Other Panels/Progression Project 開啟面版

面版長的這個樣子, 有許多的設定, 可以自已玩看看


3.設定好後, 按下 Create new project, 選擇要存檔的路徑, 就會自動幫你產生所需的檔案

4.再開啟 Progression Scene Editor面版, 開啟新增所需要的場景
在這個範例,我們的網站架構就只有三頁, Index , About , Contact
Progression的使用概念, 可以把他想成html一樣, 一個場景(Scene), 就相當於一頁html
然後該html有什麼元素, 就在Scene設定
開啟面版時, 預設就會有一個Index的場景, 按下Insert nested Scene

再按下Insert Cast Item, 這個就該場景要有什麼元件。
完成後如下圖:

5.接著再按下面版的 Export the Cast as Symbol

就可以看到元件庫產生對映的元件了。

設得要將設定好的面版, 按File Save as, 蓋掉專案裡的deploy/easycasting.xml
該.xml長的像這樣。












6.製作回首頁的按鈕:
新增一個MovieClip, 並置任意的圖片, 然後開啟Component面版, 將 RootButton組件拉里來
啟動 Component Inspector面版, 可以看到許多參設可以設定, 在這我們就直接用預設值。

7.製作About按鈕和Contact按鈕,一樣新增元件, 只是用的組件是RollOverButton。
設定按下後的連結

8.在元件庫找到對映的Page元件, 放置你自已的設計圖, 發怖就完成了
如果要套用轉場效果, 一樣在 Component可以找的到Effect Component, 拉過來就可以用了
SourceCodeDownload

2009年8月2日 星期日

奶綠茶新書上市_密技公怖_程式碼下載

奶綠茶第一本 Flash 書籍上市啦

博客來書籍館 Flash 3D 特效宅急便 - 商業範例隨學隨
把我對 Flash 的研究與熱愛, 全寫在其中
本書的前幾章, 特別安排 ActionScript3.0 的許多範例
好讓你一步步瞭解 as2 和 as3 的差別
再安排製作動畫不可缺少的 Tweener 類別和一些常用的數學動畫公式
最後當然就來到本書的重點 PV3D 啦
從 PV3D 的原理, 基本架構一點一點的介紹
再透過許多實用的範例, 從中瞭解 PV3D 製作的小技巧
有任何書籍相關的問題, 也請不吝指教
感謝一路走來, 幫助過我的前輩們,
邦邦、Ticore、神魂、Maso、Erin
旗標出版社 小編 Bready
米蘭數位所有夥伴
米蘭數位ActionScript Team:Jason,Ash,Mark

本書大鋼:
1.ActionScript3.0概論
分析AS3的概念與語法, 從基本的滑鼠事件、外部載入、氣泡事件介紹起
適合熟悉AS2, 想轉戰AS3的人員。
2.程式碼製作動畫
使用簡單的數學公式, 套用到程式裡, 脫離死版的影格動畫。
3.製作動畫的好夥伴:Tweener
除了套用數學公式外, Tweener類別也能加速我們開發出更多的動畫效果, 不需辛辛苦苦的找公式。
4.自定類別
AS3的精神, 是在於強大的物件導向, 當然也要熟悉類別的寫法與使用。
5.Flash3D - Papervison3D
如果在Flash玩轉3D效果, PV3D是最好學, 最快上手的3D Flash Engine, 從簡單的3D概念, PV3D類別, 事件等。
6 漫天飛舞的Paper3DWorld效果
7 迷你旋轉木馬式秀圖效果
8 最經典! CoverFlow 圖像展示效果
9 天旋地轉 TiltViewer效果
10 FlatWall3D電視牆效果
11 經典旋轉木馬 Carousel3D 秀圖效果
12 光源材質展示與簡易型的方塊彈跳效果
13 載入外部3D模型與動畫
14 超立體旋轉九宮格 Box3DWorld
15 空間感與透明感兼具的 SpaceGallery
16 螺旋式 SpiralCarouse 影像展示
17 Flash10 3D功能
18 Flash效能一談
19 Flartoolkit簡介
2009/08/03
奶伯伯書目前是誠品網路書店電腦書排行第一名喔~
http://www.eslite.com/sub_cate.aspx?cate=156⊂=212
天瓏則是第 15~ 還不賴~
http://tlsj.tenlong.com.tw/WebModule/Pager/pageAction.do?action=next
謝謝大家的支持,小弟會繼續努力的


以下的錯誤資訊, 己經在二刷的書裡修正了。
Bug1
光碟裡的程式碼的錯誤:
08_CoverFlow 範例檔, 需使用筆者開發的類別, 直接用光碟片裡
_milkmidi_Classes\milkmidi類別,
發怖檔案後會發生:
ReflectionFileMaterial.as,字行52
1061: 呼叫可能未定義的方法 join (透過靜態類型 Class 的參考)。

決解方法:
開啟光碟片裡的
_milkmidi_Classes\milkmidi\papervision3d\materials\ReflectionFileMaterial.as
將第52行的程式碼:
var _joinBMP :BitmapData = BitmapUtil.join(_bitmapData, _refBMP);
改成:
var _joinBMP :BitmapData = BitmapUtil.mergeBitmap(_bitmapData, _refBMP);
或是下載筆者修改過後的ReflectionFileMaterial.as直接蓋掉即可

Bug2:感謝永保同學找出的錯誤點。
1-11
"ActionScript3.0可視物件類別表"
圖中應該是DisplayObjectContainer繼承InteractiveObject才對,而非SimpleButton。
(DisplayObjectContainer跟SimpleButton的位置要對調)

"電玩遊戲轉職表"
左邊那條分支的框框內應該是職業名騎士,而不是能力"騎馬"

2-7
"笛卡兒座標"
x軸跟y軸標反了

6-4
右上角的圖片
plane.moveBackward(400)
會以目前plane物件的軸心向後移動
所以z最後的值應該是-400而並是圖片上的z:400。


Bug3
5-11
書本裡的輸出資訊是
INFO:Papervision3D 2.0.0( March 12th,2009 )
但讀者在發怖時會變成是
INFO:Papervision3D 2.0.0( December 3rd, 2008 )
但不會對程式碼有任何的影響。

Bug4:感謝Tony同學
範例 16_SpiralCarouse/SpiralCarousel.as
修正二個問題:
1.滑鼠rollOver的光暈效果、只要點擊圖片後滑鼠不移動、就算目標物旋轉之後離開了滑鼠指標、光暈也不會消掉。
因為忘了把filters拿掉
第138行
private function on3DRelease(e:InteractiveScene3DEvent):void {
//點擊plane物件時。
currentPlane = e.displayObject3D as Plane;
//將廣播者物件指派到currentPlane變數里。
currentPlane.filters = [];//新增此行

}
2.當點擊某一張圖片、等它放大並載入清析的影像之後、若是讓它旋轉到背面、它就不見了。
因為忘記開啟材質的雙面模式。
第183行
private function onLoaderComplete(e:Event):void {
//大圖示載入完成時。
this.removeChild(loaderMC);
//移除載入動畫。
var _bitmap:Bitmap = ldr.content as Bitmap;
//Loader類別載入圖檔後,其內容物為Bitmap類別。
var _bmp:BitmapData = _bitmap.bitmapData;
//Bitmap類別使用bitmapData屬性, 可以得到BitmapData類別
var _bmpMat:BitmapMaterial = new BitmapMaterial(_bmp, true);
//建構BitmapMaterial類別。
//new BitmapData(點陣圖來源,精準模式)。
_bmpMat.interactive = true;
//開啟互動模式。
_bmpMat.doubleSided = true;//新增此行
currentPlane.material = _bmpMat;
//置換currentPlane物件材質。
}

6-3頁下方講到 moveBackward()函式
但下方語法卻寫 moveForward(...)...
修正成moveBackward(移動量:Number):void

8-8頁:
圖片中的第 0, 1, 3, 4 的plane旋轉角度與書中案例相反了,
修正後的圖片:


8-4頁程式碼中
plane.z=i*-20;
//讓z軸遞減,以呈現出越靠外側圖越小,看起來離得越遠的樣子。
這句的不之其用意、只要一執行shiftToItem()之後、i*-20的效果都被覆寫了不是嗎?
答:因為要避免一開始所有圖片的z軸都一樣, 會容易產生破圖的問題, 所以才讓z軸遞減。

8-4頁碼式碼下方
if(loadedNumber >= itemOfNumber){
//如果已經載入的圖片數量大於總圖片數量
修正成
if(loadedNumber == itemOfNumber){
//如果已經載入的圖片數量等於總圖片數量

9-4頁程式碼
public class TiltViewer...{
大括弧內忘了縮排

10-7頁
view.camera.x+=_increment;
少了X、應該是
view.camera.x+=_incrementX;

14-3頁下方
_cube.x=i%3*offset-((offset/2)*2)
其中的 ((offset/2)*2) 這樣的公式運算結果是不變。
修正成:
_cube.x=i%3*offset-offset;
_cube.y = Math.floor(i / 3) * offset - offset;



問與答:
1.不曉得 camera.zoom 和 camera.focus 的差異性在哪裡?
2.camera 有沒有一個屬性像是 maya 裡 camera 的 focal length 那樣、可以調整畫面的透視效果? 現在的透視效果就像是經由攝影機或相機拍到的廣角畫面、
某些角度下物件的角落都會變得很尖銳,我希望是有個屬性能夠調整到接近肉眼看到物體的效果、不知道有沒有這樣的設定?

答:
關於PV3D camera zoom屬性和focus屬性
附上 Away3D 的Demo範例, 可以清楚的看到
Thumbnail - Click me

zoom指的是鏡頭的倍率值, 數值越大, 物件也越大, 但物件本身是沒有移動的
focus指的是焦距, 數值會影響到透視的效果, 但這個數值在 PV3D 目前沒有這樣的功能
只能等待下一版的改善。


問:3. 14章裡的範例中沒有將 light 加到 scene 中、但材質仍顯示出有光照的效果,所以意思是 view.scene.addChild(light) 這句可有可無嗎?
答:光源物件如果要出現測試用的黃色實體, 就需要加入view.scene.addChild(light) 這段
在該範例, 因為不需要出現光源實體, 所以可有可無




補充一
在發怖本書的程式碼時, 請不要重時安裝二個版本以上的 PV3D 類別檔, 會產生一些發怖錯誤
使用光碟片裡的 PV3D類別檔
或是下載官網Papervision3D_2.0.883版本



補充二:密技公怖啦




為了此書, 奶老師寫了很多的demo, 但有些沒辦法收錄在書中, 覺得很可惜
特別安排了一個密技, 只要不小心輸入成功,就會不小心有隱藏版的程式碼喔
先確定你的Flash Player版本是10以上。


開啟某個教學影片的.html, 點一下畫面,讓影片stop


輸入:上上下下左右左右BABA



華麗的PV3D轉場


出現了啦,Titan老師製作的扭蛋機


如果不小心扭到吉, 就會有好物下載喔
至於有幾個好物下載,就讓讀者自已來玩看看

補充3:Flartoolkit source Code Download
http://flartoolkit.milkmidi.com
不知道大家玩了Flartoolkit了沒, 超有趣的技術。
Flartoolkit官方網站
作者所撰寫的範例原始碼
Flartoolkit source Code Download


QA時間:
Q:請問密技中的3D爆破轉場效果是怎麼做的?
A:原始檔在這兒可以下載
http://milkmidi.blogspot.com/2009/04/pv3d-break.html

Q:在圖片放大後點及該放大的圖片即可對外聯結至相對應的網址,
點及圖片以外的地方則回到原來的旋轉秀畫面,請問我該如何做呢?
A:
宣告一組 Array 用來存放網址用
當小圖按下時, 載入大圖片。
透過偵聽 stage 的 MouseEvent.CLICK 事件時
e.target 和 e.currentTarget 來判斷所點程到的目標物件
然後再超連結到指定的網址。
package { 
略
public class MiniCarousel extends MovieClip{
略
private const URL_ARR :Array = [
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com",
"http://milkmidi.blogspot.com"
]   

private function onStageClick(e:MouseEvent):void { 
//增加以下這行做判斷
if (e.target != e.currentTarget) {    
navigateToURL( new URLRequest(URL_ARR[currentIndex]), "_blank");
return;
}

ldr.unload();
//移除Loader載入的物件。
stage.removeEventListener(MouseEvent.CLICK, onStageClick);
//取消偵聽。
right_btn.visible = left_btn.visible = true;
//讓左、右Button看的見。
}  
}
}

Q:CoverFlow範例, 如果為 Plane 加上alpha ,除了被選到的,其他的照片依序alpha值遞減?
A:PV3D 的物件如果要加上 alpha或是 濾鏡的話, 只要開啟其 useOwnContainer 屬性
CoverFlow_2.as 第48處增加 第49行
plane.useOwnContainer = true;
修改 shiftToItem(p_id:int):void 函式如下:
public function shiftToItem(p_id:int):void {
略
for (var i:int = 0; i < itemOfNumber; i++){
var plane:Plane = view.scene.getChildByName("item" + i) as Plane;
var dis :int = i - p_id;
if (i == p_id) {   
_tweenObj =
{
x   :0,
y   :selectPlaneY,
z   :selectPlaneZ,
alpha  :1, //加入這一行
rotationY :0,
onComplete :function ():void {
略
}
};
} else if (i < p_id) {
_tweenObj =
{
x   :dis * planeSeparation - planeOffset,    
y   :0,
z   :Math.abs(dis * 10), //加入這一行
alpha  :1 - Math.abs(dis / 5),//加入這一行   
rotationY : -planeAngle
};
} else  {   
_tweenObj =
{
x   :dis * planeSeparation  + planeOffset,    
y   :0,
z   :Math.abs(dis * 10),//加入這一行
alpha  :1 - Math.abs(dis / 5),//加入這一行
rotationY :planeAngle
};     
}    
略
Q:書裡的Appendix_A CoverFlowCS4, 如何增加超連結呢? A:新增一個Array用來放置超連結的位置 當點擊MovieClip時, 透過一開始定義的id來做判斷 在上方宣告一個Array: private const HREF_ARR :Array = [ "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com", "http://milkmidi.blogspot.com" ];
修改這個函式
public function shiftToItem(p_id:int):void {
if (p_id == currentPlaneIndex) {
navigateToURL(new URLRequest(HREF_ARR[p_id]));   
return;
}
略