Skip to main content

Posts

Showing posts from 2006

Adobe User Group 12月份網聚

地圖元件左右循環移動

由於龍龍仔在上上篇題問了一個關於地圖左右移動的寫法,
又剛好Erin荒廢兩個多月沒有更新,
所以就把這個簡單的移動原理在這邊公開:

說明:
1. 製作一段由A到B , B到C, C到A的連續動畫 MovieClip
2. 在這段連續動畫,僅在各自的key frame上加入action
stop();
_num=n;// 這個變數只是在告訴外面,動畫停在哪個東西上...=P
3. 當使用者按下左右鍵的時候,便執行onEnterFrame來告訴連續動畫往前跑或往後跑...=P (其實這跟倒帶的原理是一樣的)

move_mc.onEnterFrame = function() {
if (this._num != num) { //當指定的位置跟停止的keyFrame不同
if (isR) { // 如果是按右鍵
if (this._currentframe == this._totalframes) {
this.gotoAndStop(1);
} else {
this.nextFrame();
}
} else { //如果是按左鍵,,,=P
if (this._currentframe == 1) {
this.gotoAndStop(this._totalframes);
} else {
this.prevFrame();
}
}
} else {
trace("number is "+this._num);
delete this.onEnterFrame;
}
}

有興趣可以下載原始檔

FL2.0 Key Listener Control

當FL2.0不接受按鈕用on (keyPress "PageDown") and on (keyPress "PageUp")來控制RSK (右soft key) and LSK (左soft key)時,大家非不得已要開始使用Key listener來做按鈕控制。Key Listener其實很好用,但是前提是你不可以將它搞亂,不然會出現有趣的bug喔!

以下是一個簡單範例包含list menu外加 RSK 點選後會pop-up 一個詢問離開的視窗:



重點整理:

1. RSK and LSK key listener最好與其它操作的listener分開。
- 因為這個範例只有一層所以會看不出哪邊方便,但是如果你的程式是需要包含很多key event操作,每個listener都要寫入RSK的動作就太沒效率了。

2. removeListener的動作最好寫在listener object身上。
- 好處就是...你不用煩惱哪邊忘了remove掉而出現白癡的bug....

var _listener=new Object();
_listener.onKeyDown = function() {
var code = Key.getCode();
if (code ==13) {
Key.removeListener(this);
}
}

3.當詢問離開視窗pop-up後,整個程式的key event的控制會進入所謂的pause階段,所有跟現階段操作有關的key listeners都應該先被移除掉。
- Key._listeners, 會回傳所有被註冊在Key裡的listeners, 回傳型態Array
- 利用一個新的Array 拷貝 Key._listeners

_cacheListeners = new Array();
_cacheListeners = _cacheListeners.concat(Key._listeners);
for (var i in _cacheListeners) {
Key.removeListener(_cacheListeners[i]);
}

