游戏玩法:
这个游戏当中,飞机会不断的从屏幕左边或右边飞过来,通过键盘左右移动防空炮,并按空格键发出炮弹,玩家的炮弹数是有限 的,当弹尽则表示游戏结束。
游戏的主要思路:
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");
}
}
}