跳到主要內容

發表文章

目前顯示的是 九月, 2009的文章

Embedding JavaScript into a SWF

Flash 可以使用 ExternalInterface 類別來呼叫外部的.js函式
但前提是該html需要事件把js寫好
AS3之後, 可以把js的function整個包成.as裡, 一樣透過ExternalInterface 呼叫即可

在這個範例, 我使用了bit101的Button組件, 你可以換成自已的按鈕。
透過 XML 的 CDATA, 把整個js包進.as檔裡。
<br />package {<br /> import com.bit101.components.PushButton;<br /> import flash.display.Sprite;<br /> import flash.display.StageAlign;<br /> import flash.display.StageScaleMode;<br /> import flash.external.ExternalInterface;<br /> /**<br /> * ...<br /> * @author milkmidi<br /> */<br /> public class EmbedJSExample extends Sprite { <br /> public function EmbedJSExample() {<br /> stage.align = StageAlign.TOP_LEFT;<br /> stage.scaleMode = StageScaleMode.NO_SCALE;<br /> <br /> <br /> new PushButton(this , 0, 0, "Alert", function ():void { <br /> ExternalInterface.call( JSScripts.alert , "FlashCallJS" ); <br /> });<br /> <br /> new …

Progression3 tutorial part2

上一篇簡單分享過Progression全組件式的寫法
雖然方便, 但擴充性並不強, 要寫一個專案, 還是需要乖乖來寫程式
玩Progression要先搞懂三個要點:
1. 場景 ScendObject
他是Progression的整個核心架構
你可以想成html, 一個scene就是一頁html
該scene要有什麼元素, 都由這個SceneObject來管理
SceneObject有四個重要的事件:
_onLoad:當該場景被載入時。
_onInit:當該場景被初始化。
_onGoto:當該場景切換到別的場景時。
_onUnload:當該場景被移除時。
SceneObject的生命週期就是走這四個事件。
只有最上一層的主場景_onLoad只會發生一次
_onUnload永遠不會發生, 這個後面會再補充。

2. 可視物件 CastSprite, CastMovieClip
跟一般的Sprite, MovieClip使用起來差不多
但有二個重要的事件。
_onCastAdded:當透過new AddChild 或是 new AddChildAt 加入該物件時, 會發生的事件
_onCastRemoved:當透過new RemoveChild 移除該物件時, 會發生的事件。

3. Command
Progression提供了許多的 Command可以使用
Command Design pattern的好處就是可以依序的執行Command
跑完A, 再跑B , 再跑C,
所以可以很方便的製作單元切換的進退場效果。
像第二點的new AddChild就是 Command的其中一種

一個專案一般只會有一個Progression實體物件。
var prog:Progression= new Progression( 'index', stage, IndexScene );
'index':為該專案的Progression唯一的 Key 值, 只要key值不同, 彼此寫的Progression就不會打架
stage:把stage實體傳入
IndexScene:則是最上一層的 SceneObject, 其他的場景就由這裡開始加入

在這兒範例裡, 做了一個很簡單的架構, 好讓快速上手
首頁場景:
場景上有二個Button,
About:
A…

Hack手法強制執行垃圾回收

一起來說 Flash 垃圾回收機制是自動發生, 無法透過手動呼叫控制, 而我們若要強制啟用垃圾回收機, 則需要用一些非正規手段。
在這兒我們產生一萬個 Sprite ,並繪製色塊, 一秒鐘後, 將一萬個Sprite移除。
此時可以看到記憶體還是這麼的高。

透過使用
try { new LocalConnection().connect("milkmidi"); new LocalConnection().connect("milkmidi"); }catch (err:Error){}
記憶體就整個降了下來。
其原理就是故意使 swf 在運行時出錯, 然後throw出錯誤,
而同時通過catch error來繼續運行swf文件
而垃圾回收機則會在swf拋出錯誤的時候, 被強制執行一次
以清除 flash 內無效的數值, 減少資源的消耗。
但不是所有的throw錯誤都會發生垃圾回收。
至少這個方法是可行的。
要檢測你的swf用了多少的記憶體量, 可以使用Mr.doob所所的Stats類別來做監控。
http://code.google.com/p/mrdoob/wiki/stats

package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.net.LocalConnection; import flash.utils.setTimeout; import net.hires.debug.Stats; public class HackDemo extends Sprite { private const AMOUNT :int = 10000; private var _arr :Array; public function HackDemo(){ createTenThousandObj(); addChild(new Stats()); setTimeout( removeTenThousandObj , 1000); //雖然物件已經被移除, 但memory還是佔了約 33。 setTimeout( doHack , 1100); …

PV3D Pivot

away3d能直接修改物件的中心點
但PV3D並沒有該屬性, 但能透過以下三種方法達到一樣的效果。
1.用DisplayObject3D多包一層。
將物件加入到該DisplayObject3D, 然後對他做旋轉。
http://wonderfl.net/code/7fbfda83de4c282f304b3f11ef59575a1a10d484
2.直接去修改物件的Vertex3D座標。
http://wonderfl.net/code/b7e4f5b3650731820256cf7fbb3461662e2ec0d8
3.使用as3dmod提供的Pivot來更改。
要先下載as3dmod類別喔。

package { import com.as3dmod.modifiers.Pivot; import com.as3dmod.util.ModConstant; import com.as3dmod.ModifierStack; import com.as3dmod.plugins.pv3d.LibraryPv3d; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.cameras.CameraType; import org.papervision3d.view.BasicView; import flash.events.Event; public class PivotExampleas3dmod extends BasicView { private var do3d:Cube; public function PivotExampleas3dmod() { super(800, 600, true, false, CameraType.TARGET); init3DObject(); startRendering(); } private function init3DObject():void { var _ml:…

[新案上線]TOYOTA NEW YARIS-注目!我的代表色!

[新案上線]TOYOTA NEW YARIS-注目!我的代表色!
http://yaris.toyota.com.tw/




這次依然使用超好用的 Progression Flash Framework來製作
也嘗試了把所有flash的設計元件製作成swc, 透過FlashDevelop來發怖整個專案
這樣的製作方法超好用的啦,
發怖速度快, 終於可以不用開超慢的CS4, 又可以有Flash10的功能, 推。
身為一位專業的AS程式設計師, 一定要加個密技的啦
只要在輸入名字的欄位上,輸入大寫的RAINBOW
就會有隱藏版的畫面喔
而開場的吸入效果, 則是參考clockmaker製作的GinnyEffect
http://wonderfl.net/code/b8ec2e7155357ddc65d21eb8b1fa2e94c8363cfc



Dictionary And Proxy

今天來介紹二個 AS3 新增的二個類別(AS2沒有這東西喔)
Dictionary
簡單來說跟 Object 和 Array 是做一樣的事。
是用來索引物件用的類別。
Array是用數字來當做 Key 值。
_array[0] = "字串1";
_array[1] = "字串2";

_array[0] = "字串3";
時, 本來的值就會被取代掉
trace(_array[0]) //得到 字串3

Object是使用String來當作 Key 值
_obj['key'] = "String1";
_obj['key2'] = "String2";
(或寫成_obj.key2 = "String2";)

_obj['key2'] = "String3";
本來的值也會被取
trace(_obj['key2']) //得到 String3

Dictionary
是把'物件', 當作索引值,
每個物件都是獨立單一的, 這樣就可以確保索引值是唯一的。
var _dic :Dictionary = new Dictionary();
var _mc:MovieClip = new MovieClip();
var _mc2:MovieClip = new MovieClip();
//建立二個MovieClip
_dic[_mc] = "Dictionary Value1";
_dic[_mc2] = "Dictionary Value2";
用for in 掃一下內容。
for (var d:* in _dic) {
trace(d, _dic[d])
}
// [object MovieClip] Dictionary Value1
// [object MovieClip] Dictionary Value2
就可以得到當初寫入的值了
, 記得, 不要時一定要delete掉, 否則物件的指派還在
就不會被記憶體回被器回收喔。
完整程式碼:

package { import…