Flash AS3.0實(shí)例教程:教你射擊類游戲的制作及解析打飛機(jī)游戲的制作過(guò)程

本例為Flash AS3.0實(shí)例教程,介紹射擊類游戲的制作,主要分游戲界面的制作和類的編寫(xiě)兩部分,從簡(jiǎn)單的開(kāi)始做起,跟著教程動(dòng)手做做看吧
(一)
演示:
游戲運(yùn)行過(guò)程圖:
全部文件及作用圖:游戲文件
AirRaid.fla程序界面及元件
AirRaid.as文檔類 程序的入口??刂普麄€(gè)程序的邏輯順序,邏輯結(jié)構(gòu)關(guān)系。
AAGun.as綁定庫(kù)中的火炮的類控制火炮
AirPlane.as綁定庫(kù)中的敵機(jī)的類控制飛機(jī)
Bullet.as綁定庫(kù)中的子彈的類控制子彈
UI(界面)部分
AirRaid.fla文件結(jié)構(gòu)
AirRaid.fla文件:是主文件,分為5個(gè)圖層3幀,幀上有代碼,綁定了文檔類 AirRaid.as 。圖:界面元素
1、背景層:繪制的藍(lán)天、草地、山巒。
2、成績(jī)顯示層:"得分:" 動(dòng)態(tài)文本:實(shí)例名 showScore "剩余子彈:" 動(dòng)態(tài)文本:實(shí)例名 showShots。
3、按鈕及提示層:第1幀:開(kāi)始按鈕及說(shuō)明,實(shí)例名:startButton。第3幀:重新開(kāi)始按鈕及結(jié)束提示,實(shí)例名 playAgainButton。
4、代碼層:3幀每幀都有代碼。
5、標(biāo)簽層:第1幀,標(biāo)簽名稱:intro 第2幀,標(biāo)簽名稱:play 第3幀,標(biāo)簽名稱:gameover 。
代碼層的每幀代碼及解釋:
第1幀代碼:
stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
functionclickStart(event:MouseEvent){
gotoAndStop("play");
}
解釋:給startButton注冊(cè)了鼠標(biāo)點(diǎn)擊事件,用clickStart方法來(lái)實(shí)現(xiàn),點(diǎn)擊startButton按鈕就把影片轉(zhuǎn)到第2幀上游戲的進(jìn)行界面。
第2幀代碼:
startAirRaid();
第3幀代碼:
functionclickPlayAgain(event:MouseEvent){
gotoAndStop("play");
}
解釋:給playAgainButton注冊(cè)了鼠標(biāo)點(diǎn)擊事件,用clickPlayAgain方法實(shí)現(xiàn),點(diǎn)擊playAgainButton按鈕跳轉(zhuǎn)到第2幀。
AirRaid.fla文件與文檔類的綁定:
綁定文檔類:AirRaid.as 圖:綁定文檔類
最后打開(kāi)庫(kù)看看庫(kù)中的元件 圖:庫(kù)元件
AAGun影片剪輯(炮)
AirPlane影片剪輯(飛機(jī))
BasicButton按鈕
Bullet影片剪輯(子彈)
說(shuō)一下AirPlane影片剪輯 圖:飛機(jī)剪輯
1-5幀每幀一個(gè)飛機(jī)圖形。第6-9幀爆炸圖形,有標(biāo)簽:explode 第10幀有代碼。
第10幀代碼:
stop();
解釋:parent 是父容器 this 是自身 removeChild 是移除。這句代碼的意思是通知父容器把它從顯示界面移除。就是說(shuō)當(dāng)子彈擊中敵機(jī),敵機(jī)播放爆炸效果。播放到第10幀時(shí),就通知它的父容器把它從屏幕上移除。
1、首先打開(kāi)Flash CS4 (CS3、CS4或CS5沒(méi)什么大的區(qū)別)新建項(xiàng)目,按確定。打開(kāi)項(xiàng)目面板。圖:新建項(xiàng)目、
2、點(diǎn)擊右邊的第一個(gè)三角按鈕(項(xiàng)目),在下拉菜單中選"新建項(xiàng)目"。在彈出新建項(xiàng)目面板項(xiàng)目名稱:填入項(xiàng)目名稱。在根文件夾:項(xiàng)中點(diǎn)擊右邊的瀏覽按鈕,瀏覽到準(zhǔn)備存放項(xiàng)目的目錄,按確定。在ActionScript版本:選ActionScript 3.0 。單擊"創(chuàng)建項(xiàng)目"按鈕,這樣項(xiàng)目就建好了。圖:項(xiàng)目面板
圖:填入類名
圖:類的框架
4、編寫(xiě)AirRaid.as類
AirRaid.as類:文檔類AirRaid類是游戲的控制器,綁定AirRaid.fla 。負(fù)責(zé)生成界面上的飛機(jī)、火炮、子彈。顯示得分,子彈的剩余數(shù)量。注冊(cè)了鍵盤(pán)按下,釋放偵聽(tīng)器,接收用戶的鍵盤(pán)操作。注冊(cè)了進(jìn)入幀事件偵聽(tīng)器,進(jìn)行碰撞檢測(cè)。定義一個(gè)飛機(jī)計(jì)時(shí)器,隨機(jī)生成飛機(jī)。檢測(cè)剩余子彈的數(shù)目,當(dāng)子彈數(shù)為零時(shí)也就是主角死亡了,移除界面上的飛機(jī),火炮,跳轉(zhuǎn)到重玩按鈕。
import flash.display.MovieClip;;
import flash.display.SimpleButton;
import flash.events.KeyboardEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.events.Event;
public class AirRaid extends MovieClip {
private var aagun:AAGun;//火炮
private var airplanes:Array;//飛機(jī)數(shù)組
private var bullets:Array;//子彈數(shù)組
public var leftArrow, rightArrow:Boolean;
private var nextPlane:Timer;//不定時(shí)生成飛機(jī)的計(jì)時(shí)器
private var shotsLeft:int;//得分文本
private var shotsHit:int;//子彈數(shù)文本
public function startAirRaid() {
// 初始化得分?jǐn)?shù)和子彈數(shù)
shotsLeft = 20;
shotsHit = 0;
showGameScore();
// 生成炮加入到舞臺(tái)上
aagun = new AAGun();
addChild(aagun);
// 生成飛機(jī)、子彈數(shù)組
airplanes = new Array();
bullets = new Array();
// 鍵盤(pán)按下、釋放事件偵聽(tīng)器
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
// 進(jìn)入幀事件偵聽(tīng)器,檢測(cè)子彈擊中飛機(jī)的碰撞檢測(cè)。
addEventListener(Event.ENTER_FRAME,checkForHits);
// 生成下一架飛機(jī)
setNextPlane();
}
//不定時(shí)生成飛機(jī)
public function setNextPlane() {
//1000毫秒至2000毫秒之間生成一架飛機(jī)
nextPlane = new Timer(1000 + Math.random() * 1000,1);
//
nextPlane.addEventListener(TimerEvent.TIMER_COMPLETE,newPlane);
nextPlane.start();
}
public function newPlane(event:TimerEvent) {
// 隨機(jī)的邊、速度和高度
if (Math.random() > .5) {
var side:String = "left";
} else {
side = "right";
}
var altitude:Number = Math.random()*50+20;
var speed:Number = Math.random()*150+150;
// 生成飛機(jī)
var p:Airplane = new Airplane(side,speed,altitude);
addChild(p);
airplanes.push(p);
// set time for next plane
setNextPlane();
}
// 碰撞檢測(cè)
public function checkForHits(event:Event) {
for(var bulletNum:int=bullets.length-1;bulletNum>=0;bulletNum--){
for (var airplaneNum:int=airplanes.length-1;airplaneNum>=0;airplaneNum--) {
if (bullets[bulletNum].hitTestObject(airplanes[airplaneNum])) {
airplanes[airplaneNum].planeHit();
bullets[bulletNum].deleteBullet();
shotsHit++;
showGameScore();
break;
}
}
}
if ((shotsLeft == 0) && (bullets.length == 0)) {
endGame();
}
}
// 按下鍵盤(pán)
public function keyDownFunction(event:KeyboardEvent) {
if (event.keyCode == 37) {
leftArrow = true;
} else if (event.keyCode == 39) {
rightArrow = true;
} else if (event.keyCode == 32) {
fireBullet();
}
}
// 釋放鍵盤(pán)
public function keyUpFunction(event:KeyboardEvent) {
if (event.keyCode == 37) {
leftArrow = false;
} else if (event.keyCode == 39) {
rightArrow = false;
}
}
// 生成新的子彈
public function fireBullet() {
if (shotsLeft <= 0) return;
var b:Bullet = new Bullet(aagun.x,aagun.y,-300);
addChild(b);
bullets.push(b);
shotsLeft--;
showGameScore();
}
public function showGameScore() {
showScore.text = String("得分: "+shotsHit);
showShots.text = String("剩余子彈: "+shotsLeft);
}
// 從數(shù)組獲取飛機(jī)
public function removePlane(plane:Airplane) {
for(var i in airplanes) {
if (airplanes[i] == plane) {
airplanes.splice(i,1);
break;
}
}
}
// 獲取數(shù)組的一個(gè)子彈
public function removeBullet(bullet:Bullet) {
for(var i in bullets) {
if (bullets[i] == bullet) {
bullets.splice(i,1);
break;
}
}
}
// 游戲結(jié)束,移除界面上的東西。
public function endGame() {
// 移除飛機(jī)
for(var i:int=airplanes.length-1;i>=0;i--) {
airplanes[i].deletePlane();
}
airplanes = null;
aagun.deleteGun();
aagun = null;
// 移除偵聽(tīng)器
stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
removeEventListener(Event.ENTER_FRAME,checkForHits);
nextPlane.stop();
nextPlane = null;
gotoAndStop("gameover");
}
}
}
5、編寫(xiě)AAGun.as類
創(chuàng)建類的方法同第3步。首先選中庫(kù)中的AAGun元件,打開(kāi)項(xiàng)目面板創(chuàng)建類。在"將類邦定到庫(kù)元件"前面打勾,點(diǎn)下"使用所選庫(kù)元件"的單選按鈕。圖:邦定庫(kù)元件
AAGun類:邦定庫(kù)中的炮元件,向左移動(dòng)向右移動(dòng),檢測(cè)邊界,自動(dòng)消毀。
import flash.display.*;
import flash.events.*;
import flash.utils.getTimer;
public class AAGun extends MovieClip {
static const speed:Number = 150.0;
private var lastTime:int; // 控制移動(dòng)的Timer
public function AAGun() {
// 槍的初始位置
this.x = 275;
this.y = 340;
//運(yùn)動(dòng)
addEventListener(Event.ENTER_FRAME,moveGun);
}
public function moveGun(event:Event) {
// 得到時(shí)差
var timePassed:int = getTimer() - lastTime;
lastTime += timePassed;
// 現(xiàn)在的位置
var newx = this.x;
// 移動(dòng)到左邊
if (MovieClip(parent).leftArrow) {
newx -= speed*timePassed / 1000;
}
// 移動(dòng)到右邊
if (MovieClip(parent).rightArrow) {
newx += speed*timePassed / 1000;
}
// 檢測(cè)邊界
if (newx < 10) newx = 10;
if (newx > 540) newx = 540;
// 更新位置
this.x = newx;
}
// 移除屏幕上的炮和事件
public function deleteGun() {
parent.removeChild(this);
removeEventListener(Event.ENTER_FRAME,moveGun);
}
}
}
新建文件Airplane.as
Airplane類:邦定庫(kù)中的飛機(jī)元件。隨機(jī)產(chǎn)生飛機(jī),隨機(jī)的速度,產(chǎn)生5種飛機(jī)樣式,檢測(cè)是否飛出邊界,檢測(cè)被子彈擊中。自動(dòng)毀滅和爆炸效果。
import flash.display.MovieClip;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.utils.getTimer;
import flash.events.Event;
public class Airplane extends MovieClip {
private var dx:Number; // 飛機(jī)的速度、方向
private var lastTime:int; // 控制移動(dòng)的Timer
//左右移動(dòng)
public function Airplane(side:String, speed:Number, altitude:Number) {
if (side == "left") {
this.x = -50; // start to the left
dx = speed; // fly left to right
this.scaleX = -1; // reverse
} else if (side == "right") {
this.x = 600; // start to the right
dx = -speed; // fly right to left
this.scaleX = 1; // not reverse
}
this.y = altitude; // vertical position
this.gotoAndStop(Math.floor(Math.random()*5+1));
// set up animation
addEventListener(Event.ENTER_FRAME,movePlane);
lastTime = getTimer();
}
//檢測(cè)邊界
public function movePlane(event:Event) {
// get time passed
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
// move plane
this.x += dx*timePassed/1000;
// check to see if off screen
if ((dx < 0) && (x < -50)) {
deletePlane();
} else if ((dx > 0) && (x > 600)) {
deletePlane();
}
}
// 檢測(cè)碰撞,子彈擊中飛機(jī)跳轉(zhuǎn)到幀標(biāo)簽"explode"演示爆炸動(dòng)畫(huà)。
public function planeHit() {
removeEventListener(Event.ENTER_FRAME,movePlane);
MovieClip(parent).removePlane(this);
gotoAndPlay("explode");
}
// 移除舞臺(tái)上的飛機(jī)和事件
public function deletePlane() {
removeEventListener(Event.ENTER_FRAME,movePlane);
MovieClip(parent).removePlane(this);
parent.removeChild(this);
}
}
}
新建文件Bullet.as
Bullet類:邦定庫(kù)中的子彈元件??刂谱訌椀娘w行方向,檢測(cè)子彈是否飛出屏幕。
import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.getTimer;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Bullet extends MovieClip {
private var dy:Number; // 子彈的速度、方向。
private var lastTime:int;
public function Bullet(x,y:Number, speed: Number) {
// 初始位置
this.x = x;
this.y = y;
// 得到速度
dy = speed;
// 動(dòng)畫(huà)
lastTime = getTimer();
addEventListener(Event.ENTER_FRAME,moveBullet);
}
public function moveBullet(event:Event) {
// 得到時(shí)差
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
// 子彈運(yùn)動(dòng)
this.y += dy*timePassed/1000;
// 子彈越過(guò)屏幕的頂端
if (this.y < 0) {
deleteBullet();
}
}
// 移除舞臺(tái)的子彈和事件
public function deleteBullet() {
MovieClip(parent).removeBullet(this);
parent.removeChild(this);
removeEventListener(Event.ENTER_FRAME,moveBullet);
}
}
}
所有的類文件完成保存后,回到AirRaid.fla場(chǎng)景,按Ctrl+Enter組合鍵測(cè)試,看看你的成果吧!
教程結(jié)束,希望大家喜歡!
相關(guān)文章
flash cs6鼠標(biāo)跟隨效果實(shí)現(xiàn)代碼分享
flash cs6想要實(shí)現(xiàn)鼠標(biāo)跟隨效果?該怎么制作呢?今天我們就來(lái)看看使用as2.0實(shí)現(xiàn)鼠標(biāo)跟隨效果的教程,需要的朋友可以參考下2019-05-19- Flash cs6怎么使用代碼輸入中英文文本?Flash cs6中可以使用文字工具直接輸入文本,也可以使用代碼來(lái)輸入文本,該怎么使用代碼輸入文本呢?請(qǐng)看下文詳細(xì)的教程,需要的朋友2018-03-11
- flash as3.0抽象類怎么定義? as3.0中有很多抽象類,該怎么定義抽象類和抽象方法呢?下面我們就來(lái)看看簡(jiǎn)單的例子,需要的朋友可以參考下http://www.dbjr.com.cn/softs/408402.2018-02-28
flash cs6中怎么使用ActionScript3.0?
flash cs6中怎么使用ActionScript3.0?flash cs6中想要使用ActionScript3.0功能,該怎么使用呢?下面我們就來(lái)看看詳細(xì)的教程,需要的朋友可以參考下2018-01-25Flash中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?
本教程給大家分享一個(gè)Flash小教程,教大家在Flash CS6中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?方法很簡(jiǎn)單,感興趣的朋友歡迎前來(lái)一起分享學(xué)習(xí)2018-01-12Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置?
本教程教腳本之家的ActionScript教程學(xué)習(xí)者在Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置,教程講解的詳細(xì),感興趣的朋友歡迎前來(lái)分享學(xué)習(xí)2017-11-20在Flash CS6中使用with函數(shù)繪制背景圖教程
本教程教腳本之家的ActionScript教程學(xué)習(xí)者如何在Flash CS6中使用with函數(shù)繪制背景圖?教程一步步講解的挺詳細(xì),方法也不難,非常適合Flash新手入門(mén)學(xué)習(xí)2017-11-18Flash怎么設(shè)置元件坐標(biāo)?flash使用代碼設(shè)置元件的坐標(biāo)的教程
Flash怎么設(shè)置元件坐標(biāo)?flash中導(dǎo)如的元件需要添加坐標(biāo),該怎么定位元件坐標(biāo)呢?下面我們就來(lái)看看flash使用代碼設(shè)置元件的坐標(biāo)的教程,需要的朋友可以參考下2017-10-11Flash怎么制作來(lái)回?fù)u擺的花朵的動(dòng)畫(huà)?
Flash怎么制作來(lái)回?fù)u擺的花朵的動(dòng)畫(huà)?Flash中想要給花朵制作一段搖擺的動(dòng)畫(huà)效果,該怎么制作呢?下面我們就來(lái)看看詳細(xì)的教程,很簡(jiǎn)單,需要的朋友可以參考下2017-05-23- Flash怎么制作流動(dòng)七彩色的文字?想要讓文字動(dòng)起來(lái),該怎么使用flash給文字制作一個(gè)流動(dòng)七彩色的動(dòng)畫(huà)呢?下面我們就來(lái)看看詳細(xì)的教程,需要的朋友可以參考下2017-04-23