Flash游戏开发实战(一)
我不得不承認(rèn),我不是植物大戰(zhàn)僵尸的骨灰玩家,所以,如果你發(fā)現(xiàn)這個(gè)系列的教程有什么地方錯(cuò)誤的,請(qǐng)告訴我。
定義游戲的主要結(jié)構(gòu)
植物大戰(zhàn)僵給了我們很好的視覺(jué)和感覺(jué)上的享受。你得保護(hù)你的房子以免被吃腦的僵尸入侵,這相當(dāng)?shù)奈恕?偟膩?lái)說(shuō),殺死僵尸是很有趣的。但是這視覺(jué)上的東西和游戲玩法無(wú)關(guān),我們可以用屠夫大戰(zhàn)管子工,鴿子大戰(zhàn)駱駝,圓形大戰(zhàn)方塊來(lái)代替。
在這個(gè)系列的教程中,我們用圓形來(lái)代替植物,用方塊來(lái)代替僵尸,偉大的圓形將會(huì)阻止邪惡的方塊進(jìn)入我們的基地。游戲區(qū)域可以被簡(jiǎn)化為一個(gè)區(qū)塊游戲。
設(shè)想一下這種局面:
然后盡量把它想象成這樣:
我們所擁有的是一個(gè)位于(2,2)的植物,它會(huì)盡力阻止走在第二行(從第0行開(kāi)始,下同)的僵尸,并且另一個(gè)僵尸正在沿著第三行接近我們的基地,還有一個(gè)正從第四列落下的陽(yáng)光。不可能有另外一個(gè)植物位于(2,2),并且不可能出現(xiàn)一個(gè)僵尸走在第二行與第三行之間。
創(chuàng)建游戲區(qū)域
正如你在上圖看到的那樣,這個(gè)游戲的區(qū)域是一個(gè)5行9列的矩陣。因此,第一件要做的事就是定義一個(gè)數(shù)組。我設(shè)想你的fla文件有一個(gè)文檔類(lèi)為Main。下面是Main.as的內(nèi)容:
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數(shù)組就是一個(gè)5*9的矩陣了。
畫(huà)出游戲區(qū)域
下面的代碼對(duì)于測(cè)試來(lái)說(shuō)足夠了,至少我們會(huì)畫(huà)出一個(gè)游戲區(qū)域來(lái)。
drawField函數(shù)所做的事情都能夠在setupField函數(shù)里實(shí)現(xiàn),但是我想讓他們分離,我得讓一個(gè)函數(shù)只處理一件事。唯一有趣的一行代碼是第25行的是在#007D00和#00AE00之間生成隨機(jī)顏色。
這就是我們的游戲區(qū)域了。如果你想要讓區(qū)塊體面點(diǎn)。請(qǐng)。。。自便。
捕獲陽(yáng)光
陽(yáng)光是植物大戰(zhàn)僵尸里的貨幣。他們從天上掉下來(lái),落到某一區(qū)塊上。撿起這些陽(yáng)光,你才能購(gòu)買(mǎi)植物。
我用到了timer事件使得每五秒落下一束陽(yáng)光,如果你對(duì)timer還不熟悉的話,請(qǐng)搜索。
現(xiàn)在,陽(yáng)光還不會(huì)從天上掉下來(lái),而是直接出現(xiàn)在某一隨機(jī)的區(qū)塊中。此時(shí)此刻,我還不知道是否兩束陽(yáng)光可以同時(shí)落到同一區(qū)塊中。在這個(gè)例子里,他們是可以的,但是如果原版的植物大戰(zhàn)僵尸里不允許這樣的話,請(qǐng)告訴我。
當(dāng)一束陽(yáng)光落到地上的時(shí)候,它能夠被玩家撿起。一個(gè)鼠標(biāo)事件偵聽(tīng)器處理這整個(gè)任務(wù)。下面是代碼:
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);}}}} }下面簡(jiǎn)要概述一下用到的函數(shù):
drawField:畫(huà)出游戲區(qū)域
fallingSuns:開(kāi)始制造陽(yáng)光,使他們墜落
newSun:創(chuàng)建新的陽(yáng)光
setupField:生成區(qū)塊數(shù)組
sunClicked:當(dāng)玩家點(diǎn)擊陽(yáng)光時(shí)調(diào)用
下面是效果:
用鼠標(biāo)撿起陽(yáng)光吧。
轉(zhuǎn)載于:https://www.cnblogs.com/delphi2014/p/4077087.html
總結(jié)
以上是生活随笔為你收集整理的Flash游戏开发实战(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux生成证书
- 下一篇: 配置web项目session永不超时