as3.0遊戲開發之打氣球系列(一)

好久沒有寫正經的文章了,這次打算寫個打氣球的文章,分爲幾部分寫,其實是想寫細點,其中很多方法,會擴展開講.具體的提綱爲以下:
     1,瞄準鏡的產生   (類似attachMovie在AS3中該如何表現?)
     2,飛翔的氣球    (怎麼飛?隨機飛,隨機速度又怎麼表現?該如何記時?)
     3,打氣球   (怎麼算打中?打中後,氣球爆炸怎麼表現?聲音呢?)
     4,給我個計數器  (計算打中的,飛走的,甚至擊中概率)
     5,成與敗   (怎麼算勝利?怎麼算失敗?如何表現)
     6,完善     (結尾)
 
 
1,瞄準鏡的產生   (類似attachMovie在AS3中該如何表現?)
     剛開始看AS3.0,估計從AS2過來的人都會有這樣的慌張,attachMovie這麼命令沒了,那我怎麼能把庫裏的實例弄出來呢?層次又該怎麼辦?別慌張,我們從打氣球的遊戲製作慢慢講.
    首先在舞臺上畫一個圓圈加十字線,就當是瞄準鏡.但是這裏有兩種畫法,第一種是十字線相交,第二種是十字線不相交,如下圖.
 
[img]/uploads/allimg/080508/1009550.jpg[/img]

   爲什麼我要說有兩種呢?因爲這兩種用發不同,後面我會講到.不過這裏我用的是不相交的那種瞄準鏡.我們把這個瞄準鏡做成實例命名aim ,扔到庫裏,並把舞臺上的刪除.接着按F11,彈出庫面版,右鍵點aim,然後點Linkage,然後如下圖選擇填寫:
 
[img]/uploads/allimg/080508/1009551.jpg[/img]
   接着回到舞臺,按F9,在動作面板裏寫下如下代碼:
var aims:MovieClip;
aims= new aim();
addChild(aims);
   以上代碼就是像類似AS2裏的attachMovie就可以把庫裏的實例用Linkage給調用到舞臺上.如果你要調用其他的實例,都可以這麼做,不過就是命名不同而已.如果在封裝類裏寫,形式也是同樣的.
   AS3講究容器,所以需要addChild這語句把當前的實例放到容器裏.這樣瞄準鏡就出現了在舞臺上,但是我們的要求不單單如此,我們需要那個瞄準鏡頭跟着鼠標動.那麼繼續以下代碼:
Mouse.hide();
stage.addEventListener(MouseEvent.MOUSE_MOVE,aimMove);
function aimMove(e:MouseEvent):void{
 aims.x = this.mouseX;
 aims.y = this.mouseY;
}
    我們需要鼠標就是瞄準鏡,那麼原來那個箭頭圖需要取消,所以用了hide,然後舞臺上要監聽鼠標移動.然後根據監聽,把當前的鼠標位置傳達給瞄準鏡.這樣,我們第一部分就完成了,很簡單.
    下載:
