2012年12月18日 星期二

Starling 基本運用

Starling是一個基於Stage 3D 所開發的一個能夠使用GPU來加速的2D Flash應用程序的ActionScript 3框架。其最大的有點事可以很快的寫出使用GPU加速的應用程序而不必接觸那些複雜的底層Stage3D API


如果你曾經研究過stage3D你會發現底層Stage3D API實在有夠難用..
一般來說,一個3D場景由一組3D幾何圖形(geometries)(面(meshes))組成。每個幾何圖形由一組三角形(triangles)組成,而每個三角形又由一組頂點(vertices)組成。所以,一個3D場景只由一組頂點定義,最後再加入一些相關渲染信息,比如:紋理(textures)或者頂點顏色(vertex colors).


利用純Stage 3D API來渲染一個MovieClip則需要創建兩個三角形然後貼上紋理才能實現,雖然這種直接調用Stage 3D的方式具有更大的靈活性,但是卻具有較高的開發難度。然而Starling 框架本身已經實現了這些底層操作,我們只需要類似於AS3的方式簡單的調用其方法則可實現同樣的功能。


關於starling的基本安裝與學習我推薦這幾位高手的部落格
http://grayliao.blogspot.tw/2011/11/starling-framework0.html
http://www.gisthink.com/blog/guoguogis/?p=175


以下是小弟自行練習的demo


Startup.as

package demo1
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import starling.core.Starling;
/**
* ...
* @author Ray Cheng
*/
[SWF(width="480", height="700", frameRate="60", backgroundColor="#222222" )]
public class Startup extends Sprite
{
//--建構一個startling實體
private var _starling:Starling
//--建構startling主容器
private var _starlingPage:StartlingPage;

public function Startup()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

//--多點觸控
Starling.multitouchEnabled = true;

_starling = new Starling(StartlingPage, stage);
//--模擬多點觸控
_starling.simulateMultitouch = true;

//--啟用錯誤檢查
/*當 enableErrorChecking 為 true 時,clear() 和 drawTriangles() 方法是同步的,
並且可以擲回錯誤。
當 enableErrorChecking 為 false 時,預設值、clear() 和 drawTriangles() 方法是非同步的,
而且不會報告錯誤。
啟用錯誤檢查功能會降低顯示效能。請只在除錯時啟用錯誤檢查功能。*/


_starling.enableErrorChecking = false;

//--啟用反鋸齒功能後面的值可以是0到16間2的次方數(0, 1, 2, 4, 8, 16),預設為0(沒有反鋸齒效果)
_starling.antiAliasing = 2;

_starling.start();
//--偵聽stage3D準備就緒
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE,
onContext3DCompleteHandler);

/*
1.疊加原生顯示對象
有時候,您或許會希望在Starling的上面疊加原生的Flash內容。
nativeOverlay屬性就是做這個的。
它將返回一個Flash的Sprite,並且位置剛好在Starling內容的上面。
您可以在這裡添加傳統的Flash顯示對象。
但是要小心,在3D內容的上面疊加傳統的Flash內容,可能在一些移動平台上面帶來性能問題。
基於這個原因,請確保在您不需要的時候,刪除疊加容器內的搜有顯示對象。
Starling將會刪除疊加容器,如果它是空的。


2.多點觸碰
Starling支持多點觸發,如果設備可以支持的話。
在開發過程中,我們大多數人都用傳統的鼠標和鍵盤工作,Starling可以用“Shift”鍵
和“Ctrl”鍵(Mac:“CMD”)模擬多點觸摸事件。
用simulateMultitouch屬性激活此功能。


3.處理上下文丟失
在某些操作系統上,並在一定條件下(例如係統從睡眠返回激活狀態),Starling的stage3D渲染
上下文可能會丟失。
如果"handleLostContext"設置設置為"true",Starling就能從上次丟失的上下文恢復。
請注意: 這會帶來額外的內存消耗;Starling將會在內存中緩存紋理,這樣就可以快速從丟失的
上下文中恢復。
*/

}

