[AS3]從小遊戲學習之橫軸移動3(人物移動修改)

摘要:[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/