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");
  }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值