幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2973|回复: 0

一个人打兵乓球——AS3新手学习例子

[复制链接]

86

主题

250

帖子

390

积分

版主

Rank: 7Rank: 7Rank: 7

积分
390
发表于 2009-12-13 11:16:36 | 显示全部楼层 |阅读模式
简陋之作,AS3新手学习例子。
http://dl.dropbox.com/u/2877500/pinpang.swf
  1. package {
  2.     import flash.display.*;
  3.     import flash.events.*;
  4.     import flash.filters.*;
  5.     import flash.text.*;
  6.    
  7.     [SWF(width = "465", height = "465", frameRate = "50", backgroundColor="0x000000")]
  8.     public class WarpSmash extends Sprite {
  9.         private var isGameOver:Boolean;
  10.         private var gameOverCount:int;
  11.         
  12.         private const GAME_OVER_WAIT:int = 50;
  13.         
  14.         private const SCREEN_W:int = 465;
  15.         private const SCREEN_H:int = 465;
  16.         
  17.         private const PADDLE_OFFSET:Number = 25;
  18.         private var PADDLE_XS:Array = [ PADDLE_OFFSET, SCREEN_W - PADDLE_OFFSET ];
  19.         
  20.         private const PADDLE_HX:int = 7;
  21.         private const PADDLE_HY:int = 50;
  22.         
  23.         private var paddleX:Number = PADDLE_XS[side];
  24.         private var paddleY:Number;
  25.         
  26.         
  27.         private var side:int = 0;
  28.         
  29.         private var teleporting:Boolean;
  30.         
  31.         private var ballX:Number;
  32.         private var ballY:Number;
  33.         private var ballVX:Number;
  34.         private var ballVY:Number;
  35.         private var ballSpeed:Number;
  36.         private const BALL_RADIUS:Number = 7;
  37.         
  38.         private var paddle:Shape = new Shape();
  39.         private var ball:Shape = new Shape();
  40.         
  41.         private var score:int;
  42.         
  43.         private var gameOverText:TextField;
  44.         private var scoreText:TextField;
  45.         private var instructionText:TextField;
  46.         
  47.         
  48.         private var colorMatrixFilter:ColorMatrixFilter = new ColorMatrixFilter(
  49.             [
  50.                 1, 0, 0, 0, 0,
  51.                 0, 1, 0, 0, 0,
  52.                 0, 0, 1, 0, 0,
  53.                 0, 0, 0, 1, 30
  54.             ]
  55.         );
  56.         private var glowFilter:GlowFilter = new GlowFilter(0x00FF00, 1, 8, 8);
  57.         private var paddleFilters:Array = [ new BlurFilter(0, 0, 2), colorMatrixFilter, glowFilter ];
  58.         
  59.         public function WarpSmash() {
  60.             function createText(x:Number, y:Number, fontSize:Number):TextField {
  61.                 var tf:TextField = new TextField();
  62.                 tf.defaultTextFormat = new TextFormat("Helvetica", fontSize, 0xFFFFFFFF);
  63.                 tf.selectable = false;
  64.                 tf.x = x;
  65.                 tf.y = y;
  66.                 return tf;
  67.             }
  68.             gameOverText = createText(225, 150, 23);
  69.             gameOverText.text = "GAME OVER";
  70.             gameOverText.autoSize = TextFieldAutoSize.CENTER;
  71.             gameOverText.visible = isGameOver;
  72.             addChild(gameOverText);
  73.             
  74.             scoreText = createText(252, 300, 160);
  75.             scoreText.autoSize = TextFieldAutoSize.RIGHT;
  76.             addChild(scoreText);
  77.             
  78.             instructionText = createText(248, 180, 23);
  79.             instructionText.text = "CLICK TO TELEPORT!";
  80.             instructionText.autoSize = TextFieldAutoSize.RIGHT;
  81.             addChild(instructionText);
  82.             
  83.             var g:Graphics = paddle.graphics;
  84.             g.beginFill(0xFFFFFF);
  85.             g.drawRoundRect( -PADDLE_HX, -PADDLE_HY, PADDLE_HX * 2, PADDLE_HY * 2, 4, 4);
  86.             g.endFill();
  87.             addChild(paddle);
  88.             
  89.             g = ball.graphics;
  90.             g.beginFill(0xFFFFFF);
  91.             g.drawCircle(0, 0, BALL_RADIUS);
  92.             g.endFill();
  93.             ball.filters = [ glowFilter ];
  94.             addChild(ball);
  95.             
  96.             initGame();
  97.             
  98.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  99.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
  100.         }
  101.         
  102.         public function initGame():void {
  103.             ballSpeed = 20;
  104.             score = 0;
  105.             scoreText.text = "0";
  106.             
  107.             side = 0;
  108.             paddleX = PADDLE_XS[side];
  109.             teleporting = false;
  110.             setPaddleBlur(0);
  111.             
  112.             ballX = SCREEN_W;
  113.             ballY = random(SCREEN_H * 0.1, SCREEN_H * 0.9);
  114.             ballVX = -ballSpeed;
  115.             ballVY = 0;
  116.             
  117.             isGameOver = false;
  118.         }
  119.         
  120.         private function setPaddleBlur(blur:Number):void {
  121.             paddleFilters[0].blurX = blur;
  122.             paddle.filters = paddleFilters;
  123.         }
  124.         
  125.         private function enterFrameHandler(event:Event):void {
  126.             if (teleporting) {
  127.                 var d:Number = (PADDLE_XS[side] - paddleX) * 0.2;
  128.                 d += sign(d) * 4;
  129.                 if (Math.abs(PADDLE_XS[side] - paddleX) < d) {
  130.                     paddleX = PADDLE_XS[side];
  131.                     setPaddleBlur(0);
  132.                     teleporting = false;
  133.                 } else {
  134.                     paddleX += d;
  135.                     setPaddleBlur(Math.abs(d * 0.65));
  136.                 }
  137.             }
  138.             paddleY = clamp(mouseY, PADDLE_HY, SCREEN_H - PADDLE_HY);
  139.             
  140.             if (!isGameOver) {
  141.                 if (!teleporting) {
  142.                     if ((ballVX < 0 && side == 0 && ballX + ballVX < PADDLE_XS[0] + PADDLE_HX) ||
  143.                         (ballVX > 0 && side == 1 && ballX + ballVX > PADDLE_XS[1] - PADDLE_HX)) {
  144.                         if (Math.abs(ballY - paddleY) > PADDLE_HY + BALL_RADIUS * 0.8) {
  145.                             isGameOver = true;
  146.                             gameOverCount = 0;
  147.                         } else {
  148.                             ballSpeed = clamp(ballSpeed + 0.2, 0, 15);
  149.                            
  150.                             ballVX = -sign(ballVX) * ballSpeed;
  151.                             ballVY += random( -ballSpeed, ballSpeed);
  152.                             ballVY = clamp(ballVY, -ballSpeed, ballSpeed);
  153.                            
  154.                             score = clamp(score + 1, 0, 9999);
  155.                             scoreText.text = String(score);
  156.                         }
  157.                     }
  158.                 }
  159.                 if (!inRange(ballX, -BALL_RADIUS, SCREEN_W + BALL_RADIUS)) {
  160.                     isGameOver = true;
  161.                     gameOverCount = 0;
  162.                 }
  163.             } else {
  164.                 gameOverCount++;
  165.             }
  166.             if (!inRange(ballY + ballVY, BALL_RADIUS, SCREEN_H - BALL_RADIUS)) {
  167.                 ballVY = -ballVY;
  168.             }
  169.             ballX += ballVX;
  170.             ballY += ballVY;
  171.             
  172.             paddle.x = paddleX;
  173.             paddle.y = paddleY;
  174.             ball.x = ballX;
  175.             ball.y = ballY;
  176.             
  177.             gameOverText.visible = isGameOver && (gameOverCount > GAME_OVER_WAIT);
  178.         }
  179.         
  180.         private function mouseDownHandler(MouseEvent:Event):void {
  181.             side = 1 - side;
  182.             teleporting = true;
  183.             
  184.             if (gameOverText.visible) {
  185.                 initGame();
  186.             }
  187.             instructionText.visible = false;
  188.         }
  189.         
  190.         private function random(n:Number, m:Number):Number {
  191.             return n + Math.random() * (m - n);
  192.         }
  193.         private function sign(n:Number):Number {
  194.             if (n > 0) { return 1; }
  195.             if (n < 0) { return -1; }
  196.             return 0;
  197.         }
  198.         private function clamp(n:Number, min:Number, max:Number):Number {
  199.             if (n < min) { n = min; }
  200.             if (n > max) { n = max; }
  201.             return n;
  202.         }
  203.         private function inRange(n:Number, min:Number, max:Number):Boolean {
  204.             return (n >= min && n <= max);
  205.         }
  206.     }
  207. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-28 17:50 , Processed in 0.018079 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表