[AS3]從小遊戲學習之橫軸移動2(人物左右圖片切換與場景移動)

摘要:[AS3]從小遊戲學習之橫軸移動2(人物左右圖片切換與場景移動)

在實作左右圖片切換後,才發現我老馬了Orz

多了一些沒必要的程式碼~
所以如果看過上一篇的就忘了吧,

我重po~

基本上就是左跳的部分做了修改,而所謂的圖片切換,其實是總共有4張圖(依據你圖片的動畫)



圖片來源:http://home.gamer.com.tw/creationDetail.php?sn=2088371
是巴哈姆特的網友為我做的3D圖片XDD於是我決定做小遊戲回報他^^(因此小丑熊遊戲就這樣著手了)

我的方法是:
所有圖片一開始都在場景上,利用圖片的visible來切換,做為圖片改變的錯覺。
雖然這樣的方法會造成負荷(因為一開始就有四張圖),但是我覺得這樣我比較好思考,就用這種方法了......(而且我的遊戲比較簡單這樣)。
移動部分,我將所有移動用成動畫(timer)
像這樣:


然後分別的name=bearR1, bearR2, bearL1, bearL2;
一開始讓面向右的小丑熊顯示出來,(看你橫軸的方向,我是往右移動的關係)
 

bearL1.visible=false;
bearL2.visible=false;
bearR2.visible=false;

所以移動的部分,就是用visible=true或false來切換。舉例當小丑熊往右走時:
 

//右移
var speedr:int=0;
var RTimer:Timer = new Timer(100);
RTimer.addEventListener(TimerEvent.TIMER, RHandler);
function RHandler(event:TimerEvent):void
{
	bearL1.visible=false;
	bearL2.visible=false;
	if(speedr<1)
	{
		bearR2.visible=true;
		bearR1.visible=false;
		bearR1.x+=5;
		bearR2.x+=5;
		bearL1.x+=5;
		bearL2.x+=5;
		speedr++;
	}
	else
	{
		bearR1.visible=true;
		bearR2.visible=false;
		bearR1.x+=5;
		bearR2.x+=5;
		bearL1.x+=5;
		bearL2.x+=5;
		speedr=0;
		RTimer.stop();
	}
}

為了怕位置跑掉,所有圖片的位移都一樣,但是bearR1和bearR2的可見度做改變,就有左右擺動的感覺。

至於場景的移動,

在參考這一篇介紹後:
http://bbs.9ria.com/thread-87773-1-1.html

總之,就是大概在一半的時候場景跟著一樣的位移量,
但是我不喜歡那種感覺,我比較模擬瑪莉歐,所以我在一開始人動的時候,場景就跟著跑了。
可是一定會遇到人跑"太快"而場景還沒結束的時候!
所以人物到了差不多中間位置時,就讓其x位置固定在中間。
因此就是這樣:

        var mcArray:Array = new Array(m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25,m26,m27,win1);

        //判斷場景移動
	for(var i=0;i<28;i++)
	{
		MovieClip(mcArray[i]).x -= 10;
		
		if(win1.x<=497)
		{
			break;
		}
		else
		{
			if(bearR1.x>=250)
			{
				bearL1.x=250;
				bearL2.x=250;
				bearR1.x=250;
				bearR2.x=250;
			}
		}
	}

其中,m1~m27是中間的"障礙物",也就是山;而win1就是最終目標(旗幟)。

這樣下來,程式碼就是這樣:

import flash.ui.Keyboard;

stage.addEventListener(KeyboardEvent.KEY_DOWN, walk);
stage.addEventListener(KeyboardEvent.KEY_UP, walkOnce);

bearL1.visible=false;
bearL2.visible=false;
bearR2.visible=false;

