摘要:[AS3]從小遊戲學習之橫軸移動3(人物移動修改)
SV真的好久沒有發文了XDDD
大概是因為沒有什麼建樹可以分享給大家Orz
最近終於繼續研究類似瑪莉歐遊戲的操作,
發現原本的程式碼在使用者可怕的操作下會產生BUG!!!
這BUG其實也不是BUG,電腦不會有錯,錯的是寫程式的人~
原來如果使用者在按下按鈕後做動畫會跑TIMER,
若在TIMER沒結束以前再按下其他按鈕,他竟然還可以跑!
於是我們的小丑熊又位移可怕的古怪!!!
先給大家回顧一下錯誤版本:
https://googledrive.com/host/0B7hg_8WvMyfJWHE4eEkzemhqZGM/ClownBear.html
話說回來,為了抓這個BUG,我的筆電的方向鍵就快壞掉了Orz
雖然他用了四年差不多了......
接著就是正確版本,
事實上正確版的差別只是用個flag來判斷TIMER是否結束才做下個動作。
所以修改KEY_DOWN得部分:
stage.addEventListener(KeyboardEvent.KEY_DOWN, walk);
function walk(event:KeyboardEvent):void
{
if(event.keyCode==Keyboard.UP)
{
//上鍵=跳
if(inUp==false)
isJump=true;
}
if(event.keyCode==Keyboard.LEFT)
{
//左鍵
if(inLeft==false)
isLeft=true;
}
if(event.keyCode==Keyboard.RIGHT)
{
//右鍵
if(inRight==false)
isRight=true;
}
if(isStopT==false)
{
if(isJump==true&&isRight==true)
{
//往右跳
if(inUp==false)
{
inUp=true;
jumpRLTimer.start();
}
}
else if(isJump==true&&isLeft==true)
{
//往左跳
if(inUp==false)
{
inUp=true;
jumpLLTimer.start();
}
}
else if(isJump==false&&isRight==true)
{
//右走
if(inRight==false)
{
inRight=true;
RTimer.start();
}
}
else if(isJump==false&&isLeft==true)
{
//左走
if(inLeft==false)
{
inLeft=true;
LTimer.start();
}
}
else if(isJump==true&&isLeft==false&&isRight==false)
{
//面向右跳
if(inUp==false)
{
inUp=true;
jumpRTimer.start();
}
}
}
txLeft.text="isLeft:"+isLeft;
txRight.text="isRight:"+isRight;
txJump.text="isJump:"+isJump;
}
接著在每個動畫的timer都加上用來做flag的isStopT
以向右走為例:
var RTimer:Timer = new Timer(100);
RTimer.addEventListener(TimerEvent.TIMER, RHandler);
function RHandler(event:TimerEvent):void
{
isStopT=true;
bearL1.visible=false;
bearL2.visible=false;
rightcontent.text="Right:true";
if(speedr<1)
{
//trace
//換圖片
bearR2.visible=true;
bearR1.visible=false;
if(win1.x>497)
{
if(bearR2.x+5>=511)
{
bearR2.x=511;
bearR1.x=511;
bearL1.x=511;
bearL2.x=511;
}
else if(bearR1.x+5>=250)
{
bearL1.x=250;
bearL2.x=250;
bearR1.x=250;
bearR2.x=250;
}
else
{
stageMove=false;
bearR1.x+=5;
bearR2.x+=5;
bearL1.x+=5;
bearL2.x+=5;
}
}
speedr++;
}
else
{
//換圖片2
bearR1.visible=true;
bearR2.visible=false;
if(win1.x>497)
{
if(bearR2.x+5>=511)
{
bearR2.x=511;
bearR1.x=511;
bearL1.x=511;
bearL2.x=511;
}
else if(bearR1.x+5>=250)
{
bearL1.x=250;
bearL2.x=250;
bearR1.x=250;
bearR2.x=250;
}
else
{
stageMove=false;
bearR1.x+=5;
bearR2.x+=5;
bearL1.x+=5;
bearL2.x+=5;
}
}
rightcontent.text="Right:false";
speedr=0;
isStopT=false;
RTimer.stop();
}
//判斷場景移動
/*
if(stageMove==false)
{
for(var i=0;i<28;i++)
{
MovieClip(mcArray[i]).x -= 10;
if(win1.x<=497)
{
break;
}
}
}
*/
}
簡單來說就是在TIMER開始時將isStopT設為true,結束時才為false,強制使用者在timer結束以前按什麼鍵都沒用!
然後中間判斷移動的部分有做修改,
因為應該要"預測移動"。
當我動這一步不會超出範圍或者不影響場景的進行,才可以正常移動。
至於怎麼順利讓小丑熊在碰到東西時被擋住我還在卡關當中(我想了好久了Orz)
以上的操作結果大概是這樣:
https://googledrive.com/host/0B7hg_8WvMyfJUVRVSEhtX0NPTTg/ClownBear.html
真的太久沒碰腦袋都卡住了XDDD
我在畫面又多加了幾個trace用的文字,記得使用時要點一下畫面(不然抓不到鍵盤事件)~
再次呼籲(也忘了有沒有說過),
因為是自己研究,你可以把效果或規則改成你想要的。
像SV的就是無法回溯(不能走回頭路,場景過了就不能重來)。
那麼就是聽說可以直接跑FLASH的:
最後宣傳一下我剛完成的小遊戲囉(也是解謎遊戲)!
不過這次爆難的說(遊戲過程)XDD
http://gameschool.cc/offergame/10676/