跳到主要內容

發表文章

目前顯示的是 9月, 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 />

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, 其他的場景就由這裡開始加入 在這兒範例裡, 做了一個很簡單的架構, 好讓快

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(

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():v

[新案上線]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

PV3D CubeInteractive

如何使用PV3D, 針對單一Cube偵聽點擊時的面呢 不需要去貼六個Plane, 只需要對Cube做一般的InteractiveScene3DEvent 透過e.face3d,即可得到點擊時的面物件。 再透過e.face3d.material.name來做判斷, 就可以完成 PV3D CubeInteractive - wonderfl build flash online

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掉, 否則物件的指派還在 就不會被記憶