玩家控制屏幕下方的挡板,并通过鼠标左右移动挡板。主要活动元素是一个小球,它会用墙壁或屏幕顶部碰撞后来回弹跳,当小球向下运动是,如果没有挡板挡住,小球直接穿过屏幕底部消失。屏幕上方是一堆方形砖块,玩家必须控制挡板使小球通过挡板借力弹向砖块,从而消除砖块!
package {
import flash.display.*;
import flash.events.*;
import flash.utils.getTimer;
import flash.geom.Rectangle;
import flash.text.TextField;
public class PaddleBall extends MovieClip {
// environment constants
private const ballRadius:Number = 9;//半径
private const wallTop:Number = 18;//上墙壁
private const wallLeft:Number = 18;//左墙壁
private const wallRight:Number = 532;//
private const paddleY:Number = 380;//挡板
private const paddleWidth:Number = 90;//挡板的宽度
private const ballSpeed:Number = .2;//小球的速度
private const paddleCurve:Number = .005;
private const paddleHeight:Number = 18;//挡板的高度
//关键对象
private var paddle:Paddle;
private var ball:Ball;
// 砖块
private var bricks:Array;
// 小球速度
private var ballDX:Number;
private var ballDY:Number;
// 动画计时器
private var lastTime:uint;
// 小球数量
private var balls:Number;
public function startPaddleBall() {
// 创建挡板
paddle = new Paddle();
paddle.y = paddleY;
addChild(paddle);
// 创建砖块
makeBricks();
balls = 3;//小球的生命条数
gameMessage.text = "Click To Start";
// 设立动画
lastTime = 0;
addEventListener(Event.ENTER_FRAME,moveObjects);
stage.addEventListener(MouseEvent.CLICK,newBall);
}
// 创建砖块组
public function makeBricks() {
bricks = new Array();
// 创建几排砖 共8列5行
for(var y:uint=0;y<5;y++) {
for(var x:uint=0;x<8;x++) {
var newBrick:Brick = new Brick();
// 整齐放置
newBrick.x = 60*x+65;
newBrick.y = 20*y+50;
addChild(newBrick);
bricks.push(newBrick);
}
}
}
public function newBall(event:Event) {
// 如果有小球对象 就不运行此处
if (ball != null) return;
gameMessage.text = "";
// 创建小球对象放置屏幕中央
ball = new Ball();
ball.x = (wallRight-wallLeft)/2+wallLeft;
ball.y = 200;//(paddleY-wallTop)/2+wallTop;
addChild(ball);
// 小球的速度
ballDX = 0;
ballDY = ballSpeed;
// 用掉一个小球
balls--;
ballsLeft.text = "Balls: "+balls;
// 重新设定动画
lastTime = 0;
}
public function moveObjects(event:Event) {
movePaddle();
moveBall();
}
//挡板的移动
public function movePaddle() {
// 跟随鼠标的水平位置
var newX:Number = Math.min(wallRight-paddleWidth/2,
Math.max(wallLeft+paddleWidth/2,
mouseX));
paddle.x = newX;
}
public function moveBall() {
// 如果有小球 不运行此处
if (ball == null) return;
// 获得小球新的位置
if (lastTime == 0) lastTime = getTimer();
var timePassed:int = getTimer()-lastTime;
lastTime += timePassed;
var newBallX = ball.x + ballDX*timePassed;
var newBallY = ball.y + ballDY*timePassed;
//oldBallRect 当前小球的外框 newBallRect 顺利完成某方向运动后的小球外框
var oldBallRect = new Rectangle(ball.x-ballRadius, ball.y-ballRadius, ballRadius*2, ballRadius*2);
var newBallRect = new Rectangle(newBallX-ballRadius, newBallY-ballRadius, ballRadius*2, ballRadius*2);
var paddleRect = new Rectangle(paddle.x-paddleWidth/2, paddle.y-paddleHeight/2, paddleWidth, paddleHeight);
//与挡板碰撞
if (newBallRect.bottom >= paddleRect.top) {
if (oldBallRect.bottom < paddleRect.top) {
if (newBallRect.right > paddleRect.left) {
if (newBallRect.left < paddleRect.right) {
// 小球弹回
newBallY -= 2*(newBallRect.bottom - paddleRect.top);
ballDY *= -1;
// 确定新的运动角度
ballDX = (newBallX-paddle.x)*paddleCurve;
}
}
} else if (newBallRect.top > 400) {
removeChild(ball);
ball = null;
if (balls > 0) {
gameMessage.text = "Click For Next Ball";
} else {
endGame();
}
return;
}
}
// 与上方墙碰撞
if (newBallRect.top < wallTop) {
newBallY += 2*(wallTop - newBallRect.top);
ballDY *= -1;
}
//与左边墙壁碰撞
if (newBallRect.left < wallLeft) {
newBallX += 2*(wallLeft - newBallRect.left);
ballDX *= -1;
}
// 与右边墙壁碰撞
if (newBallRect.right > wallRight) {
newBallX += 2*(wallRight - newBallRect.right);
ballDX *= -1;
}
// 与砖块碰撞
for(var i:int=bricks.length-1;i>=0;i--) {
// 获得砖块的矩形
var brickRect:Rectangle = bricks[i].getRect(this);
// 是否有砖块发生碰撞
if (brickRect.intersects(newBallRect)) {
// 小球撞击砖块的左边还是右边 反射=2*经过的距离
if (oldBallRect.right < brickRect.left) {
newBallX += 2*(brickRect.left - oldBallRect.right);
ballDX *= -1;
} else if (oldBallRect.left > brickRect.right) {
newBallX += 2*(brickRect.right - oldBallRect.left);
ballDX *= -1;
}
// 小球撞击的顶部还得底部
if (oldBallRect.top > brickRect.bottom) {
ballDY *= -1;
newBallY += 2*(brickRect.bottom-newBallRect.top);
} else if (oldBallRect.bottom < brickRect.top) {
ballDY *= -1;
newBallY += 2*(brickRect.top - newBallRect.bottom);
}
// 移除砖块
removeChild(bricks[i]);
bricks.splice(i,1);
if (bricks.length < 1) {
endGame();
return;
}
// 处理一次碰撞即可
break;
}
}
// 为小球设置新的位置
ball.x = newBallX;
ball.y = newBallY;
}
function endGame() {
//移除挡板和砖块
removeChild(paddle);
for(var i:int=bricks.length-1;i>=0;i--) {
removeChild(bricks[i]);
}
paddle = null;
bricks = null;
// 移除小球
if (ball != null) {
removeChild(ball);
ball = null;
}
// 移除监听
removeEventListener(Event.ENTER_FRAME,moveObjects);
stage.removeEventListener(MouseEvent.CLICK,newBall);
gotoAndStop("gameover");
}
}
}