幻想森林

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

Flash AS3东方弹幕Test

[复制链接]

86

主题

250

帖子

390

积分

版主

Rank: 7Rank: 7Rank: 7

积分
390
发表于 2009-12-10 05:41:15 | 显示全部楼层 |阅读模式


flash: http://dl.dropbox.com/u/2877500/dongfang/Test.swf
Shift减速,上下左右移动。

很快就结束的,大概4次弹幕过后。

我又用Flash CS4编译了,所以请升级Flash Player 到10.

右上角参数请看这里说明:http://www.rpgchina.net/read-htm-tid-36648.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

86

主题

250

帖子

390

积分

版主

Rank: 7Rank: 7Rank: 7

积分
390
 楼主| 发表于 2009-12-13 03:29:25 | 显示全部楼层
  1. package {
  2.     import flash.display.Loader;
  3.     import flash.display.Sprite;
  4.     import flash.display.BitmapData;
  5.     import flash.events.Event;
  6.     import flash.events.MouseEvent;
  7.     import flash.events.KeyboardEvent;
  8.     import flash.geom.Rectangle;
  9.     import flash.geom.Point;
  10.     import flash.net.URLRequest;
  11.     import flash.text.TextField;
  12.     import flash.text.TextFormat;
  13.     import flash.system.LoaderContext;
  14.     import flash.system.Security;
  15.     import Stats;
  16.     import FPS;
  17.     [SWF(backgroundColor="#262626", frameRate="60")]
  18.     public class Game extends Sprite {
  19.         private var eField:BulletField;
  20.         private var pField:BulletField;
  21.         private var player:Player;
  22.         private var enemy:Enemy;
  23.         private var status:TextField;
  24.         private var t:uint;
  25.         private var hit:uint;
  26.         private var loader:Loader;
  27.         private var fps:FPS=new FPS();
  28.         public function Game() {
  29.             stage.align = "TL";
  30.             stage.scaleMode = "noScale";
  31.             Security.loadPolicyFile("http://dl.dropbox.com/u/2877500/dongfang/crossdomain.xml");
  32.             loader = new Loader();
  33.             loader.contentLoaderInfo.addEventListener("complete", loadingComplete);
  34.             loader.load(new URLRequest("http://dl.dropbox.com/u/2877500/dongfang/bullets.png"), new LoaderContext(true));
  35.             pField = new BulletField(380, 445);
  36.             pField.x = 10, pField.y = 10;
  37.             addChild(pField);
  38.             eField = new BulletField(380, 445);
  39.             eField.x = 10, eField.y = 10;
  40.             addChild(eField);
  41.             var frame:Sprite = new Sprite();
  42.             frame.graphics.beginFill(0x000000);
  43.             frame.graphics.drawRect(0, 0, 550, 465);
  44.             frame.graphics.drawRect(10, 10, 380, 445);
  45.             addChild(frame);
  46.             var stats:Stats = new Stats();
  47.             stats.x = 395;
  48.             stats.y = 10;
  49.             fps.x = 445;
  50.             fps.y = 10;
  51.             frame.addChild(stats);
  52.             status = new TextField();
  53.             status.defaultTextFormat = new TextFormat("_sans", 9);
  54.             status.autoSize = "left";
  55.             status.textColor = 0xffffff;
  56.             status.x = 395;
  57.             status.y = 110;
  58.             frame.addChild(status);
  59.             frame.addChild(fps);
  60.         }
  61.         public function loadingComplete(e:Event):void {
  62.             var source:BitmapData = new BitmapData(55, 28, true, 0x00000000);
  63.             source.draw(loader);
  64.             var bmp1:BitmapData = new BitmapData(12, 12, true, 0x00000000);
  65.             bmp1.copyPixels(source, new Rectangle(0, 0, 12, 12), new Point());
  66.             Player.loadImage(bmp1);
  67.             var bmp2:BitmapData = new BitmapData(15, 15, true, 0x00000000);
  68.             bmp2.copyPixels(source, new Rectangle(12, 0, 15, 15), new Point());
  69.             GrainBullet.loadImage(bmp2);
  70.             var bmp3:BitmapData = new BitmapData(28, 28, true, 0x00000000);
  71.             bmp3.copyPixels(source, new Rectangle(27, 0, 28, 28), new Point());
  72.             BigBall.loadImage(bmp3);
  73.             var s:Sprite = new Sprite();
  74.             s.graphics.beginFill(0x000000, 0.5);
  75.             s.graphics.drawRect(10, 10, 380, 445);
  76.             addChild(s);
  77.             var tf:TextField = new TextField();
  78.             tf.defaultTextFormat = new TextFormat("_sans", 18);
  79.             tf.autoSize = "left";
  80.             tf.textColor = 0xffffff;
  81.             tf.text = "click start";
  82.             tf.x = 200 - tf.width / 2;
  83.             tf.y = 230 - tf.height / 2;
  84.             s.addChild(tf);
  85.             s.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void {
  86.                 removeChild(s);
  87.                 stage.focus = stage;
  88.                 start();
  89.             });
  90.         }
  91.         public function start():void {
  92.             t = 0;
  93.             hit = 0;
  94.             eField.clear();
  95.             pField.clear();
  96.             player = new Player(185, 390);
  97.             pField.addBullet(player);
  98.             stage.addEventListener(KeyboardEvent.KEY_DOWN, player.keyDown);
  99.             stage.addEventListener(KeyboardEvent.KEY_UP, player.keyUp);
  100.             enemy = new Enemy(185, 75);
  101.             eField.addBullet(enemy);
  102.             Bullet.player = player;
  103.             Bullet.enemy  = enemy;
  104.             addEventListener(Event.ENTER_FRAME, update);
  105.         }
  106.         public function update(e:Event):void {
  107.             t++;
  108.             pField.update();
  109.             var h:uint = eField.update();
  110.             if (h) player.hit();
  111.             if (player.dead) finish();
  112.             hit += h;
  113.             var s:String = ["BULLETS: " + eField.bullets.length.toString(),
  114.                             "HIT: " + hit.toString(),
  115.                             "LIFE: "].join("\\n");
  116.             for (var i:int = 0; i < player.life; i++) {
  117.                 s += "★";
  118.             }
  119.             status.text = s;
  120.         }
  121.         public function finish():void {
  122.             removeEventListener(Event.ENTER_FRAME, update);
  123.             stage.removeEventListener(KeyboardEvent.KEY_DOWN, player.keyDown);
  124.             stage.removeEventListener(KeyboardEvent.KEY_UP, player.keyUp);
  125.             var s:Sprite = new Sprite();
  126.             s.graphics.beginFill(0x000000, 0.5);
  127.             s.graphics.drawRect(10, 10, 380, 445);
  128.             addChild(s);
  129.             var tf:TextField = new TextField();
  130.             tf.defaultTextFormat = new TextFormat("_sans", 18);
  131.             tf.autoSize = "left";
  132.             tf.textColor = 0xffffff;
  133.             tf.text = "retry";
  134.             tf.x = 200 - tf.width / 2;
  135.             tf.y = 230 - tf.height / 2;
  136.             s.addChild(tf);
  137.             s.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void {
  138.                 removeChild(s);
  139.                 stage.focus = stage;
  140.                 start()
  141.             });
  142.         }
  143.     }
  144. }
  145. import flash.display.Bitmap;
  146. import flash.display.Sprite;
  147. class BulletField extends Bitmap {
  148.     public var fieldWidth:Number;
  149.     public var fieldHeight:Number;
  150.     public var bullets:Vector.<Bullet>;
  151.     public function BulletField(w:Number, h:Number) {
  152.         fieldWidth = w;
  153.         fieldHeight = h;
  154.         bullets = new Vector.<Bullet>();
  155.         var bmp:BitmapData = new BitmapData(w, h, true, 0x00000000);
  156.         super(bmp);
  157.     }
  158.     public function addBullet(bullet:Bullet):void {
  159.         bullet.field = this;
  160.         bullets.push(bullet);
  161.     }
  162.     public function update():uint {
  163.         bitmapData.lock();
  164.         bitmapData.fillRect(bitmapData.rect, 0x00000000);
  165.         var hit:uint = 0;
  166.         var n:uint = bullets.length;
  167.         while (n--) {
  168.             var bullet:Bullet = bullets[n];
  169.             bullet.update();
  170.             bullet.draw();
  171.             if (bullet.hitTest()) hit++;
  172.             if (bullet.dead) {
  173.                 bullets.splice(n, 1);
  174.             }
  175.         }
  176.         bitmapData.unlock()
  177.         return hit;
  178.     }
  179.     public function clear():void {
  180.         bullets.splice(0, bullets.length);
  181.     }
  182. }
  183. import flash.display.Bitmap;
  184. import flash.display.BitmapData;
  185. import flash.geom.Matrix;
  186. class Bullet {
  187.     public static var player:Player;
  188.     public static var enemy:Enemy;
  189.     public        var dead:Boolean = false;
  190.     public        var x:Number = 0;
  191.     public        var y:Number = 0;
  192.     protected     var direction:Number;
  193.     public        var field:BulletField;
  194.     public function Bullet(x0:Number, y0:Number, d:Number) {
  195.         x = x0, y = y0;
  196.         direction = d;
  197.     }
  198.     public function update():void {
  199.     }
  200.     public function hitTest():Boolean {
  201.         return false;
  202.     }
  203.     public function draw():void {
  204.     }
  205.     public function nWay(bullet:Class, n:int, direction:Number, range:Number, f:BulletField = null):void {
  206.         if (n > 1) {
  207.             for (var i:int = 0; i < n; i++) {
  208.                 (f || field).addBullet(new bullet(x, y, direction + range * (i/(n-1)-0.5)));
  209.             }
  210.         } else if (n == 1) {
  211.             (f || field).addBullet(new bullet(x, y, direction));
  212.         }
  213.     }
  214. }
  215. import flash.display.Shape;
  216. import flash.events.Event;
  217. import flash.events.KeyboardEvent;
  218. import flash.geom.ColorTransform;
  219. import flash.geom.Point;
  220. class Player extends Bullet {
  221.     public static var images:Vector.<BitmapData>;
  222.     private       var image:BitmapData;
  223.     public        var life:int = 10;
  224.     private       var t:uint;
  225.     private       var damaged:uint;
  226.     private       var slow:Boolean = false;
  227.     private       var left:Boolean = false;
  228.     private       var up:Boolean = false;
  229.     private       var right:Boolean = false;
  230.     private       var down:Boolean = false;
  231.     private       var alpha:Number = 1;
  232.     private       var p:Point;
  233.     public static function loadImage(bmp:BitmapData):void {
  234.         images = new Vector.<BitmapData>();
  235.         images.push(bmp);
  236.         var bmp1:BitmapData = bmp.clone();
  237.         bmp1.colorTransform(bmp.rect, new ColorTransform(1.0, 1.0, 1.0, 0.8));
  238.         images.push(bmp1);
  239.         var bmp2:BitmapData = bmp.clone();
  240.         bmp2.colorTransform(bmp.rect, new ColorTransform(1.0, 1.0, 1.0, 0.2));
  241.         images.push(bmp2);
  242.     }
  243.     public function Player(x0:Number = 0, y0:Number = 0) {
  244.         super(x0, y0, 0);
  245.         image = images[0];
  246.         p = new Point();
  247.     }
  248.     override public function update():void {
  249.         t++;
  250.         var vx:Number = 0;
  251.         var vy:Number = 0;
  252.         if (left && !right) vx = -1;
  253.         if (!left && right) vx = 1;
  254.         if (up && !down) vy = -1;
  255.         if (!up && down) vy = 1;
  256.         if (slow) {
  257.             x += vx;
  258.             y += vy;
  259.         } else {
  260.             x += vx * 3;
  261.             y += vy * 3;
  262.         }
  263.         x = Math.max(0, x);
  264.         x = Math.min(field.fieldWidth, x);
  265.         y = Math.max(0, y);
  266.         y = Math.min(field.fieldHeight, y);
  267.         if (damaged) {
  268.             var n:int = t - damaged;
  269.             if (n % 8 < 4) {
  270.                 image = images[2];
  271.             } else {
  272.                 image = images[1];
  273.             }
  274.             if (n > 75) {
  275.                 image = images[0];
  276.                 damaged = 0;
  277.             }
  278.         }
  279.     }
  280.     override public function draw():void {
  281.         p.x = x - image.width / 2;
  282.         p.y = y - image.height / 2;
  283.         field.bitmapData.copyPixels(image, image.rect, p, null, null, true);
  284.     }
  285.     public function hit():void {
  286.         if (!damaged) {
  287.             damaged = t;
  288.             life--;
  289.             if (!life) {
  290.                 dead = true;
  291.             }
  292.         }
  293.     }
  294.     public function keyDown(e:KeyboardEvent):void {
  295.         switch (e.keyCode) {
  296.             case 16: slow  = true; break;
  297.             case 37: left  = true; break;
  298.             case 38: up    = true; break;
  299.             case 39: right = true; break;
  300.             case 40: down  = true; break;
  301.         }
  302.     }
  303.     public function keyUp(e:KeyboardEvent):void {
  304.         switch (e.keyCode) {
  305.             case 16: slow  = false; break;
  306.             case 37: left  = false; break;
  307.             case 38: up    = false; break;
  308.             case 39: right = false; break;
  309.             case 40: down  = false; break;
  310.         }
  311.     }
  312. }
  313. class Enemy extends Bullet {
  314.     private var t:uint;
  315.     public function Enemy(x0:Number = 0, y0:Number = 0) {
  316.         super(x0, y0, 0);
  317.     }
  318.     override public function update():void {
  319.         t++;
  320.         var d:Number = Math.atan2(y - player.y, player.x - x);
  321.         if (t < 100) {
  322.             if (!(t % 5)) nWay(GrainBullet1, 30, Math.PI * (t % 360) / 180, Math.PI * 2);
  323.         } else if (t > 250 && t < 1050) {
  324.             if (!(t % 25)) nWay(GrainBullet1, 31, d, Math.PI * 4/3);
  325.             if (!(t % 20)) nWay(BigBall1, 10, -Math.PI * (t % 16) / 8, Math.PI * 2);
  326.         } else if (t > 1250 && t < 2050) {
  327.             if (!(t % 10)) nWay(GrainBullet1, 20, Math.PI * (t % 90) / 45, Math.PI * 2);
  328.             if (!(t % 10)) nWay(GrainBullet1, 20, -Math.PI * (t % 90) / 45, Math.PI * 2);
  329.             if (!(t % 50)) nWay(BigBall1, 11, d, Math.PI * 4/3);
  330.         } else if (t > 2200 && t < 2800) {
  331.             if (!(t % 250)) nWay(GrainBullet2, 20, 0, Math.PI * 2);
  332.         }
  333.     }
  334. }
  335. class GrainBullet extends Bullet {
  336.     private static var images:Vector.<BitmapData>;
  337.     private static var p:Point;
  338.     public         var image:BitmapData;
  339.     public static function loadImage(source:BitmapData):void {
  340.         images = new Vector.<BitmapData>();
  341.         var s:Number = source.width;
  342.         for (var i:int; i < 360; i++) {
  343.             var bmp:BitmapData = new BitmapData(s, s, true, 0x00000000);
  344.             var d:Number = i / 180 * Math.PI;
  345.             var m:Matrix = new Matrix();
  346.             m.translate(-s/2, -s/2);
  347.             m.rotate(-d);
  348.             m.translate(s/2, s/2);
  349.             bmp.draw(source, m, null, null, null, true);
  350.             images.push(bmp);
  351.         }
  352.         p = new Point();
  353.     }
  354.     public function GrainBullet(x0:Number, y0:Number, d:Number) {
  355.         super(x0, y0, d);
  356.         updateImage();
  357.     }
  358.     override public function draw():void {
  359.         p.x = x - image.width / 2;
  360.         p.y = y - image.height / 2;
  361.         field.bitmapData.copyPixels(image, image.rect, p, null, null, true);
  362.     }
  363.     override public function hitTest():Boolean {
  364.         return Math.sqrt(Math.pow(player.x - x, 2) + Math.pow(player.y - y, 2)) < 3;
  365.     }
  366.     protected function updateImage():void {
  367.         var l:int = images.length;
  368.         var i:int = direction / Math.PI * l * 0.5;
  369.         image = images[((i %= l) < 0) ? i + l : i];
  370.     }
  371. }
  372. class BigBall extends Bullet {
  373.     private static var image:BitmapData;
  374.     private static var p:Point;
  375.     public static function loadImage(bmp:BitmapData):void {
  376.         image = bmp;
  377.         p = new Point()
  378.     }
  379.     public function BigBall(x0:Number, y0:Number, d:Number) {
  380.         super(x0, y0, d);
  381.     }
  382.     override public function draw():void {
  383.         p.x = x - image.width / 2;
  384.         p.y = y - image.height / 2;
  385.         field.bitmapData.copyPixels(image, image.rect, p, null, null, true);
  386.     }
  387.     override public function hitTest():Boolean {
  388.         return Math.sqrt(Math.pow(player.x - x, 2) + Math.pow(player.y - y, 2)) < 10;
  389.     }
  390. }
  391. class GrainBullet1 extends GrainBullet {
  392.     private var vx:Number;
  393.     private var vy:Number;
  394.     public function GrainBullet1(x0:Number, y0:Number, d:Number, v:Number = 1.5) {
  395.         super(x0, y0, d);
  396.         vx =  Math.cos(direction) * v;
  397.         vy = -Math.sin(direction) * v;
  398.     }
  399.     override public function update():void {
  400.         x += vx;
  401.         y += vy;
  402.         if (x < -10 || x > field.fieldWidth + 10 ||
  403.             y < -10 || y > field.fieldHeight + 10) {
  404.             dead = true;
  405.         }
  406.     }
  407. }
  408. class BigBall1 extends BigBall {
  409.     private var vx:Number;
  410.     private var vy:Number;
  411.     public function BigBall1(x0:Number, y0:Number, d:Number, v:Number = 1) {
  412.         super(x0, y0, d);
  413.         vx =  Math.cos(direction) * v;
  414.         vy = -Math.sin(direction) * v;
  415.     }
  416.     override public function update():void {
  417.         x += vx;
  418.         y += vy;
  419.         if (x < -10 || x > field.fieldWidth + 10 ||
  420.             y < -10 || y > field.fieldHeight + 10) {
  421.             dead = true;
  422.         }
  423.     }
  424. }
  425. class GrainBullet2 extends GrainBullet {
  426.     private var t:uint = 0;
  427.     public function GrainBullet2(x0:Number, y0:Number, d:Number) {
  428.         super(x0, y0, d);
  429.     }
  430.     override public function update():void {
  431.         t++;
  432.         if (t < 300) {
  433.             direction += 0.06 - t * 0.0002;
  434.             updateImage();
  435.             x += Math.cos(direction);
  436.             y -= Math.sin(direction);
  437.         } else {
  438.             nWay(GrainBullet3, 50, 0, Math.PI * 2);
  439.             dead = true;
  440.         }
  441.     }
  442. }
  443. class GrainBullet3 extends GrainBullet {
  444.     private var t:uint = 0;
  445.     private var vx:Number;
  446.     private var vy:Number;
  447.     public function GrainBullet3(x0:Number, y0:Number, d:Number) {
  448.         super(x0, y0, d);
  449.         vx =  Math.cos(direction) * 2.5;
  450.         vy = -Math.sin(direction) * 2.5;
  451.     }
  452.     override public function update():void {
  453.         t++;
  454.         if (t < 100) {
  455.             vx *= 0.99;
  456.             vy *= 0.99;
  457.             x += vx;
  458.             y += vy;
  459.         } else {
  460.             vy += 0.01;
  461.             x += vx;
  462.             y += vy;
  463.             direction = Math.atan2(-vy, vx);
  464.             updateImage();
  465.             if (x < -10 || x > field.fieldWidth + 10 ||
  466.                 y < -10 || y > field.fieldHeight + 10) {
  467.                 dead = true;
  468.             }
  469.         }
  470.     }
  471. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 16:35 , Processed in 0.025308 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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