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帧代码:
stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
function clickStart(event:MouseEvent) {
gotoAndStop("play");
}
解释:给startButton注册了鼠标点击事件,用clickStart方法来实现,点击startButton按钮就把影片转到第2帧上游戏的进行界面。
第2帧代码:
startAirRaid();
解释:调用文档类的startAirRaid方法,执行这个方法,就会生成敌机,火炮,接受用户的键盘操作事件来生成子弹等一系列操作。
第3帧代码:
function clickPlayAgain(event:MouseEvent) {
gotoAndStop("play");
}
解释:给playAgainButton注册了鼠标点击事件,用clickPlayAgain方法实现,点击playAgainButton按钮跳转到第2帧。
AirRaid.fla文件与文档类的绑定:
绑定文档类:AirRaid.as 图:绑定文档类
最后打开库看看库中的元件 图:库元件
AAGun 影片剪辑(炮)
AirPlane 影片剪辑(飞机)
BasicButton 按钮
Bullet 影片剪辑(子弹)
说一下AirPlane影片剪辑 图:飞机剪辑
1-5帧每帧一个飞机图形。第6-9帧爆炸图形,有标签:explode 第10帧有代码。
第10帧代码:
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组合键测试,看看你的成果吧!
唐山flash原创动画 。本教程由 唐山卡动互动影视动漫 转载 如有版权问题请联系删除。