本例為Flash AS3.0實例教程,介紹射擊類游戲的制作,主要分游戲界面的制作和類的編寫兩部分,從簡單的開始做起,跟著教程動手做做看吧
(一)
演示:

這款游戲可能大家都玩過。敵機在藍天上來回飛行,左右箭頭鍵控制火炮在草地上左右移動。按下空格鍵發射子彈,擊中敵機后,敵機爆炸。得分:記錄擊中的敵機數。剩余子彈:記錄子彈的數量。
游戲運行過程圖:

全部文件及作用圖:游戲文件

AirRaid.fla程序界面及元件
AirRaid.as文檔類 程序的入口。控制整個程序的邏輯順序,邏輯結構關系。
AAGun.as綁定庫中的火炮的類控制火炮
AirPlane.as綁定庫中的敵機的類控制飛機
Bullet.as綁定庫中的子彈的類控制子彈
UI(界面)部分
AirRaid.fla文件結構
AirRaid.fla文件:是主文件,分為5個圖層3幀,幀上有代碼,綁定了文檔類 AirRaid.as 。圖:界面元素

1、背景層:繪制的藍天、草地、山巒。
2、成績顯示層:"得分:" 動態文本:實例名 showScore "剩余子彈:" 動態文本:實例名 showShots。
3、按鈕及提示層:第1幀:開始按鈕及說明,實例名:startButton。第3幀:重新開始按鈕及結束提示,實例名 playAgainButton。
4、代碼層:3幀每幀都有代碼。
5、標簽層:第1幀,標簽名稱:intro 第2幀,標簽名稱:play 第3幀,標簽名稱:gameover 。
代碼層的每幀代碼及解釋:
第1幀代碼:
importflash.events.MouseEvent;
stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
functionclickStart(event:MouseEvent){
gotoAndStop("play");
}
解釋:給startButton注冊了鼠標點擊事件,用clickStart方法來實現,點擊startButton按鈕就把影片轉到第2幀上游戲的進行界面。
第2幀代碼:
stop();
startAirRaid();
解釋:調用文檔類的startAirRaid方法,執行這個方法,就會生成敵機,火炮,接受用戶的鍵盤操作事件來生成子彈等一系列操作。第3幀代碼:
playAgainButton.addEventListener(MouseEvent.CLICK,clickPlayAgain);
functionclickPlayAgain(event:MouseEvent){
gotoAndStop("play");
}
解釋:給playAgainButton注冊了鼠標點擊事件,用clickPlayAgain方法實現,點擊playAgainButton按鈕跳轉到第2幀。
AirRaid.fla文件與文檔類的綁定:
綁定文檔類:AirRaid.as 圖:綁定文檔類

最后打開庫看看庫中的元件 圖:庫元件

AAGun影片剪輯(炮)
AirPlane影片剪輯(飛機)
BasicButton按鈕
Bullet影片剪輯(子彈)
說一下AirPlane影片剪輯 圖:飛機剪輯

1-5幀每幀一個飛機圖形。第6-9幀爆炸圖形,有標簽:explode 第10幀有代碼。
第10幀代碼:
parent.removeChild(this);
stop();
解釋:parent 是父容器 this 是自身 removeChild 是移除。這句代碼的意思是通知父容器把它從顯示界面移除。就是說當子彈擊中敵機,敵機播放爆炸效果。播放到第10幀時,就通知它的父容器把它從屏幕上移除。
1、首先打開Flash CS4 (CS3、CS4或CS5沒什么大的區別)新建項目,按確定。打開項目面板。圖:新建項目、

2、點擊右邊的第一個三角按鈕(項目),在下拉菜單中選"新建項目"。在彈出新建項目面板項目名稱:填入項目名稱。在根文件夾:項中點擊右邊的瀏覽按鈕,瀏覽到準備存放項目的目錄,按確定。在ActionScript版本:選ActionScript 3.0 。單擊"創建項目"按鈕,這樣項目就建好了。圖:項目面板

3、把AirRaid.fla文件復制到項目文件夾下(省去制作界面)。點擊下面的"創建類"圖標,在彈出的創建類面板類:的文本框中填入文件名:AirRaid 單擊創建類按鈕。這樣類就創建好了并為我們寫好了類的框架,我們可以在框架中添加我們的代碼了。圖:創建類
圖:填入類名

圖:類的框架

