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

? ?為什么我要說有兩種呢?因為這兩種用發不同,后面我會講到.不過這里我用的是不相交的那種瞄準鏡.我們把這個瞄準鏡做成實例命名aim ,扔到庫里,并把舞臺上的刪除.接著按F11,彈出庫面版,右鍵點aim,然后點Linkage,然后如下圖選擇填寫:
?

? ?接著回到舞臺,按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,然后舞臺上要監聽鼠標移動.然后根據監聽,把當前的鼠標位置傳達給瞄準鏡.這樣,我們第一部分就完成了,很簡單.
? ? 下載:

下載文件
點擊這里下載文件
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")
}
源文件:

下載文件
點擊這里下載文件
總結:以上的方式只是一種,比如我不需要TIMER類,我用舞臺的ENTERFARME方式每次出一個氣球,這樣也可以.方法有很多,我這里只不過是其中之一。下面還有4步,不過下面的就比較簡單了,主要的就是這兩步.
本文轉自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/3212.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
