Flash as3空襲遊戲

遊戲玩法:
   這個遊戲當中,飛機會不斷的從屏幕左邊或右邊飛過來,通過鍵盤左右移動防空炮,並按空格鍵發出炮彈,玩家的炮彈數是有限 的,當彈盡則表示遊戲結束。
  遊戲的主要思路:
  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");
  }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章