//方向鍵
var isJump:Boolean=false;
var isLeft:Boolean=false;
var isRight:Boolean=false;
//是否連按
var inUp:Boolean=false;
var inLeft:Boolean=false;
var inRight:Boolean=false;
var mcArray:Array = new Array(m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25,m26,m27,win1);

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(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;
}
function walkOnce(event:KeyboardEvent):void
{
	if(event.keyCode==Keyboard.UP)
	{
		//上鍵=跳
		isJump=false;
		inUp=false;
	}
	if(event.keyCode==Keyboard.LEFT)
	{
		//左鍵
		isLeft=false;
		inLeft=false;
	}
	if(event.keyCode==Keyboard.RIGHT)
	{
		//右鍵
		isRight=false;
		inRight=false;
	}
	txLeft.text="isLeft:"+isLeft;
	txRight.text="isRight:"+isRight;
	txJump.text="isJump:"+isJump;
}
//移動動畫
//右移
var speedr:int=0;
var RTimer:Timer = new Timer(100);
RTimer.addEventListener(TimerEvent.TIMER, RHandler);
function RHandler(event:TimerEvent):void
{
	bearL1.visible=false;
	bearL2.visible=false;
	if(speedr<1)
	{
		bearR2.visible=true;
		bearR1.visible=false;
		bearR1.x+=5;
		bearR2.x+=5;
		bearL1.x+=5;
		bearL2.x+=5;
		speedr++;
	}
	else
	{
		bearR1.visible=true;
		bearR2.visible=false;
		bearR1.x+=5;
		bearR2.x+=5;
		bearL1.x+=5;
		bearL2.x+=5;
		speedr=0;
		RTimer.stop();
	}
	//判斷場景移動
	for(var i=0;i<28;i++)
	{
		MovieClip(mcArray[i]).x -= 10;
		
		if(win1.x<=497)
		{
			break;
		}
		else
		{
			if(bearR1.x>=250)
			{
				bearL1.x=250;
				bearL2.x=250;
				bearR1.x=250;
				bearR2.x=250;
			}
		}
	}
}
//左移
var speedl:int=0;
var LTimer:Timer = new Timer(100);
LTimer.addEventListener(TimerEvent.TIMER, LHandler);
function LHandler(event:TimerEvent):void
{
	bearR1.visible=false;
	bearR2.visible=false;
	if(speedl<1)
	{
		bearL2.visible=true;
		bearL1.visible=false;
		bearL1.x-=5;
		bearL2.x-=5;
		bearR1.x-=5;
		bearR2.x-=5;
		if(bearL2.x<=0)
		{
			bearL2.x=0;
			bearL1.x=0;
			bearR1.x=0;
			bearR2.x=0;
		}
		speedl++;
	}
	else
	{
		bearL1.visible=true;
		bearL2.visible=false;
		bearL1.x-=5;
		bearL2.x-=5;
		bearR1.x-=5;
		bearR2.x-=5;
		if(bearL1.x<=0)
		{
			bearL1.x=0;
			bearL2.x=0;
			bearR1.x=0;
			bearR2.x=0;
		}
		speedl=0;
		LTimer.stop();
	}
}
//跳
var speed:int=0;
var jumpRTimer:Timer = new Timer(25);
jumpRTimer.addEventListener(TimerEvent.TIMER, jumpRHandler);
function jumpRHandler(event:TimerEvent):void
{
	if(speed<16)
	{
		speed++;
		bearR1.y-=5;
		bearR2.y-=5;
		bearL1.y-=5;
		bearL2.y-=5;
	}
	else if(speed>=16&&speed<32)
	{
		speed++;
		bearR1.y+=5;
		bearR2.y+=5;
		bearL1.y+=5;
		bearL2.y+=5;
	}
	if(speed==32)
	{
		speed=0;
		jumpRTimer.stop();
	}
}
//右長跳
var speed2:int=0;
var jumpRLTimer:Timer = new Timer(25);
jumpRLTimer.addEventListener(TimerEvent.TIMER, jumpRLHandler);
function jumpRLHandler(event:TimerEvent):void
{
	bearR1.visible=true;
	bearR2.visible=false;
	bearL1.visible=false;
	bearL2.visible=false;
	if(speed2<16)
	{
		speed2++;
		bearR1.y-=5;
		bearR2.y-=5;
		bearL1.y-=5;
		bearL2.y-=5;
		if(isRight==true)
		{
			bearR1.x+=3.75;
			bearR2.x+=3.75;
			bearL1.x+=3.75;
			bearL2.x+=3.75;
		}
		//判斷場景移動

		for(var i=0;i<28;i++)
		{
			MovieClip(mcArray[i]).x -= 3.75;
			if(win1.x<=497)
			{
				break;
			}
			else
			{
				if(bearR1.x>=250)
				{
					bearL1.x=250;
					bearL2.x=250;
					bearR1.x=250;
					bearR2.x=250;
				}
			}
		}
	}
	else if(speed2>=16&&speed2<32)
	{
		speed2++;
		bearR1.y+=5;
		bearR2.y+=5;
		bearL1.y+=5;
		bearL2.y+=5;
		if(isRight==true)
		{
			bearR1.x+=3.75;
			bearR2.x+=3.75;
			bearL1.x+=3.75;
			bearL2.x+=3.75;
		}
		//判斷場景移動
		for(var i2=0;i2<28;i2++)
		{
			MovieClip(mcArray[i2]).x -= 3.75;
			if(win1.x<=497)
			{
				break;
			}
			else
			{
				if(bearR1.x>=250)
				{
					bearL1.x=250;
					bearL2.x=250;
					bearR1.x=250;
					bearR2.x=250;
				}
			}
		}
	}
	
	if(speed2==32)
	{
		speed2=0;
		jumpRLTimer.stop();
	}
}
//左長跳
var speed3:int=0;
var jumpLLTimer:Timer = new Timer(25);
jumpLLTimer.addEventListener(TimerEvent.TIMER, jumpLLHandler);
function jumpLLHandler(event:TimerEvent):void
{
	bearL1.visible=true;
	bearL2.visible=false;
	bearR1.visible=false;
	bearR2.visible=false;
	if(speed3<16)
	{
		speed3++;
		bearR1.y-=5;
		bearR2.y-=5;
		bearL1.y-=5;
		bearL2.y-=5;
		if(isLeft==true)
		{
			bearR1.x-=3.75;
			bearR2.x-=3.75;
			bearL1.x-=3.75;
			bearL2.x-=3.75;
		}
		if(bearL1.x<=0)
		{
			bearL1.x=0;
			bearL2.x=0;
			bearR1.x=0;
			bearR2.x=0;
		}
	}
	else if(speed3>=16&&speed3<32)
	{
		speed3++;
		bearR1.y+=5;
		bearR2.y+=5;
		bearL1.y+=5;
		bearL2.y+=5;
		if(isLeft==true)
		{
			bearR1.x-=3.75;
			bearR2.x-=3.75;
			bearL1.x-=3.75;
			bearL2.x-=3.75;
		}
		if(bearL1.x<=0)
		{
			bearL1.x=0;
			bearL2.x=0;
			bearR1.x=0;
			bearR2.x=0;
		}
	}
	if(speed3==32)
	{
		speed3=0;
		jumpLLTimer.stop();
	}
}
stop();


測試網址:https://googledrive.com/host/0B7hg_8WvMyfJWHE4eEkzemhqZGM/ClownBear.html



p.s.因為還沒有做焦點focus的改變,使用內嵌Flash時要點一下畫面才能開始抓取鍵盤事件喔!
至於為什麼到了旗幟能跑出場景,是因為我還沒做完場景碰壁的判斷XDD那個也很簡單,就像把圖片卡中間一樣卡在最後點就好,也就是(場景寬-小丑熊寬度)的位置。

原始檔下載:

ClownBearLesson.zip