遊戲玩法:
這個遊戲當中,飛機會不斷的從屏幕左邊或右邊飛過來,通過鍵盤左右移動防空炮,並按空格鍵發出炮彈,玩家的炮彈數是有限 的,當彈盡則表示遊戲結束。
遊戲的主要思路:
1、隨機創建飛機,並讓飛機移動;
2、如何實現鍵盤控制防空炮;
3、判斷擊中情況,並處理;
準備工作:
元件:會有三個MovieClip。一個叫AAGun,是防空炮,一個是Bullet,是子彈。
還有一個最重要的Airplane,它有10個幀組成,1到5幀分別爲5種不同類型的飛機,第6幀爲explode,第10幀有幀代碼,parent.removeChild(this);
stop;
作用是播到此幀時父容器將此MovieClip移除。(以上3個MovieClip都有鏈接,注意加上)
除此之外還有一個常規按鈕;
舞臺設置:
一共有三幀。
第一幀,有個開始按鈕,實例名爲startButton,幀代碼爲
stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
function clickStart(event:MouseEvent) {
gotoAndStop("play");
}
很容易理解,單擊跳到第2幀,即遊戲開始幀。
第二幀,爲startAirRaid();調用遊戲主函數,開始遊戲。
舞臺下方有個"shotsLeft"文本框,它的作用是顯示剩餘可用的球數。舞臺中央有個”gameMessage“,是用來顯示遊戲信息的。
第三幀,有個重玩按鈕,實例名爲playAgainButton,幀代碼爲:
playAgainButton.addEventListener(MouseEvent.CLICK,clickPlayAgain);
function clickPlayAgain(event:MouseEvent) {
gotoAndStop("play");
}
點擊重新開始遊戲。
舞臺上有兩個動態文本框,實例名分別爲showScore和showShots,分別用來顯示分數和剩餘子彈數。
遊戲代碼:
此遊戲有4個類,即AAGun,Bullet,AirPlane,AirRaid.
—————————————————我是優美的長分割線—————————————————————
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; //用來實現運動的時間變量
public function AAGun() {
// 炮的初始位置
this.x = 275;
this.y = 340;
this.rotation = -90;
// 事件偵聽來實現運動
addEventListener(Event.ENTER_FRAME,moveGun);
}
public function moveGun(event:Event) {
// 獲取時間差
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
// 當前位置
var newRotation = this.rotation;
// 移到左邊
if (MovieClip(parent).leftArrow) {
newRotation -= speed*timePassed/1000;
}
// 移到右邊
if (MovieClip(parent).rightArrow) {
newRotation += speed*timePassed/1000;
}
// 檢查邊界
if (newRotation < -170) newRotation = -170;
if (newRotation > -20) newRotation = -20;
// 重定位
this.rotation = newRotation;
}
// 從屏幕移除,同時移除事件偵聽器
public function deleteGun() {
parent.removeChild(this);
removeEventListener(Event.ENTER_FRAME,moveGun);
}
}
}
—————————————————我是優美的長分割線—————————————————————
下一個類是Bullet,即子彈類:
package {
import flash.display.*;
import flash.events.*;
import flash.utils.getTimer;
public class Bullet extends MovieClip {
private var dx,dy:Number; //速度
private var lastTime:int;
//rot 度
public function Bullet(x,y:Number, rot: Number, speed: Number) {
// 設置開始位置
var initialMove:Number = 35.0;
this.x = x + initialMove*Math.cos(2*Math.PI*rot/360);
this.y = y + initialMove*Math.sin(2*Math.PI*rot/360);
this.rotation = rot;
// 獲得速度
dx = speed*Math.cos(2*Math.PI*rot/360);
dy = speed*Math.sin(2*Math.PI*rot/360);
// 設置動畫
lastTime = getTimer();
addEventListener(Event.ENTER_FRAME,moveBullet);
}
public function moveBullet(event:Event) {
// 獲取經過的時間
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
// 移動炮彈
this.x += dx*timePassed/1000;
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);
}
}
}
—————————————————我是優美的長分割線—————————————————————
最後一個爲主類:package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
public class AirRaid2 extends MovieClip {
private var aagun:AAGun;//聲明防空炮對象
private var aagunbase:AAGunBase;
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);
aagunbase = new AAGunBase();
addChild(aagunbase);
aagunbase.x = aagun.x;
aagunbase.y = aagun.y;
// 創建子彈的數組和飛機的數組
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() {
nextPlane = new Timer(1000+Math.random()*1000,1);//設定計時器
//時間間隔1--2秒的函數
nextPlane.addEventListener(TimerEvent.TIMER_COMPLETE,newPlane);
nextPlane.start();
}
更代碼請查看:http://www.shengshiyouxi.com
public function newPlane(event:TimerEvent) {
//隨機飛機的高度、速度和方向
if (Math.random() > .5) {
var side:String = "left";
} else {
side = "right";
}
var altitude:Number = Math.random()*50+20;//這裏的高度並不是飛機相對地面的高度,因爲頂部y=0,這裏的高度是相對於頂部來說的。
var speed:Number = Math.random()*150+150;
// 創建的飛機,加入到舞臺並加入到數組
var p:Airplane = new Airplane(side,speed,altitude);
addChild(p);
airplanes.push(p);
// 自動函數設置下一架飛機的生成
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++;//分數加1
showGameScore();//更新文本框
break;//跳出循環
}
}
}
if ((shotsLeft == 0) && (bullets.length == 0)) {
endGame();//檢測子彈剩餘是否爲0,如果是則遊戲結束
}
}
// 監聽按鍵
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;//子彈小於0,跳出函數
var b:Bullet = new Bullet(aagun.x,aagun.y,aagun.rotation,300);//創建子彈對象
addChild(b);//加入到舞臺和數組
bullets.push(b);
shotsLeft--;//子彈數減一
showGameScore();//更新文本
}
//更新文本,將分數和子彈顯示在文本框中
public function showGameScore() {
showScore.text = String("Score: "+shotsHit);
showShots.text = String("Shots Left: "+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;
removeChild(aagunbase);
aagunbase = null;
//移除各種偵聽
stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
removeEventListener(Event.ENTER_FRAME,checkForHits);
//停止計時器,將其置空
nextPlane.stop();
nextPlane = null;
//跳到遊戲結束幀
gotoAndStop("gameover");
}
}
}