- 當然要記得在離開pop-up 視窗後將所有該用的listeners註冊回去
for (var i in _cacheListeners) {
Key.addListener(_cache…

Nice to meet you.... lite version

Flash lite 2.0 176 x 208 S60

這個作品大概是Erin在2000年所做,當初以Flash5版本寫出
並於Erin惡搞的個人網站GreenTown發表,
前陣子小無聊就花了"一點"心力將它改成FL2.0版本,
第一版先處理成效能型,所以沒有華麗動畫,
只有完美結局由朋友Erica跨刀畫了一張圖來當隱藏結局,
沒有玩過或者是想重溫Erin這個亂搞的泡美眉作品的

請按此下載中文版version 1.02
EDIT: 修改了一些小bug
BTW...難度當然比以前還高...因為幾乎需要驅動所有事件才泡的到...XD

English version will be released soon....
EDIT.05202007:英文版放棄了...= = 口語要翻譯簡直會要了我的命,怎樣翻都不好笑乾脆放棄囉

Smooth movement --- JUMP ACTION

這個教學是上一篇 Smooth movement in FL1.1的加強版,並加入了跳躍動作。在FL1.1中是沒有所謂的hitTest(),所以這邊利用了一個方法來達到簡易的碰撞測試,讓火柴人可以跳到移動平台上:

取得跳躍平台的方塊四頂點的座標,與跳躍 MC作座標檢測


call hitTest: (mc = main control movieclip's name)
W =hitTestTarget._width/2;
xMin = hitTestTarget._x-W;
xMax = hitTestTarget._x+W;
H =hitTestTarget._height/2;
yMin =hitTestTarget._y-H;
yMax = hitTestTarget._y+H;
if (mc._x>xMin && mc._x < xMax) {
if (mc._y>yMin && mc._y < yMax) {
hitTarget =hitTestTarget;
trace(hitTarget add " be hit");
mc._y = yMin;
}
}

Key controler :
on (keyPress "") {
hitTarget = "";
if (!jump_co.jump) {
trace("跳躍開始");
jump_co.ymov = -21;
jump_co.jump = true;
jump_co.status = "jump";
tellTarget ("mc") {
gotoAndStop("jump");
}
}
}

Jump controler 跳躍控制器(jump_co):
if (jump) {
ymov += 3;
if (status eq "stand") {
//在hitTest中,如果確定碰撞到平台,status會設定為stand
jump = false;
tellTarget (__target) {
gotoAndStop("stand");
}
} else {
//drop
eval(__target)._y += ymov;
if (…

Smooth movement in FL1.1

曾經玩過某家公司針對FL1.1所推出的動作冒險遊戲,但是對那個死板的左右鍵移動與Jump動作頗有微詞。
手機的反應不如電腦那樣即時,所以在動作順暢度調整上,需要作一點點的手腳。
也許接下來所提供的方法並不是最好的,但是希望可以給有心學習FL1.1的網友們一點啟發 =)

hint: 使用時間來控制移動判定
原理:當使用者點選nevi-key(四方鍵)時,只宣告狀態與點選時間(getTimer()),利用一個不停迴圈的MovieClip來控制整個移動系統

key cacher action:
on (keyPress "") {
keyPressTime = getTimer();
move_co.left = true;
}

movement controler( a movieClip has two frames) action:
if (left) {
right = false;
tellTarget (__target) {
_x -= 3;
gotoAndStop("left");
}
num = getTimer()-/:keyPressTime;
if (num>300) {
left = false;
tellTarget (__target) {
gotoAndStop("stand");
}
}
}

[下載原始檔]

本教學僅針對FL1.1語法版本,FL2.0不需要使用這種方法撰寫...=)

快快樂樂使用Shared Object

序上篇,
之前一直沒有很認真的看完Flash lite2.0中SharedObject的正確用法,又看到官方release出來的 Macromedia Flash Lite 2 Content Development Kit (CDK) 中MobileSharedObject class寫的落落長,腦袋瓜裡就想像可能使用起來很麻煩...

其實它的用法還是一樣簡單,只需要加入Listener來觸發載入事件:
SharedObject.addListener("erin", loadCompleteSO);
var mySO = SharedObject.getLocal("erin");
function loadCompleteSO(so:SharedObject) {
if (so.getSize() == 0) {
//初始化SO資料
so.data.count = 2;
txt.text = "Shared Object 初始化!";
} else if (so.data.count != undefined) {
txt.text = "這是你第"+so.data.count+"次播放本檔案喔!";
so.data.count += 1;
}
so.flush();
//更新參觀次數
}

測試環境:Nokia 7610

免費下載的Flash Lite1.1 player

Mobizines

剛剛在 Marco Casario 的blog看到了一個好消息,如果你沒有Flash Lite1.1 player的話,可以利用下載 Refresh Mobile線上雜誌平台軟體 Mobizines 來取得免費的Flash Lite1.1player。安裝時需要透過網路取得player的授權碼,被授權的player會由 Refresh Mobile 付費,所以是合法的喲!

但是....由於Erin並未開通GPRS or 3G所以沒辦法肯定是不是真的可以安裝...請安裝成功的朋友回一下訊息吧! XD

Edit 0330/2006 : 非透過其網站中所列出之電信下載,應該是無法正確安裝的

SharedObject的最大使用容量

Flash Lite2.0可以使用SharedObject,對手機遊戲或互動程式開發者是一個好消息,但是樂歸樂,它還是有一些限制條件:
單一swf只有4kb可以使用總容量的最大值是由裝置決定。在S60的裝置上有256kb可以使用,在超過裝置容許最大值時會出現系統訊息(並非單一使用的4kb喔!),如果使用者選擇同意,系統將會清除"其他"舊的SharedObject data空出位子給正在播放的swf使用。資料出處
由於手機的效能有限,SharedObject的使用需要特別注意讀取時差問題,Erin尚未特別研究,有興趣的可以參考 TicoreFlashLite 2.0 SharedObject 測試,或者是由官方release出來的 Macromedia Flash Lite 2 Content Development Kit (CDK) ,裡面有一個完整的MobileSharedObject class可以使用..)

BlackJack...FlashLite1.1

176x208 Flash lite1.1
此作品完成的時間比「幸運猜拳」還早,
是用來熟悉Flash lite1.1語法的試作品,
有興趣的可以按此下載 =P

幸運猜拳

> Flash lite1.1版本 176x208

要不是看到訊息,Erin還真的快忘了自己有這個作品...XD

操作方法:僅使用左右鍵與Entry鍵
有興趣的可以按此下載

loadVariables() 實現onLoad事件簡易模組--小改版

在 Flash lite1.1中,
載入變數沒有任何onLoad事件可以做載入判定,
Vaio的blog中也發現而單一影格僅能呼叫一組載入動作,
在這麼艱困的環境中如何讓載入變數的動作變的簡單?
Erin就利用了一組MovieClip來實現loadVariables() 擁有onLoad事件。

思考方向:
1. 如何讓Loader MovieClip知道變數已經載入?
-- 用很笨的方法讓外部文字檔中統一有loaded=1(意謂true)的變數值。

2.如何讓所有 Loader MovieClips共用同一個call function?
-- 載入完成即傳出一個名稱變數給_root 。

範例檔
ps.可與前一篇MovieClipLoader整合應用..=)

[更新版]loadMovie實現onLoad之方法

之前Erin曾於上一個blog中發表了一篇在1.1實現loadMovie onLoad Event做法,隨著更深入的開發,Erin發現了一些程式的問題點

1. 即使無movie載入至level or movieClip也可能會出現錯誤的_totalframes判斷( 沒有載入的_level中居然會出現_totalframe=5,這個問題有機會再深思)

2. 無法載入時手機會出現error massage window ( 所以沒必要判斷無法載入..=P)

結論最簡單的方法就是:
一樣是利用_totalframes來判斷載入與否,然後使用某秒數值來判定載入失敗回傳,意思就是不管它到底有沒有載入,某個秒數後一律回傳載入失敗,為什麼需要這樣處理?因為即使真的發生載入失敗,手機自動會出現error message來告訴使用者找不到檔案,這樣實在不需要不斷的判定它的_totalframes是不是 >0 (懶人思考模式啟動)
範例檔

好用的KeyListener組合

手機操作最常使用的便是左右軟鍵、方向鍵,以下是很簡單的key control寫法

fscommand2("SetSoftKeys", "Left", "Right");
var keyListener:Object=new Object();
keyListener.onKeyDown=function(){
var code=Key.getCode();
if(code==ExtendedKey.SOFT1){
//left soft key
}else if(code==ExtendedKey.SOFT2){
//right soft key
}else if(code==37){
//left
}else if(code==39){
//right
}else if(code==38){
//up
}else if(code==40){
//down
}else if(code==13){
//enter
}
}
Key.addListener(keyListener);

注意事項:在重整keyListener後,請記得在指定addListener前先remove前一個加入的keyListener..o =)

FivePerKeyPerFrame

最近Adobe做了一件好事....Flash lite2.0 player "短期"免費大放送!既然好運的買到了免費的lite2 player ,不先給它研究一番就對不起自己。
Flash lite1.1 在處理load事件時,僅容許one request per frame.,而在Flash lite2.0中,你也許期待可以像Flash 7處理外部載入那樣容易,但是請記得,你開發的裝置是個小手機啊!
雖然這是個known issue,但是不特別說明一下也許會有一堆人沒注意到...

1. 一次(a frame or a key press)僅能處理五次load request.,多出來會被忽略
2. 需要使用Generic Phone來測試,喜歡使用Nokie系列的開發者請注意一下面的topic

資料來源:http://www.macromedia.com/cfusion/webforums/forum/messageview.cfm?catid=588&threadid=1099021&enterthread=y
ps. 免費放送已經停止嚕!