详细解析抓喜鹊游戏教程
本例應(yīng)用了前幾章節(jié)已經(jīng)學(xué)習(xí)的產(chǎn)生隨機(jī)對(duì)象和刪除對(duì)應(yīng)隨機(jī)對(duì)象等知識(shí),控制游戲過(guò)程中用戶(hù)移動(dòng)鼠標(biāo)指針與創(chuàng)建的隨機(jī)對(duì)象之間是否接觸并執(zhí)行相對(duì)應(yīng)的程序塊,顯示用戶(hù)通過(guò)移動(dòng)鼠標(biāo)指針?biāo)鶕渥降降南铲o數(shù)量。本實(shí)例還創(chuàng)建游戲的結(jié)束和重新開(kāi)始程序,用戶(hù)可進(jìn)一步擴(kuò)展,根據(jù)撲捉到的喜鵲數(shù)量來(lái)設(shè)置游戲關(guān)卡和游戲級(jí)別。通過(guò)本例的制作,讀者可以掌握對(duì)簡(jiǎn)單基礎(chǔ)游戲的創(chuàng)建全過(guò)程,停止游戲和重新開(kāi)始游戲的控制。
本例思路:
<1> 創(chuàng)建實(shí)例背景圖。
<2> 添加按鈕和“成績(jī)單”。
<3> 創(chuàng)建喜鵲動(dòng)畫(huà)和手型對(duì)象,將其轉(zhuǎn)換為元件類(lèi)。
<4> 編寫(xiě)喜鵲元件擴(kuò)展類(lèi)。
<5> 編寫(xiě)主程序類(lèi),控制游戲開(kāi)始與結(jié)束,顯示用戶(hù)通過(guò)移動(dòng)鼠標(biāo)指針?biāo)鶕渥降降南铲o數(shù)量。
<6> 隨機(jī)創(chuàng)建的喜鵲對(duì)象與用戶(hù)鼠標(biāo)指針接觸所執(zhí)行的控制程序。
<7> 停止游戲和重新開(kāi)始游戲的控制。
實(shí)例步驟:
(1)新建一個(gè)空白文檔,設(shè)置舞臺(tái)大小為650*400,幀頻設(shè)置為30,繪制游戲背景圖或?qū)胍粡堖m合的背景圖作為游戲背景,13-1所示。
圖13-1 實(shí)例背景
(2)新建一個(gè)圖層,創(chuàng)建三個(gè)按鈕元件,2-所示,并命名“實(shí)例名”為“start_btn” 、“help_btn”、“out_btn” ,分別間隔放置于舞臺(tái)右下角,13-2所示。
圖13-2 控制按鈕
(3)新建一個(gè)圖層,創(chuàng)建“成績(jī)單”,13-3所示。創(chuàng)建一個(gè)動(dòng)態(tài)文本,添加實(shí)例名為“displayGrade_txt”,將用于顯示用戶(hù)通過(guò)移動(dòng)鼠標(biāo)指針?biāo)鶕渥降降南铲o數(shù)量。
圖13-3 縮放和繪制投影
(4)創(chuàng)建一個(gè)新影片剪輯并命名為“Fly”,擴(kuò)展元件類(lèi)也設(shè)為“Fly”。在“Fly”影片剪輯里創(chuàng)建喜鵲飛翔的動(dòng)畫(huà),如下面演示圖13-4 所示。
(1)
(2)
圖13-4 喜鵲和手型
(5)再創(chuàng)建一個(gè)影片剪輯,命名為“gotgood_mc” ,在該影片剪輯內(nèi)插放3個(gè)關(guān)鍵幀,繪制3個(gè)手型,1- (1)、(2)所示。再創(chuàng)建一個(gè)影片剪輯,命名為“MouseHand”,同時(shí)設(shè)置擴(kuò)展元件類(lèi)也為“MouseHand” ,將影片剪輯“gotgood_mc”元件對(duì)象放置于此,并命名實(shí)例名為“gotgood_mc”,13-5所示。
(1)
(2)
(3)
圖13-5 手型
(6)下面先編寫(xiě)已經(jīng)創(chuàng)建的元件擴(kuò)展類(lèi)“FLY” ,該類(lèi)接收一個(gè)Number類(lèi)型參數(shù),將其賦值作為該類(lèi)產(chǎn)生對(duì)象的y軸方向上的遞減值,如第16行代碼所示,通過(guò)在構(gòu)造函數(shù)中為其注冊(cè)ENTER_FRAME事件偵聽(tīng),使該類(lèi)對(duì)象在被創(chuàng)建時(shí)便執(zhí)行事件偵聽(tīng)器函數(shù)enterFrameHandler ,也就是所創(chuàng)建的每一只喜鵲都以某一速度(變量speed值)作向上運(yùn)動(dòng)。此外,該類(lèi)還提供兩個(gè)方法:removeTimerHandler()用于清除事件偵聽(tīng)器函數(shù),這在該類(lèi)對(duì)象被刪除時(shí)會(huì)被調(diào)用(刪除不必要的事件偵聽(tīng));另一個(gè)方法flySpeed()是取得_speed值。
AS3代碼
復(fù)制代碼
代碼如下:
package {
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.*;
public class Fly extends MovieClip {
private var _speed:Number;
public function Fly(speed) {
_speed = Math.round(speed);
this.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
}
private function enterFrameHandler(event:Event):void{
this.y -= this._speed;
}
public function removeTimerHandler():void {
this.removeEventListener(Event.ENTER_FRAME,enterFrameHandler);
trace("清除實(shí)例事件");
}
public function get flySpeed():Number{
return this._speed;
}
}
}
(7)下面是主程序類(lèi)的編寫(xiě),我們?cè)跇?gòu)造函數(shù)初始化舞臺(tái)的寬度和高度,并創(chuàng)建存儲(chǔ)所有喜鵲對(duì)象的容器,如第22到25行代碼所示。在第27到31行代碼隱藏系統(tǒng)鼠標(biāo)并創(chuàng)建“手型”,通過(guò)偵聽(tīng)stage對(duì)象的MOUSE_MOVE和MOUSE_DOWN事件來(lái)控制“手型”的鼠標(biāo)跟隨stageMoveHandler()和狀態(tài)stageDownHandler()。
AS3代碼
復(fù)制代碼
代碼如下:
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
import flash.ui.Mouse;
public class Main extends Sprite {
private var _grade:Number;//得分值
public var displayGrade_txt:TextField;//得分顯示
public var start_btn:SimpleButton;//開(kāi)始按鈕
private var stageW:Number;
private var stageH:Number;
private var content_mc:Sprite;//存儲(chǔ)所有喜鵲對(duì)象的容器
private var hand_mc:MovieClip;//“手型”對(duì)象
private var _timer:Timer;
public function Main() {
this.stageW = stage.stageWidth;
this.stageH = stage.stageHeight;
this.content_mc = new Sprite();
addChild(content_mc);
Mouse.hide();
this.hand_mc = new MouseHand();
hand_mc.mouseEnabled = false;
hand_mc.gotgood_mc.mouseEnabled = false;
addChild(hand_mc);
stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMoveHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN, stageDownHandler);
init();
}
(8)stageMoveHandler()方法是簡(jiǎn)單的鼠標(biāo)跟隨,stageDownHandler()方法是當(dāng)用戶(hù)鼠標(biāo)點(diǎn)擊時(shí)播放步驟(5)中的“手型”影片剪輯動(dòng)畫(huà),產(chǎn)生“抓”的動(dòng)作效果。 init()方法中開(kāi)始初始化該游戲,主要是將displayGrade_txt顯示文本的內(nèi)容設(shè)置為0和為開(kāi)始按鈕注冊(cè)事件偵聽(tīng)器函數(shù)。當(dāng)用戶(hù)單擊start_btn按鈕后,便調(diào)用startGame()方法,此時(shí),將結(jié)束游戲按鈕out_btn 設(shè)置為可見(jiàn),并注冊(cè)事件偵聽(tīng)器函數(shù),如第59、60行代碼所示。然后通過(guò)創(chuàng)建Timer類(lèi)對(duì)象實(shí)例進(jìn)行計(jì)時(shí),每隔500毫秒執(zhí)行一次copy()偵聽(tīng)器函數(shù),也就是創(chuàng)建一只喜鵲對(duì)象,如第62到64行代碼所示。第65行將start_btn按鈕設(shè)置為不可見(jiàn)。
提示:關(guān)于計(jì)時(shí)器Timer類(lèi):Timer(delay:Number, repeatCount:int = 0)
參數(shù) delay:Number — 計(jì)時(shí)器事件間的延遲(以毫秒為單位)。
repeatCount:int (default = 0) — 指定重復(fù)次數(shù)。 如果為 0,則計(jì)時(shí)器重復(fù)無(wú)限次數(shù)。 如果不為 0,則將運(yùn)行計(jì)時(shí)器,運(yùn)行次數(shù)為指定的次數(shù),然后停止。
AS3代碼
復(fù)制代碼
代碼如下:
private function stageMoveHandler(e:MouseEvent):void {
this.hand_mc.x = stage.mouseX;
this.hand_mc.y = stage.mouseY;
}
private function stageDownHandler(event:MouseEvent):void {
hand_mc.gotgood_mc.gotoAndPlay(2);
}
private function init():void{
_grade = 0;
displayGrade_txt.text = "0";
start_btn.addEventListener(MouseEvent.CLICK,startGame);
}
private function startGame(event:MouseEvent):void {
trace("開(kāi)始游戲!");
out_btn.visible = true;
out_btn.addEventListener(MouseEvent.CLICK,outGame);
_timer =new Timer(500,0);
_timer.addEventListener(TimerEvent.TIMER,copy);
_timer.start();
start_btn.visible =false;
}
(9) copy()偵聽(tīng)器函數(shù)中,創(chuàng)建“喜鵲”對(duì)象,設(shè)置1到11之間的隨機(jī)數(shù)作為其隨機(jī)速度值,如第70行代碼所示。統(tǒng)一設(shè)置其y坐標(biāo)為舞臺(tái)底部位置,x坐標(biāo)為隨機(jī)舞臺(tái)寬度值,如第71、72行代碼所示。將創(chuàng)建的“喜鵲”對(duì)象統(tǒng)一添加到content_mc容器中,并注冊(cè)ROLL_OVER和ENTER_FRAME事件偵聽(tīng)。當(dāng)用戶(hù)移動(dòng)鼠標(biāo)指針經(jīng)過(guò)“喜鵲”對(duì)象時(shí),便會(huì)調(diào)用downHandler()偵聽(tīng)器函數(shù),清除其事件偵聽(tīng)和清除該對(duì)象本身,如第81到85行代碼所示,同時(shí)也調(diào)用refreshGrade()方法累加計(jì)算用戶(hù)抓到的“喜鵲”數(shù)量。removeDrop()函數(shù)只是判斷“喜鵲”對(duì)象是否運(yùn)動(dòng)到舞臺(tái)頂部,當(dāng)運(yùn)動(dòng)到舞臺(tái)頂部時(shí),清除“喜鵲”對(duì)象的事件偵聽(tīng)和其本身,如第95到100行代碼所示。
AS3代碼
復(fù)制代碼
代碼如下:
private function copy(event:TimerEvent) {
var mc = new Fly(Math.random() * 10 + 1);
mc.x = Math.random() * this.stageW;
mc.y = this.stageH;
content_mc.addChild(mc);
mc.addEventListener(MouseEvent.ROLL_OVER, downHandler);
mc.addEventListener(Event.ENTER_FRAME, removeDrop);
}
private function downHandler(event:MouseEvent) {
var mc = event.target;
mc.removeTimerHandler();
mc.removeEventListener(MouseEvent.MOUSE_DOWN, downHandler);
mc.removeEventListener(Event.ENTER_FRAME, removeDrop);
content_mc.removeChild(mc);
//refreshGrade(mc.flySpeed);//還可以通過(guò)擴(kuò)展refreshGrade方法,按不同速度得分
refreshGrade();//按數(shù)量
}
private function removeDrop(event:Event) {
var _mc:MovieClip = event.target as MovieClip;
if (_mc.y <= 0) {
_mc.removeTimerHandler();
_mc.removeEventListener(MouseEvent.MOUSE_DOWN, downHandler);
_mc.removeEventListener(Event.ENTER_FRAME, removeDrop);
content_mc.removeChild(_mc);
}
}
public function refreshGrade(grade:Number = 1):void {
this._grade += grade;
displayGrade_txt.text = this._grade.toString();
}
(10)下面代碼是對(duì)結(jié)束游戲的控制和重新開(kāi)始初始化游戲。當(dāng)用戶(hù)單擊“結(jié)束游戲”按鈕便調(diào)用該方法,停止_timer對(duì)象的計(jì)時(shí),將“開(kāi)始游戲”按鈕顯示出來(lái)同時(shí)隱藏“結(jié)束游戲”按鈕,如下面第111到113行代碼所示。然后清除容器中的所有子項(xiàng)偵聽(tīng)和子項(xiàng),如第116到124行代碼所示,再重新調(diào)用init()方法。
AS3代碼
復(fù)制代碼
代碼如下:
private function outGame(event:MouseEvent):void{
_timer.stop();
start_btn.visible = true;
out_btn.visible = false;
//下面清除容器中的所有子項(xiàng)偵聽(tīng)和子項(xiàng)
var num:uint = content_mc.numChildren;
var _mc:MovieClip;
for (var i:int = 0; i
_mc = content_mc.getChildAt(0) as MovieClip;
_mc.removeEventListener(MouseEvent.MOUSE_DOWN, downHandler);
_mc.removeEventListener(Event.ENTER_FRAME, removeDrop);
content_mc.removeChild(_mc);
}
init();
}
}
}
以上教程就是解析Flash CS4抓喜鵲游戲的知識(shí),希望大家都能學(xué)到這樣的基礎(chǔ)知識(shí)。謝謝大家觀看。
總結(jié)
以上是生活随笔為你收集整理的详细解析抓喜鹊游戏教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡怎么销卡 如何注销不用的信用卡
- 下一篇: 正确使用stl map的erase方法