摘要:[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那個也很簡單,就像把圖片卡中間一樣卡在最後點就好,也就是(場景寬-小丑熊寬度)的位置。
原始檔下載: