按鍵和移動
在這一章中我們將用四個方向鍵控制英雄的移動。在移動過程中,他會面朝移動的方向,并且會顯示走動的動畫。一旦他停止移動,動畫也會停止。試試這個:
因為沒有碰撞檢測,所以英雄可以走出舞臺外面,不過不要擔心這個,我們以后會解決這個問題。
首先,讓我們完善英雄角色。建立3個新的mc。我們需要一個mc表示角色向左走(或者向右,我選擇了左),一個表示向上走,最后一個朝下走。在這些mc中,做角色走動的動畫。
這些mc里不需要寫代碼。
現(xiàn)在,編輯char影片夾子(mc),在時間線上創(chuàng)建5個關鍵幀:
在關鍵幀1放置char_up影片夾子,關鍵幀2放置char_left影片夾子,關鍵幀4放char_right,關鍵幀5放char_down。許多時候向左移動和向右移動只是簡單的水平翻轉關系,所以你可以用一個mc表示這兩個方向的動畫,F(xiàn)在確認一下,這幾幀動畫mc的實例名稱都是char,檢查每一幀。他們都叫char?是的,不用擔心。如果你不理解為什么是這樣的排列方式,我們將會在代碼的部分講解這個問題。
ok,該寫點代碼了。
代碼
首先,移動需要有個速度,所以先給英雄添加一個速度屬性: char={xtile:2, ytile:1, speed:4};
速度表示英雄每一步移動的象素值,更大的值意味著更快的移動,很小的值將會使英雄像個蝸牛。在這里使用整數是個好習慣,否則你會得到怪異的結果,實際上10象素和10.056873象素之間也看不出什么區(qū)別。
你還記得吧,我們創(chuàng)建了_root.char這個對象來保存英雄的信息(如果忘記了,請回頭看看)?并且我們把char影片夾子放在tiles影片夾子里面了。為了讓我們的英雄醒來并開始移動,我們需要添加兩個函數來檢查按鍵和控制mc。拖一個空的影片夾子empty到舞臺上。你可以把它放到可視區(qū)域外,他只是用來放些代碼,所以在哪里都無所謂。在這個mc上面寫這些代碼(選中mc,然后打開代碼面板): onClipEvent (enterFrame) { _root.detectKeys(); }
你可以看到我們在每一幀調用detectKeys這個函數,F(xiàn)在寫這個函數: function detectKeys() { var ob = _root.char; var keyPressed = false; if (Key.isDown(Key.RIGHT)) { keyPressed=_root.moveChar(ob, 1, 0); } else if (Key.isDown(Key.LEFT)) { keyPressed=_root.moveChar(ob, -1, 0); } else if (Key.isDown(Key.UP)) { keyPressed=_root.moveChar(ob, 0, -1); } else if (Key.isDown(Key.DOWN)) { keyPressed=_root.moveChar(ob, 0, 1); } if (!keyPressed) { ob.clip.char.gotoAndStop(1); } else { ob.clip.char.play(); } }
首先我們定義了兩個變量:ob 和 keyPressed。設置ob變量指向_root.char (記住,那是我們保存英雄所有信息的對象),設置變量keyPressed為false。keyPressed變量用來表示是否有四個方向鍵之一被按下去。
下面有4個相似的 if 判斷,每個 if 都檢測相應的鍵是不是被按下了。如果鍵被按下,他們就這樣調用另外的一個函數moveCha: keyPressed=_root.moveChar(ob,1,0);
這一行調用moveChar函數的時候帶了3個參數。第一個參數就是ob變量,就是我們的英雄對象。后兩個的取值我們總是讓他們?yōu)?1,1或者0。這些數字決定對象移動的方向,第二個參數表示水平移動的方向(-1:左;1:右),第三個參數代表垂直移動的方向(-1:上;1:下)。最后我們把moveChar的返回值交給變量keyPressed。 你在后面就可以看到moveChar函數總是返回true, 所以任何方向鍵被按下后,變量keyPressed值都是true。
現(xiàn)在來看看第二個函數moveChar: function moveChar(ob, dirx, diry) { ob.x += dirx*ob.speed; ob.y += diry*ob.speed; ob.clip.gotoAndStop(dirx+diry*2+3); ob.clip._x = ob.x; ob.clip._y = ob.y; return (true); }
看第一行,moveChar函數接收了3個參數,變量ob表示要移動的對象,dirx、diry分別表示x、y方向的移動。這是一個很通用的函數,我們可以用它移動游戲中所有東西。例如我們要讓子彈飛行,我們就可以調用moveChar函數,同樣,我們也可以用這個函數移動敵人。
接下來的兩行我們給對象的x和y加上相應的值。同樣,如果使用不同的對象(子彈、敵人),這些對象可以有不同的speed屬性。所以,當我們檢測到右箭頭鍵時,我們調用moveChar函數時的參數是1,0 ,此時dirx=1,diry=0。所以x值會在原來的基礎上增加(speed),而y則保持不變。如果我們調用moveChar函數的參數是0,-1(意味著上箭頭鍵),那么y值就會在原來的基礎上減。╯peed),而x保持不變。
注意,如果我們還有其他的動作,比如碰撞或者跳躍,我們應該將這些動作單獨計算。這樣比簡單的mc.hitTest方法要好不少。
這一句: ob.clip.gotoAndStop(dirx+diry*2+3);
他使得角色mc跳到正確的幀上,讓角色面對正確的方向。你可以算出所有的dirx/diry組合(這里只有4種情況),如果你的角色mc時間線是和我們以前所說的設置一樣的話,這里就不會出問題。你可以拿計算器算算看:)
沒有計算器?那我們還是看看吧:假設按了方向鍵右,那么 dirx=1,diry=0, 結果 dirx+diry*2=4。那么角色mc會跳到第4幀,那里正好是我們角色朝右走的動畫。
接下來的兩行,設置角色mc的_x/_y屬性的值等于x/y的值。最后,我們返回一個true值,這樣keyPressed就得到了正確的值。下一章我們將會介紹碰撞檢測,很有趣的哦:)
下載源文件
出處:藍色理想
責任編輯:qhwa
上一頁 英雄/主角 下一頁 碰撞檢測
◎進入論壇Flash專欄版塊參加討論
|