
我不得不承認,我不是植物大戰僵屍的骨灰玩家,所以,如果你發現這個系列的教程有什么地方錯誤的,請告訴我。
定義游戲的主要結構
植物大戰僵給了我們很好的視覺和感覺上的享受。你得保護你的房子以免被吃腦的僵屍入侵,這相當的吸引人。總的來說,殺死僵屍是很有趣的。但是這視覺上的東西和游戲玩法無關,我們可以用屠夫大戰管子工,鴿子大戰駱駝,圓形大戰方塊來代替。
在這個系列的教程中,我們用圓形來代替植物,用方塊來代替僵屍,偉大的圓形將會阻止邪惡的方塊進入我們的基地。游戲區域可以被簡化為一個區塊游戲。
設想一下這種局面:
然后盡量把它想象成這樣:
我們所擁有的是一個位於(2,2)的植物,它會盡力阻止走在第二行(從第0行開始,下同)的僵屍,並且另一個僵屍正在沿着第三行接近我們的基地,還有一個正從第四列落下的陽光。不可能有另外一個植物位於(2,2),並且不可能出現一個僵屍走在第二行與第三行之間。
創建游戲區域
正如你在上圖看到的那樣,這個游戲的區域是一個5行9列的矩陣。因此,第一件要做的事就是定義一個數組。我設想你的fla文件有一個文檔類為Main。下面是Main.as的內容:
package { import flash.display.Sprite; public class Main extends Sprite { private var gameField:Array; public function Main():void { setupField(); } private function setupField():void { gameField=new Array(); for (var i:uint=0; i<5; i++) { gameField[i]=new Array(); for (var j:uint=0; j<9; j++) { gameField[i][j]=0; } } } } }
這樣,gameField數組就是一個5*9的矩陣了。
畫出游戲區域
下面的代碼對於測試來說足夠了,至少我們會畫出一個游戲區域來。
drawField函數所做的事情都能夠在setupField函數里實現,但是我想讓他們分離,我得讓一個函數只處理一件事。唯一有趣的一行代碼是第25行的是在#007D00和#00AE00之間生成隨機顏色。
這就是我們的游戲區域了。如果你想要讓區塊體面點。請。。。自便。
捕獲陽光
陽光是植物大戰僵屍里的貨幣。他們從天上掉下來,落到某一區塊上。撿起這些陽光,你才能購買植物。
我用到了timer事件使得每五秒落下一束陽光,如果你對timer還不熟悉的話,請搜索。
現在,陽光還不會從天上掉下來,而是直接出現在某一隨機的區塊中。此時此刻,我還不知道是否兩束陽光可以同時落到同一區塊中。在這個例子里,他們是可以的,但是如果原版的植物大戰僵屍里不允許這樣的話,請告訴我。
當一束陽光落到地上的時候,它能夠被玩家撿起。一個鼠標事件偵聽器處理這整個任務。下面是代碼:
package { import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.MouseEvent; public class Main extends Sprite { private var gameField:Array; private var flowersTimer:Timer=new Timer(5000); private var sun:sunMc; private var sunContainer:Sprite=new Sprite(); public function Main():void { setupField(); drawField(); fallingSuns(); } private function fallingSuns():void { addChild(sunContainer); flowersTimer.start(); flowersTimer.addEventListener(TimerEvent.TIMER, newSun); } private function newSun(e:TimerEvent):void { var sunRow:uint=Math.floor(Math.random()*5); var sunCol:uint=Math.floor(Math.random()*9); sun = new sunMc(); sunContainer.addChild(sun); sun.x=52+sunRow*65; sun.y=130+sunRow*75; sun.addEventListener(MouseEvent.CLICK,sunClicked); } private function sunClicked(e:MouseEvent):void { e.currentTarget.removeEventListener(MouseEvent.CLICK,sunClicked); var sunToRemove:sunMc=e.currentTarget as sunMc; sunContainer.removeChild(sunToRemove); } private function setupField():void { gameField=new Array(); for (var i:uint=0; i<5; i++) { gameField[i]=new Array(); for (var j:uint=0; j<9; j++) { gameField[i][j]=0; } } } private function drawField():void { var fieldSprite:Sprite=new Sprite(); var randomGreen:Number; addChild(fieldSprite); fieldSprite.graphics.lineStyle(1,0xFFFFFF); for (var i:uint=0; i<5; i++) { for (var j:uint=0; j<9; j++) { randomGreen=(125+Math.floor(Math.random()*50))*256; fieldSprite.graphics.beginFill(randomGreen); fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75); } } } } }
下面簡要概述一下用到的函數:
drawField:畫出游戲區域
fallingSuns:開始制造陽光,使他們墜落
newSun:創建新的陽光
setupField:生成區塊數組
sunClicked:當玩家點擊陽光時調用
下面是效果:

用鼠標撿起陽光吧。