[img]/uploads/allimg/080508/1009552.gif[/img]
下載文件
[url=http://www.uncool.cn/blogs/attachment/1195978762_0.rar]點擊這裏下載文件[/url]
2,飛翔的氣球    (怎麼飛?隨機飛,隨機速度又怎麼表現?該如何記時?)
    武器有了,那麼該是獵物出現了.氣球該出來了,不過,我們先停下,思考一下氣球該怎麼出來?當然是從下往上飛,然後呢?一下子飛出來幾個?共要飛幾個?那就一秒一個吧,共飛10個.好了,先思考到這裏.等下繼續.不過別忘了,先在舞臺上畫個氣球.然後按照第一步所寫的,扔到庫裏.
    一秒一個,共飛10個,那麼我們就要用到TIMER類,這個是AS2沒有的,代碼如下:
var t:Timer;
var ballNumber:uint = 10;    
t = new Timer(1000,10);
t.addEventListener(TimerEvent.TIMER,ballgo);
t.start();
     這樣一秒一個,共10個算是寫出來了,不過還沒完,每秒調用時間時,我該乾點啥還沒寫呢,繼續:
var balls:MovieClip;
function ballgo(e:TimerEvent):void {
 balls = new ball();
 addChild(balls);
              //小球隨機出現在Y軸300的地方,主要是爲了方便查看,是否調用成功.
 balls.x = stage.stageWidth*Math.random();
 balls.y = 300;
}
 
     這樣,小球就挨個的以每秒一個出現在舞臺上,但是我們還不滿足,畢竟那是氣球啊,應該向上飛的.好,繼續加入代碼,先放速度,目前放統一的速度
var speed:uint= 5;
     然後在剛纔的 ballgo FUNCTION裏繼續加代碼:
    balls.addEventListener(Event.ENTER_FRAME,ballFly);
    加完後,寫ballFly .
function ballFly(e:Event):void {
 e.target.y -= speed;
}
     測試一下,哈哈,氣球在往上飛了,不過可以注意到兩點:第一點,好象瞄準鏡在氣球下嘛,第二點,10個氣球應該飛出舞臺該消失了吧.恩,考慮的很對.好,先解決瞄準鏡的問題:
     那瞄準鏡爲什麼會在氣球下呢?因爲瞄準鏡是先放到舞臺上的,那麼他的層次就比氣球低,所以就會出現在氣球之下,我們該怎麼解決這個問題呢?我的方法是這樣的,先製作一個空容器放在舞臺上,然後用來放氣球,很多的氣球.這樣不就把問題解決了嘛.解決了嗎?不一定
   在剛開頭,我就說過,瞄準鏡有兩種做法,爲什麼呢?好了,我們現在可以在這裏知道答案了,因爲瞄準鏡需要在氣球之上,但是如果你是十字相交的話,你鼠標無論怎麼點,都是屬於點在瞄準鏡頭上而不是氣球上,那我們如果需要氣球被打中的話,就是監聽氣球是否被鼠標點擊了.可是鼠標點擊都被十字相交的線給阻擋了,怎麼辦?所以用不相交的線爲好。
   不過並不是不能用十字相交的線,可以這樣解決.用swapChildren()語句在監聽點擊後調換層次.
     第二點疑問還沒解決,飛出了舞臺該消失,並且移除掉,節省資源.沒錯,這個是必須做的.那就是監聽球的Y軸信息,如果出了舞臺就移除掉.爲了方便,就做一個移除掉的function,因爲等後面爆炸後,這個function 還需要調用.
     再等等放代碼,下面討論的是隨機速度.因爲我需要氣球都是每一個都是有自己的隨機速度,那該怎麼做?
    balls.speed =  5*Math.random()+2;//後面的數據隨便改,可快可慢.
   那個其實也簡單,在產生balls的時候,往裏放一個隨機的數據,這就完全解決了。
  頭暈了吧,呵呵,沒關係我現在放上以上的全部代碼
var aims:MovieClip;
var balls:MovieClip;
var t:Timer;
var ballNumber:uint = 10;
var content_mc:MovieClip;
function aimMove(e:MouseEvent):void {
 aims.x = this.mouseX;
 aims.y = this.mouseY;
}
function init():void {
 content_mc = new MovieClip();
 addChild(content_mc);
 
 aims= new aim();
 addChild(aims);
 aims.enabled = false;
 Mouse.hide();
 stage.addEventListener(MouseEvent.MOUSE_MOVE,aimMove);
 t = new Timer(1000,10);
 t.addEventListener(TimerEvent.TIMER,ballgo);
 t.start();
}
init();
var speed:uint = 5;
function ballgo(e:TimerEvent):void {
 balls = new ball();
 content_mc.addChild(balls);
 balls.x = stage.stageWidth*Math.random();
 balls.y = 500;
 balls.speed =  5*Math.random()+2;
 balls.addEventListener(Event.ENTER_FRAME,ballFly);
 balls.addEventListener(MouseEvent.CLICK,shoot);
 
}
function ballFly(e:Event):void {
 var tempBall:MovieClip = e.currentTarget as MovieClip;
 if (tempBall.y + tempBall.height/2 >0) {
   tempBall.y -= tempBall.speed;
 } else {
   lose(tempBall);
 }
 
}
function lose(mc:Object):void{
 mc.removeEventListener(Event.ENTER_FRAME,ballFly);
   mc.parent.removeChild(mc);
}
function shoot(e:MouseEvent):void{
 trace("shoot")
}
源文件:
[img]/uploads/allimg/080508/1009552.gif[/img]
下載文件
[url=http://www.uncool.cn/blogs/attachment/1195982667_0.rar]點擊這裏下載文件[/url]
總結:以上的方式只是一種,比如我不需要TIMER類,我用舞臺的ENTERFARME方式每次出一個氣球,這樣也可以.方法有很多,我這裏只不過是其中之一。下面還有4步,不過下面的就比較簡單了,主要的就是這兩步.
本文轉自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/3212.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章