弹球游戏

玩家控制屏幕下方的挡板,并通过鼠标左右移动挡板。主要活动元素是一个小球,它会用墙壁或屏幕顶部碰撞后来回弹跳,当小球向下运动是,如果没有挡板挡住,小球直接穿过屏幕底部消失。屏幕上方是一堆方形砖块,玩家必须控制挡板使小球通过挡板借力弹向砖块,从而消除砖块!

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




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值