還是那本遊戲編程中的,總結出來
1、外部變數
假如你有一個遊戲是根據一些選項來改變的。例如,在 jigsaw puzzle 遊戲運行時需要加
載不同的圖片,或者一個 arcade 遊戲以不同的速度運行。你可以從 flash 影片所在的 HTML
頁面中擷取一些參數。在這裡有多種方法能夠實現,如果你在發布設定中預設 HTML 為模板
的話,就可以通過 AC_FL_RunContent 函數中的 flashvars 屬性來傳遞參數。
下面是一個簡短的 AC_FL_RunContent 函數,在 flash cs3 匯出影片後,你可以在 html 檔案夾
中發現這些代碼。在這裡我增加了 flashvars 參數
<script language=”javascript”>
AC_FL_RunContent(
‘codebase’,
‘http://download.macromedia.com/p ... flash.cab#version=9,0,0,0’,
‘width’, ‘550’,
‘height’, ‘400’,
‘src’, ‘ExternalVariables’,
‘quality’, ‘high’,
‘flashvars’, ‘puzzleFile=myfilename.jpg&difficultyLevel=7’);
</script>
這個 flashvars 屬性包括一對值,它們之間用&符號隔開。在這裡,puzzleFile 設定為
myfilename.jpg, difficultyLevel 設定為 7.
當 flash 影片開始運行時,將通過 LoaderInfo 方法來調用這些資訊。下面這行代碼將檢索所
有的參數並把它們賦值給聲明的 paramObj 變數
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
若訪問單個屬性值,你需要用下面的代碼:
var diffLevel:String=paramObj["difficultyLevel"]
另外,你還可以傳遞遊戲的其它常量,例片的名字,開始等級,速度,位置等等。
讀讀源檔案:
//載入外部參數資訊
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
//讀取外部 diffLevel 值,並賦值給 messageStrng 變數
var diffLevel:String = paramObj["difficultyLevel"];
var messageString = "difficultyLevel: "+paramObj["difficultyLevel"];
messageString += "/n";
//然後在讀取 puzzleFile 的值,和 diffLevel 相加後賦值給文本
messageString += "puzzleFile: "+paramObj["puzzleFile"];
messageText.text = messageString;
當運行這個影片 ExternalVariables.fla,它就會載入 ExternalVariables.html 檔案。
3、載入資料
在 AS3.0 中,載入外部文字檔是相當容易的,尤其是 XML 格式的檔案。例如,你想
載入一個瑣碎的問題檔案,那麼,這個 XML 檔案內容可以這樣寫:
<LoadingData>
<question>
<text>This is a test</text>
<answers>
<answer type=”correct”>Correct answer</answer>
<answer type=”wrong”>Incorrect answer</answer>
</answers>
</question>
</LoadingData>
為了載入這些資料,你需要用到 URLRequest 和 URLLoader 兩個函數,另外,當資訊加
載完成後還需要添加一個偵聽函數還調用相關的資料。代碼如下:
var xmlURL:URLRequest = new URLRequest(“LoadingData.xml”);
var xmlLoader:URLLoader = new URLLoader(xmlURL);
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
xmlLoaded 函數裡面是一些 trace 語句,在輸出面板上顯示傳遞進來的資料
function xmlLoaded(event:Event) {
var dataXML = XML(event.target.data);
trace(dataXML.question.text);
trace(dataXML.question.answers.answer[0]);
trace(dataXML.question.answers.answer[0].@type);
}
4、儲存本機資料
我們將用到本地共用對象,它類似於瀏覽器的 Cookie。我們需要調用
SharedObject.getLocal()以在應用程式中建立共用對象,如帶記憶功能的計算機。
注意,該對象只能用於當前用戶端,以下代碼顯示如何將返回
的共用對象引用賦值給變數:
var myLocalData:SharedObject = SharedObject.getLocal(“mygamedata”);
如果你儲存了一些資料,你可以通過下面的代碼來訪問:
trace(“Found Data: “+myLocalData.data.gameinfo);
下面,來設定一下這個 gameinfo 的屬性值
myLocalData.data.gameinfo = “Store this.”;
5、自訂游標樣式
首先,現在舞台上拖放一個按鈕,放置在第一層,另外再繪製一個方向鍵圖形,轉換為
影片剪輯,放置在第二層,執行個體名稱為 arrow。
把滑鼠游標設定為不可見,用 Mouse.hide()命令
Mouse.hide()
然後,先確保把自訂影片放置在所有可顯示對象的上面,如果你用指令碼建立對象並添加到螢幕上的話,必須通過 setChildIndex 命令把自訂影片放置在所有顯示對象的頂部。
為了讓這個自訂影片跟隨滑鼠,還需要用到 ENTER_FRAME 接聽程式
addEventListener(Event.ENTER_FRAME, moveCursor);
function moveCursor(event:Event) {
arrow.x = mouseX;
arrow.y = mouseY;
}
另外,還需要把這個自訂游標的 mouseEnabled 屬性設定為 false,表示該對象不接收
滑鼠事件。預設值為 true,表示該對象接受滑鼠事件。
arrow.mouseEnabled = false;
6、載入影片
在第一幀把影片設定為 stop,
stop()
然後,再添加一個 ENTER_FRAME 偵聽,在每一幀調用 loadProgress 函數
addEventListener(Event.ENTER_FRAME, loadProgress);
這個函數用 this.root.loaderInfo 擷取影片載入的狀態,他有 bytesLoaded 和 bytesTotal 兩個屬
性,然後,我們再把這兩個屬性值除以 1024 轉換成KB。代碼如下:
function loadProgress(event:Event) {
// 擷取下載總位元組和已下載位元組
var movieBytesLoaded:int = this.root.loaderInfo.bytesLoaded;
var movieBytesTotal:int = this.root.loaderInfo.bytesTotal;
// 轉換成KB
var movieKLoaded:int = movieBytesLoaded/1024;
var movieKTotal:int = movieBytesTotal/1024;
為了讓玩家能夠看到下載進度,我們還需要在舞台上繪製一個文本域,顯示格式為:
Loading:5K/32K
//顯示下載進度
progressText.text = “Loading: “+movieKLoaded+”K/”+movieKTotal+”K”;
當已下載位元組與影片總位元組相等時,我們就移除這個幀頻偵聽,並把影片跳轉到第二幀
// 載入完成移除偵聽
if (movieBytesLoaded >= movieBytesTotal) {
removeEventListener(Event.ENTER_FRAME, loadProgress);
gotoAndStop(2);
} }
7、隨機數字
在 AS3.0 中,用 Math.random()函數建立隨機數,傳回值是一個大於等於 0 小於 1 的數。例
如:
var random1:Number=Math.random()
通常,我們用到明確的隨機數範圍,下面代碼隨機產生介於 0 和 10 之間的數
var random2:Number=Math.random()*10
如果想得到一個隨機整數,你可以用 Math.floor 方法來實現,floor 返回小於或等於指定
數字或運算式最接近的整數。下面代碼產生 0~9 的隨機整數
var random3:Number=Math.floor(Math.random()*10)
如果定義的範圍不包含 0,可以在返回的結果上加上指定數即可。下面代碼產生 1~10
的隨機整數
var random4:Number=Math.floor(Math.random()*10)+1
8、洗牌陣列
在遊戲中,隨機數最常用的地方就是在紙牌遊戲的洗牌中了。例如,你手中有 52 張紙牌,
現在想隨機地把它打亂,這需要怎樣處理呢?
首先,你要建立一個新數組,簡單地按順序進行排列。下面的代碼顯示從 0 到 51 有序數字
// 建立有序數組
var startDeck:Array = new Array();
for(var cardNum:int=0;cardNum<52;cardNum++) {
startDeck.push(cardNum);
}
trace(“Unshuffled:”,startDeck);
測試影片,輸出結果如下:
Unshuffled:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51
為了打亂這個數組元素的順序,我們先選擇這個數組隨機位置上的一個元素,並把它存
放在一個新的數組裡面,然後,在原數組中把該元素刪除,直至把原數組元素清空為止。
// shuffle into new array
var shuffledDeck:Array = new Array();
while (startDeck.length > 0) {
var r:int = Math.floor(Math.random()*startDeck.length);
shuffledDeck.push(startDeck
);
startDeck.splice(r,1);
}
trace(“Shuffled:”, shuffledDeck);
9、系統資料
你可以用 Capabilities 對象擷取 flash 影片所在電腦的多種資訊。在這裡列舉出幾種常用的屬
性:
Capabilities.playerType:指定播放器的類型。"StandAlone",用於獨立的 Flash Player;
"External",用於外部的 Flash Player 或處於測試模式下;"PlugIn",用於 Flash Player 瀏覽
器外掛程式;"ActiveX",用於 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控制項。
Capabilities.language:指定運行播放器的系統的語言代碼。在英文系統上,該值返回雙字母代
碼 (en)。
Capabilities.os:返回作業系統的類型和版本。例如:Windows XP
Capabilities.screenResolutionX, Capabilities.screenResolutionY:返回螢幕的解析度 1280*800
Capabilities.version:flash 播放器的版本,例如 WIN 9,0,45,0。從這裡你可以擷取作業系統的
類型和 flash 播放器的版本。