4、編寫AirRaid.as類
AirRaid.as類:文檔類AirRaid類是游戲的控制器,綁定AirRaid.fla 。負責生成界面上的飛機、火炮、子彈。顯示得分,子彈的剩余數量。注冊了鍵盤按下,釋放偵聽器,接收用戶的鍵盤操作。注冊了進入幀事件偵聽器,進行碰撞檢測。定義一個飛機計時器,隨機生成飛機。檢測剩余子彈的數目,當子彈數為零時也就是主角死亡了,移除界面上的飛機,火炮,跳轉到重玩按鈕。
package {
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;//飛機數組
private var bullets:Array;//子彈數組
public var leftArrow, rightArrow:Boolean;
private var nextPlane:Timer;//不定時生成飛機的計時器
private var shotsLeft:int;//得分文本
private var shotsHit:int;//子彈數文本
public function startAirRaid() {
// 初始化得分數和子彈數
shotsLeft = 20;
shotsHit = 0;
showGameScore();
// 生成炮加入到舞臺上
aagun = new AAGun();
addChild(aagun);
// 生成飛機、子彈數組
airplanes = new Array();
bullets = new Array();
// 鍵盤按下、釋放事件偵聽器
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
// 進入幀事件偵聽器,檢測子彈擊中飛機的碰撞檢測。
addEventListener(Event.ENTER_FRAME,checkForHits);
// 生成下一架飛機
setNextPlane();
}
//不定時生成飛機
public function setNextPlane() {
//1000毫秒至2000毫秒之間生成一架飛機
nextPlane = new Timer(1000 + Math.random() * 1000,1);
//
nextPlane.addEventListener(TimerEvent.TIMER_COMPLETE,newPlane);
nextPlane.start();
}
public function newPlane(event:TimerEvent) {
// 隨機的邊、速度和高度
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;
// 生成飛機
var p:Airplane = new Airplane(side,speed,altitude);
addChild(p);
airplanes.push(p);
// set time for next plane
setNextPlane();
}
// 碰撞檢測
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();
}
}
// 按下鍵盤
public function keyDownFunction(event:KeyboardEvent) {
if (event.keyCode == 37) {
leftArrow = true;
} else if (event.keyCode == 39) {
rightArrow = true;
} else if (event.keyCode == 32) {
fireBullet();
}
}
// 釋放鍵盤
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);
}
// 從數組獲取飛機
public function removePlane(plane:Airplane) {
for(var i in airplanes) {
if (airplanes[i] == plane) {
airplanes.splice(i,1);
break;
}
}
}
// 獲取數組的一個子彈
public function removeBullet(bullet:Bullet) {
for(var i in bullets) {
if (bullets[i] == bullet) {
bullets.splice(i,1);
break;
}
}
}
// 游戲結束,移除界面上的東西。
public function endGame() {
// 移除飛機
for(var i:int=airplanes.length-1;i>=0;i--) {
airplanes[i].deletePlane();
}
airplanes = null;
aagun.deleteGun();
aagun = null;
// 移除偵聽器
stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
removeEventListener(Event.ENTER_FRAME,checkForHits);
nextPlane.stop();
nextPlane = null;
gotoAndStop("gameover");
}
}
}
5、編寫AAGun.as類
創建類的方法同第3步。首先選中庫中的AAGun元件,打開項目面板創建類。在"將類邦定到庫元件"前面打勾,點下"使用所選庫元件"的單選按鈕。圖:邦定庫元件

AAGun類:邦定庫中的炮元件,向左移動向右移動,檢測邊界,自動消毀。
package {
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; // 控制移動的Timer
public function AAGun() {
// 槍的初始位置
this.x = 275;
this.y = 340;
//運動
addEventListener(Event.ENTER_FRAME,moveGun);
}
public function moveGun(event:Event) {
// 得到時差
var timePassed:int = getTimer() - lastTime;
lastTime += timePassed;
// 現在的位置
var newx = this.x;
// 移動到左邊
if (MovieClip(parent).leftArrow) {
newx -= speed*timePassed / 1000;
}
// 移動到右邊
if (MovieClip(parent).rightArrow) {
newx += speed*timePassed / 1000;
}
// 檢測邊界
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類:邦定庫中的飛機元件。隨機產生飛機,隨機的速度,產生5種飛機樣式,檢測是否飛出邊界,檢測被子彈擊中。自動毀滅和爆炸效果。
package {
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; // 飛機的速度、方向
private var lastTime:int; // 控制移動的Timer
//左右移動
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();
}
//檢測邊界
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();
}
}
// 檢測碰撞,子彈擊中飛機跳轉到幀標簽"explode"演示爆炸動畫。
public function planeHit() {
removeEventListener(Event.ENTER_FRAME,movePlane);
MovieClip(parent).removePlane(this);
gotoAndPlay("explode");
}
// 移除舞臺上的飛機和事件
public function deletePlane() {
removeEventListener(Event.ENTER_FRAME,movePlane);
MovieClip(parent).removePlane(this);
parent.removeChild(this);
}
}
}
新建文件Bullet.as
Bullet類:邦定庫中的子彈元件。控制子彈的飛行方向,檢測子彈是否飛出屏幕。
package {
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;
// 動畫
lastTime = getTimer();
addEventListener(Event.ENTER_FRAME,moveBullet);
}
public function moveBullet(event:Event) {
// 得到時差
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
// 子彈運動
this.y += dy*timePassed/1000;
// 子彈越過屏幕的頂端
if (this.y < 0) {
deleteBullet();
}
}
// 移除舞臺的子彈和事件
public function deleteBullet() {
MovieClip(parent).removeBullet(this);
parent.removeChild(this);
removeEventListener(Event.ENTER_FRAME,moveBullet);
}
}
}
所有的類文件完成保存后,回到AirRaid.fla場景,按Ctrl+Enter組合鍵測試,看看你的成果吧!


教程結束,希望大家喜歡!