private function onContext3DCompleteHandler(e:Event):void
{
trace(Starling.context.driverInfo.toLowerCase())
if (Starling.context.driverInfo.toLowerCase().indexOf("software") != -1)
{
Starling.current.nativeStage.frameRate = 30;
}

/*1、如果支持硬件加速,則輸出:
[Starling] Initialization complete.
[Starling] Display Driver:DirectX9Ex (Direct blitting)
2、如果不支持硬件加速,則輸出:
[Starling] Initialization complete.
[Starling] Display Driver:Software (Direct blitting)*/
}


//-------------------------------Starling的顯示列表-----------------------------------
/*
1.Srarling無法訪問Stage直到其被添加到顯示列表中。Starling同樣提供了這些事件,只是包名不同了而已(指向不同的類)
* Event.ADDED :當顯示對像被添加到一個容器中拋出;
* Event.ADDED_TO_STAGE :當顯示對像被添加到一個已存在於舞台上的容器中時,也就是其變得可見時拋出;
* Event.REMOVED :當顯示對像被從一個容器中移除時拋出;
* Event.REMOVED_FROM_STAGE :當顯示對像被從一個已存在於舞台上的容器中移除時,也就是其變得不可見時拋出;這樣,我們就可以自行控制在特定事件內初始化某些對象和移除某些對象來提高程序性能。


2.DisplayObject:
DisplayObject的方法:
* removeFromParent :從父對像中移除,如果它有父對象的話;
* getTransformationMatrixToSpace :創建一個用於表現本地坐標系和另一個坐標系轉換關係的矩陣;
* getBounds :得到一個以某個坐標係為參考系的能包含該顯示對象的最小矩形;
* hitTestPoint :返回當前坐標系中某個點位置下層次最高(擋在最前面)的顯示對象;
* globalToLocal :將一個點由舞台坐標轉換為當前坐標系坐標;
* localToGlobal :將一個點由當前坐標系坐標轉換為舞台坐標;
DisplayObject的屬性:
Starling保留了大多數Flash種DisplayObject的屬性,初次之外還添加了一些屬性,如pivotX 和pivotY屬性,允許開發者在運行時動態改變DisplayObject的註冊點。
* transformationMatrix :當前顯示對象位置相與其父容器的轉換矩陣;
* bounds :當前顯示對像在其父容器中的矩形(Rectangle)對象;
* width、height、root、x、y、scaleX、scaleY、alpha、 visible、parent、stage、root:不釋了,和原生DisplayObject一樣的功能;
* rotation:當前顯示對象繞其註冊點的旋轉弧度(非角度) ;
* pivotX、pivotY :當前顯示對象的註冊點,默認為(0,0) ;
* touchable :指定當前顯示對像是否能夠接受Touch事件(相當於原生DisplayObject的mouseEnable,因為在Starling中所有鼠標事件都被定義為Touch事件);
3.Sprite
Starling中Sprite同樣是能夠使用的最輕量級的容器,作為繼承了DisplayObject的子類,繼承了DisplayObject的所有公有屬性和方法,其次也同樣具有自己的方法:
* addChild :不解釋,和原生Flash中的一樣,下同
* addChildAt :略
* dispose :完全銷毀一個對象,釋放其在GPU中所佔內存,移除其全部事件偵聽。
* removeFromParent :略
* removeChild :略
* removeChildAt :略
* removeChildren :移除一個容器中所有的子對象
* getChildAt :略
* getChildByName : 根據名稱搜索一個子對象
* getChildIndex :略
* setChildIndex :略
* swapChildren :略
* swapChildrenAt :略
* contains :略
* */
}

Ctrl+移動滑鼠進行模擬手機2指縮放
Ctrl+移動滑鼠進行模擬手機2指縮放


}

沒有留言:

張貼留言

我的留言版