守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 877|回复: 0

[华丽特效] 弹珠 挡板反弹游戏效果

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51696
    钢镚
    1422

    开源英雄守望者

    发表于 2015-7-15 14:40:59 | 显示全部楼层 |阅读模式




    1. //コードはめっちゃ汚いよ!
    2. //ブロックの数465*100
    3. //がんばってクリアしてください
    4. package
    5. {
    6.     import flash.display.Bitmap;
    7.     import flash.display.BitmapData;
    8.     import flash.display.Sprite;
    9.     import flash.events.Event;
    10.     import flash.events.MouseEvent;
    11.     import flash.geom.ColorTransform;
    12.     import flash.geom.Matrix;
    13.     import flash.geom.Rectangle;
    14.     import flash.text.TextField;
    15.     import flash.text.TextFieldAutoSize;
    16.     import net.hires.debug.Stats;
    17.    
    18.     [SWF(width = "465", height = "465", frameRate = "30")]
    19.     public class BlockBreaker extends Sprite
    20.     {
    21.         private static const HEIGHT:Number = 465;
    22.         private static const WIDTH:Number = 465;
    23.         private var _canvas:BitmapData;
    24.         private var _blocks:Blocks;
    25.         private var _fallBlocks:Vector.<Particle>;
    26.         private var _balls:Vector.<Particle>;
    27.         private var _bar:Bitmap;
    28.         
    29.         public function BlockBreaker()
    30.         {
    31.             _canvas = new BitmapData(WIDTH, HEIGHT,false,0x000000);
    32.             addChild(new Bitmap(_canvas));
    33.             
    34.             _blocks = new Blocks(WIDTH, 100);
    35.             
    36.             _fallBlocks = new Vector.<Particle>();
    37.             
    38.             var b:BitmapData = new BitmapData(50, 10, false, 0x00FF00);
    39.             addChild(_bar = new Bitmap(b));
    40.             _bar.y = WIDTH -b.width;
    41.             var _ball:Particle = new Particle(WIDTH / 2, HEIGHT / 2);
    42.             _ball.vx = Math.random() *10;
    43.             _ball.vy = -Math.random() *9 -1;
    44.             _ball.color = 0xFFFFFF;
    45.             
    46.             _balls = new Vector.<Particle>();
    47.             _balls.push(_ball);
    48.             
    49.             //var stats:Stats = new Stats();
    50.             //stats.y = 200;
    51.             //addChild(stats);
    52.             
    53.             addEventListener(Event.ENTER_FRAME, update);
    54.         }
    55.         private function update(e:Event):void
    56.         {
    57.             _canvas.lock();
    58.             _canvas.colorTransform(_canvas.rect, new ColorTransform (0.9, 0.5, 0.9));
    59.             
    60.             for each(var block:Particle in _blocks.values)
    61.             {
    62.                 if (block)
    63.                 {
    64.                     _canvas.setPixel(block.x, block.y, block.color);
    65.                 }
    66.             }
    67.             var removeBalls:Vector.<Particle> = new Vector.<Particle>();
    68.              for each(var ball:Particle in _balls)
    69.              {
    70.                 var bvx:Number = ball.vx;
    71.                 var bvy:Number = ball.vy;
    72.                 var bspeed:Number = Math.sqrt(bvx * bvx + bvy * bvy);
    73.                 var bradius:Number = Math.atan2(bvy, bvx);
    74.                 for (var i:int = 0; i < bspeed;i++)
    75.                 {
    76.                     ball.x += ball.vx/bspeed;
    77.                     ball.y += ball.vy/bspeed;
    78.                     var hitParticle:Particle = _blocks.getParticle(ball.x, ball.y);
    79.                     if(hitParticle)
    80.                     {
    81.                         var removedP:Particle = _blocks.removeParticle(ball.x, ball.y);
    82.                         removedP.vx = Math.cos(bradius+Math.PI*2/(30*Math.random())-15)*3;
    83.                         removedP.vy = 1;
    84.                         removedP.color = hitParticle.color;
    85.                         _fallBlocks.push(removedP);
    86.                         ball.vy = -ball.vy;
    87.                     }
    88.                     
    89.                     if ((ball.x < 0 && ball.vx < 0) || (ball.x > WIDTH && ball.vx > 0))
    90.                     {
    91.                         ball.vx = -ball.vx;
    92.                     }
    93.                     if (ball.y < 0 && ball.vy < 0)
    94.                     {
    95.                         ball.vy = -ball.vy;
    96.                     }
    97.                     if (ball.y > HEIGHT)
    98.                     {
    99.                         removeBalls.push(ball);
    100.                     }
    101.                     if (_bar.hitTestPoint(ball.x, ball.y))
    102.                     {
    103.                         ball.vy = -Math.abs(ball.vy);
    104.                     }
    105.                     _canvas.setPixel(ball.x, ball.y, ball.color);
    106.                 }
    107.             }
    108.             removeBalls.forEach(function(b:Particle, ...args):void {
    109.                 var index:int = _balls.indexOf(b);
    110.                 if (index != -1)
    111.                 {
    112.                     _balls.splice(index, 1);
    113.                 }
    114.             });
    115.             
    116.             var removeFallBs:Vector.<Particle> = new Vector.<Particle>();
    117.             _fallBlocks.forEach(function(fallP:Particle, ...args):void {
    118.                 fallP.vy += 0.1;
    119.                 fallP.x += fallP.vx;
    120.                 fallP.y += fallP.vy;
    121.                 _canvas.setPixel(fallP.x, fallP.y, fallP.color);
    122.                 if (_bar.hitTestPoint(fallP.x,fallP.y))
    123.                 {
    124.                     var newball:Particle = new Particle(fallP.x,fallP.y);
    125.                     newball.vx = Math.random() * 10;
    126.                     newball.vy = Math.random() * 9 + 1;
    127.                     newball.color = fallP.color;
    128.                     _balls.push(newball);
    129.                     removeFallBs.push(fallP);
    130.                 }else if (fallP.y > HEIGHT)
    131.                 {
    132.                     removeFallBs.push(fallP);
    133.                 }
    134.             });
    135.             
    136.             removeFallBs.forEach(function(b:Particle,...args):void{
    137.                 var index:int = _fallBlocks.indexOf(b);
    138.                 if (index != -1)
    139.                 {
    140.                     _fallBlocks.splice(index, 1);
    141.                 }
    142.             });
    143.             _bar.x = stage.mouseX;
    144.             _canvas.unlock();
    145.             
    146.             if (_blocks.count == 0)
    147.             {
    148.                 removeEventListener(Event.ENTER_FRAME, update);
    149.                 var clearTF:TextField = new TextField();
    150.                 clearTF.text = "CLEAR!\nおめでと";
    151.                 clearTF.textColor = 0xFFFFFF;
    152.                 clearTF.autoSize = TextFieldAutoSize.LEFT;
    153.                 _canvas.draw(clearTF,new Matrix(5,0,0,5,WIDTH/2-clearTF.width*5/2,HEIGHT/2-clearTF.height*5/2));
    154.             }
    155.             
    156.         }
    157.     }
    158. }
    159. import frocessing.color.ColorHSV;
    160. class Blocks
    161. {
    162.     public function get count():int { return _count;}
    163.     private var _count:int;
    164.     public function get width():Number { return _width; }
    165.     private var _width:Number;
    166.     public function get height():Number { return _height; }
    167.     private var _height:Number;
    168.     public var values:Vector.<Particle>;
    169.     function Blocks(width:Number,height:Number)
    170.     {
    171.         _width = width;
    172.         _height = height;
    173.         _count = width * height;
    174.         values = new Vector.<Particle>(width * height, false);
    175.         var c:ColorHSV = new ColorHSV();
    176.         for (var i:int = 0; i < _width; i++)
    177.         {
    178.             c.h = 360 * i / _width;
    179.             for (var j:int = 0 ; j < _height; j++ )
    180.             {
    181.                 var p:Particle = new Particle(i, j);
    182.                 p.color = c.value;
    183.                 values[i + j * _width] = p;
    184.             }
    185.         }
    186.     }
    187.     public function getParticle(x:int, y:int):Particle
    188.     {
    189.         var index:int = x + y * _width;
    190.         if (index >= values.length || index < 0)
    191.         {
    192.             return null;
    193.         }
    194.         return values[x + y * _width];
    195.     }
    196.     public function removeParticle(x:int, y:int):Particle
    197.     {
    198.         var p:Particle = values[x + y * _width];
    199.         if (p)
    200.         {
    201.             _count--;
    202.             values[x + y * _width] = undefined;
    203.         }
    204.         return p;
    205.     }
    206. }
    207. class Particle
    208. {
    209.     public var x:Number;
    210.     public var y:Number;
    211.     public var vx:Number = 0;
    212.     public var vy:Number = 0;
    213.     public var color:uint;
    214.     public function Particle(x:Number=0,y:Number=0 )
    215.     {
    216.         this.x = x;
    217.         this.y = y;
    218.     }
    219. }
    复制代码






    本文来自:http://wonderfl.net/c/tNGi

    本帖子中包含更多资源

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

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

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

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-8-25 18:18 , Processed in 0.044118 second(s), 38 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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