我们需要一个大炮和一个底座,大炮可以旋转,而底座固定不动。通过键盘控制射击五颜六色的气球,击中气球显示爆炸的效果,气球消失。
时间轴上共三帧,intro、play和gameover,需要多个级别的排布。level1气球排练成简单的长方形,2级的时候排列成圆形,3级排列成两组圆形。
package {
import flash.display.*;
import flash.events.*;
import flash.text.TextField;
public class BalloonPop extends MovieClip {
// 显示对象
private var balloons:Array;
private var cannonball:Cannonball;
private var cannonballDX, cannonballDY:Number;
// 按键
private var leftArrow, rightArrow:Boolean;
// 游戏属性
private var shotsUsed:int;//跟踪炮弹的数量
private var speed:Number;//速度
private var gameLevel:int;//级别
private const gravity:Number = .05;//重力
public function startBalloonPop() {
gameLevel = 1;
shotsUsed = 0;
speed = 6;
gotoAndStop("level1");
}
public function startLevel() {
showGameScore();
// 创建对象数组
findBalloons();
// 侦听键盘
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
// 检测碰撞
addEventListener(Event.ENTER_FRAME,gameEvents);
}
public function findBalloons() {
balloons = new Array();
// 遍历所有的显示对象
for(var i:int=0;i<numChildren;i++) {
// 判断当前显示对象是否是气球
if (getChildAt(i) is Balloon) {
// 如果是,得到随机的气球颜色
MovieClip(getChildAt(i)).gotoAndStop(Math.floor(Math.random()*5)+1);
// 添加到气球列表
balloons.push(getChildAt(i));
}
}
}
public function gameEvents(event:Event) {
moveCannon();
moveCannonball();
checkForHits();
}
public function moveCannon() {
var newRotation = cannon.rotation;
if (leftArrow) {
newRotation -= 1;
}
if (rightArrow) {
newRotation += 1;
}
//判断边界 约定在-90°和-20° -90°是朝上的
if (newRotation < -90) newRotation = -90;
if (newRotation > -20) newRotation = -20;
//重定位
cannon.rotation = newRotation;
}
public function moveCannonball() {
// 只有当炮弹存在时才移动
if (cannonball != null) {
// 改变位置
cannonball.x += cannonballDX;
cannonball.y += cannonballDY;
// 增加重力
cannonballDY += gravity;
// 判断炮弹是否落到地面
if (cannonball.y > 340) {
removeChild(cannonball);
cannonball = null;
}
}
}
// 碰撞检测
public function checkForHits() {
if (cannonball != null) {
// 遍历所有的气球
for (var i:int=balloons.length-1;i>=0;i--) {
// 判断他是否与炮弹接触
if (cannonball.hitTestObject(balloons[i])) {
balloons[i].gotoAndPlay("explode");
break;
}
}
}
}
// 按下键
public function keyDownFunction(event:KeyboardEvent) {
if (event.keyCode == 37) {
leftArrow = true;
} else if (event.keyCode == 39) {
rightArrow = true;
} else if (event.keyCode == 32) {
fireCannon();
}
}
// 释放键
public function keyUpFunction(event:KeyboardEvent) {
if (event.keyCode == 37) {
leftArrow = false;
} else if (event.keyCode == 39) {
rightArrow = false;
}
}
// 发射炮弹
public function fireCannon() {
if (cannonball != null) return;
shotsUsed++;
showGameScore();
// 创建炮弹
cannonball = new Cannonball();
cannonball.x = cannon.x;
cannonball.y = cannon.y;
addChild(cannonball);
// 将大炮和底座移到上面
addChild(cannon);
addChild(cannonbase);
// 设置炮弹的方向
cannonballDX = speed*Math.cos(2*Math.PI*cannon.rotation/360);
cannonballDY = speed*Math.sin(2*Math.PI*cannon.rotation/360);
}
// 气球回调函数,将自己移除
public function balloonDone(thisBalloon:MovieClip) {
// 从屏幕中移除
removeChild(thisBalloon);
// 从数组中查找和移除
for(var i:int=0;i<balloons.length;i++) {
if (balloons[i] == thisBalloon) {
balloons.splice(i,1);
break;
}
}
// 查看气球是否被消灭
if (balloons.length == 0) {
cleanUp();
if (gameLevel == 3) {
endGame();
} else {
endLevel();
}
}
}
// 停止游戏
public function cleanUp() {
// 停止所有的事件
stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
removeEventListener(Event.ENTER_FRAME,gameEvents);
// 移除炮弹
if (cannonball != null) {
removeChild(cannonball);
cannonball = null;
}
// 移除大炮
removeChild(cannon);
removeChild(cannonbase);
}
public function endLevel() {
gotoAndStop("levelover");
}
public function endGame() {
gotoAndStop("gameover");
}
//一个分布级别结束后,游戏停在leveover帧上,这一帧将玩家带到下一级别,并开始游戏
public function clickNextLevel(e:MouseEvent) {
gameLevel++;
gotoAndStop("level"+gameLevel);
}
public function showGameScore() {
showScore.text = String("Shots: "+shotsUsed);
}
}
}
时间轴脚本:
气球需要在自身的时间轴的最后一帧调用balloonDone。(爆炸后气球消失)
3个级别都需要调用startLevel函数:
startLevel();
同时,intro帧需要设置一个按钮用于开始游戏:
stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
function clickStart(event:MouseEvent) {
startBalloonPop();
}
同样的,leveover帧上需要设置自身的按钮,用来调用主类中的clickNextLevel函数:
nextLevelButton.addEventListener(MouseEvent.CLICK,clickNextLevel);
最后,gameover帧也需要为按钮添加脚本:
playAgainButton.addEventListener(MouseEvent.CLICK,playAgainClick);
function playAgainClick(e:MouseEvent) {
gotoAndStop("intro");
}