2004/3/15

捲軸遊戲的困難度


一篇關於捲軸遊戲(平台遊戲)中,困難度設計的文章。
連結

2004/3/11

關於MovieClipLoader

今天研究一下這個東東

原因是以往慣用的getBytesLoaded/getBytesTotal有點不夠用了

MovieClipLoader
是Flash Player7 以後才支援的指令
官方文件是說
使用這個方法 ( 而非 loadMovie() 或 MovieClip.loadMovie()) 具有以下優點:
• 剛開始載入時,MovieClipLoader.onLoadStart() 處理常式會被叫用。
• 若該片段無法載入,則 MovieClipLoader.onLoadError() 處理常式會被叫用。
• 在載入程序持續進行時,MovieClipLoader.onLoadProgress() 處理
常式會被叫用。
• 該片段之第一個影格中的動作已經執行完畢時,
MovieClipLoader.onLoadInit() 處理常式便會被叫用,
也就是說您可以開始操作載入片段了。


我想重點是較方便得到外部檔載入時,所需要的一些資訊


載一個檔試試

stop();
//空白mc
_root.createEmptyMovieClip("testMc", 1);
// 設 監聽器及 mc loader
var my_mcl = new MovieClipLoader();
myListener = new Object();
my_mcl.addListener(myListener);
//載入
my_mcl.loadClip("temp/test.swf", testMc);


比以前用loadMovie麻煩多了,要設listener又要設mc loader

所以再來研究到底能幹嘛



一些函式

stop();
//空白mc
_root.createEmptyMovieClip("testMc", 1);
// 設 監聽器
var my_mcl = new MovieClipLoader();
myListener = new Object();
myListener.onLoadStart = function(target_mc) {
trace("===================================");
trace(target_mc+"開始下載");
trace("來源URL:"+target_mc._url);
trace("===================================");
};
myListener.onLoadProgress = function(target_mc, loadedBytes, totalBytes) {
trace("**");
trace(target_mc+"下載中,目前進度:");
trace(loadedBytes+"/"+totalBytes+"(bytes)");
trace("**");
};
myListener.onLoadComplete = function(target_mc) {
trace("===================================");
trace(target_mc+"下載完成");
var loadProgress = _root.my_mcl.getProgress(target_mc);
trace("檔案大小為:"+loadProgress.bytesTotal+" bytes");
target_mc.play();
target_mc._lockroot = true;
trace("===================================");
};
my_mcl.addListener(myListener);
//載入
my_mcl.loadClip("temp/test.swf", "testMc");


這三個比較簡單

myListener.onLoadStart

會在開始載入時被呼叫

myListener.onLoadProgress

在載入過程中被呼叫,呼叫次數應該不是by frame的,可能是資料量載入一次就叫一次…(我猜的)

因為在我調整不同的fps後,被呼叫的次數都一樣,而且若是by frame似乎就沒必要用它了

myListener.onLoadComplete

載入完成時呼叫



這樣用起來,就覺得比以前一直enterframe來得方便多了



錯誤偵測

同樣上述的script,插入下列這個函式,再把下載位置隨便改一下,如xxx.swf 改成xxx.swg

故意讓他載不到東西

myListener.onLoadError = function(target_mc, errorCode) {
trace("####");
trace(target_mc+"載入有問題哦!");
trace("問題原因是:"+errorCode);
trace("####");
};


最後會應該會得到

####
_level0.testMc載入有問題哦!
問題原因是:URLNotFound
####


這就是用來偵測載入錯誤的狀況。

而errorCode會得到兩種結果:

1.URLNotFound

這種會發生在 MovieClipLoader.onLoadStart() 及 MovieClipLoader.onLoadComplete()都沒被呼叫的時候,
也就是這個url根本沒有東西可下



2.LoadNeverCompleted

這種會發生在MovieClipLoader.onLoadStart() 有被呼叫,但 MovieClipLoader.onLoadComplete()沒有被呼叫時,
我想就是網址是有東西的,但由於某種因素讓下載無法完成時吧



第一格as完成

以往當要載入swf時,且若被載入的swf?有as的話,常常會發生剛載完時,被載入的as無效的狀況

原因可能是檔案是載完了沒錯,但?面的as卻還沒執行到

現在有這個函式就一切ok了

myListener.onLoadInit = function(target_mc) {
trace("====");
trace(target_mc+"第一格action已執行完成");
trace("limitL:"+target_mc.limitL);
trace("====");
};

這函式是,當被載入的swf,且第一格as已執行完畢時才呼叫的



因為要有as才有用,所以我改成載入這個檔

my_mcl.loadClip
("guestbook.swf", "testMc2");

這個檔第一格有下

limitL=-20



再來在myListener.onLoadComplete = function(target_mc) {

?也加一行trace("limitL:"+target_mc.limitL);



比較結果就會發現

onLoadComplete會抓不到limitL,而onLoadInit抓得到



移除

my_mcl.unloadClip(target)//移除mc

my_mcl.removeListener()//移除監聽

就這樣吧,很簡單



無聊的小嘗試

是滿無聊的啦,不過也是mc loader 另一個好處

同一個mc loader ,可以同時下載多個mc

例如我一次下兩個

//載入
my_mcl.loadClip("temp/test.swf", testMc);
my_mcl.loadClip("guestbook.swf", testMc2);


之前的所有函式會各別被呼叫

各自會顯示各自的下載狀況,是滿方便的

onMouseWheel

不是什麼了不起的指令啦,只是心血來潮試了一下。

這項指令可用來取得滑鼠中間滾輪的訊號

//取得滾輪資料
mouseListener = new Object();
mouseListener.onMouseWheel = function(delta) {
_root.speedNow += Math.abs(delta);
};
Mouse.addListener(mouseListener);



裏面的得到的delta,便是滾輪訊號,他會是一個Number
如果由上往下滾,則是負數,下往上滾為正數
滾愈大圈,這個delta值愈大(負愈小)
另外發現,速度會受控制台->滑鼠中的捲動設定所影響。

*支援
Flash Player 7 (Windows only).

Pixel Cannon

即時多人flash-game

看看唄