守望者--AIR技术交流

标题: 粒子特效 [打印本页]

作者: 破晓    时间: 2015-7-15 14:48
标题: 粒子特效


http://swf.wonderfl.net/swf/usercode/3/30/30f6/30f64a32af82b0e351be56946125de0b1b2846ea.swf?t=1436942700598

  1. package
  2. {
  3.     import com.actionsnippet.qbox.QuickBox2D;
  4.     import com.actionsnippet.qbox.QuickObject;
  5.     import flash.display.Bitmap;
  6.     import flash.display.BitmapData;
  7.     import flash.display.BlendMode;
  8.     import flash.display.MovieClip;
  9.     import flash.display.Sprite;
  10.     import flash.events.Event;
  11.     import flash.filters.BlurFilter;
  12.     import flash.geom.Matrix;
  13.     import flash.geom.Point;
  14.     import frocessing.color.ColorHSV;
  15.     import idv.cjcat.stardust.common.clocks.SteadyClock;
  16.     import idv.cjcat.stardust.twoD.actions.waypoints.Waypoint;
  17.     import idv.cjcat.stardust.twoD.renderers.PixelRenderer;
  18.     import idv.cjcat.stardust.twoD.zones.CircleZone;
  19.     import net.hires.debug.Stats;
  20.    
  21.     /**
  22.      * Waypointのテスト
  23.      * @author paq89
  24.      */
  25.     [SWF(width=465, height=465, backgroundColor=0x000000, frameRate=60)]
  26.     public class Main extends Sprite
  27.     {
  28.         static private const ZERO_POINT:Point = new Point();
  29.         static private const BLUR:BlurFilter = new BlurFilter();
  30.         static private const WAYPOINT_COUNT:uint = 7;
  31.         private var _emitter:WaypointsEmitter;
  32.         private var _waypoints:/*Waypoint*/Array;
  33.         private var _circles:/*QuickObject*/Array;
  34.         private var _canvas:BitmapData;
  35.         private var _blurEffect:BitmapData;
  36.         private var _hsv:ColorHSV;
  37.         private var _matrix:Matrix;
  38.         private var _kirakira:BitmapData;
  39.         
  40.         public function Main():void
  41.         {
  42.             if (stage) init();
  43.             else addEventListener(Event.ADDED_TO_STAGE, init);
  44.         }
  45.         
  46.         private function init(e:Event = null):void
  47.         {
  48.             removeEventListener(Event.ADDED_TO_STAGE, init);
  49.             
  50.             // 変数を初期化
  51.             _hsv = new ColorHSV(0, 0.7);
  52.             _waypoints = []
  53.             _circles = [];
  54.             
  55.             // 背景
  56.             graphics.beginFill(0x000000); graphics.drawRect(0, 0, 465, 465);
  57.             
  58.             // パーティクルを表示するビットマップを作成
  59.             _canvas = new BitmapData(465, 465, true, 0x00000000);
  60.             _blurEffect = new BitmapData(465, 465, true, 0x00000000);
  61.             addChild(Bitmap(new Bitmap(_blurEffect)));
  62.             addChild(Bitmap(new Bitmap(_canvas)));
  63.             
  64.             // QuickBox2D
  65.             initQuickBox2D();
  66.             
  67.             // Stardust
  68.             initStardust();
  69.             
  70.             // キラキラエフェクト
  71.             _kirakira = new BitmapData(465 / 4, 465 / 4, false, 0x000000);
  72.             var bmp:Bitmap = new Bitmap(_kirakira, "never", true);
  73.             bmp.scaleX = bmp.scaleY = 4;
  74.             bmp.smoothing = true;
  75.             bmp.blendMode = BlendMode.ADD;
  76.             addChild(bmp);
  77.             _matrix = new Matrix(0.25, 0, 0, 0.25);
  78.             
  79.             // イベントリスナー
  80.             addEventListener(Event.ENTER_FRAME, loop);
  81.         }
  82.         
  83.         /*
  84.          * Stardust
  85.          */
  86.         private function initStardust():void
  87.         {
  88.             // パーティクルシステムの構築
  89.             _emitter = new WaypointsEmitter(new SteadyClock(0.7), _waypoints);
  90.             var renderer:PixelRenderer = new PixelRenderer(_canvas);
  91.             renderer.addEmitter(_emitter);
  92.         }
  93.         
  94.         /*
  95.          * QuickBox2D
  96.          */
  97.         private function initQuickBox2D():void
  98.         {
  99.             var mc:MovieClip = MovieClip(addChildAt(new MovieClip, 1));
  100.             mc.buttonMode = true;
  101.             var qbox:QuickBox2D = new QuickBox2D(mc, { gravityY:0 } );
  102.             qbox.setDefault( { lineColor:0xFFFFFF, fillAlpha:0 } );
  103.             qbox.addBox( { x:-1.5, y:7.75, width:3, height: 15.5, density:0} );
  104.             qbox.addBox( { x:17, y:7.75, width:3, height: 15.5, density:0 } );
  105.             qbox.addBox( { x:7.75, y:-1.5, width:15.5, height: 3, density:0 } );
  106.             qbox.addBox( { x:7.75, y:17, width:15.5, height: 3, density:0 } );
  107.             qbox.start();
  108.             qbox.mouseDrag();
  109.             
  110.             var hsv:ColorHSV = new ColorHSV(0, 0.7, 1);
  111.             for (var i:int = 0; i < WAYPOINT_COUNT; i++)
  112.             {
  113.                 hsv.h = i * (360 / WAYPOINT_COUNT);
  114.                 var x:int = (Math.random() * 465) >> 0;
  115.                 var y:int = (Math.random() * 465) >> 0;
  116.                 var circle:QuickObject = qbox.addCircle( { x:x / 30, y:y / 30, radius:10 / 30, restitution:0.5, lineColor:hsv.value } );
  117.                 _circles.push(circle);
  118.                 _waypoints.push(new Waypoint(circle.x*30, circle.y*30));
  119.             }
  120.         }
  121.         
  122.         /*
  123.          * エンターフレームイベント
  124.          */
  125.         private function loop(e:Event):void
  126.         {
  127.             // Waypointの位置を調整
  128.             for (var i:int = 0; i < WAYPOINT_COUNT; i++)
  129.             {
  130.                 _waypoints[i].x = _circles[i].x * 30;
  131.                 _waypoints[i].y = _circles[i].y * 30;
  132.             }
  133.             
  134.             CircleZone(_emitter.position.zone).x = _waypoints[0].x;
  135.             CircleZone(_emitter.position.zone).y = _waypoints[0].y;
  136.             CircleZone(_emitter.deathZone.zone).x = _waypoints[WAYPOINT_COUNT-1].x;
  137.             CircleZone(_emitter.deathZone.zone).y = _waypoints[WAYPOINT_COUNT-1].y;
  138.             
  139.             // キラキラエフェクト
  140.             _kirakira.fillRect(_kirakira.rect, 0x00000000);
  141.             _kirakira.draw(_canvas, _matrix);
  142.             
  143.             // 残像エフェクト
  144.             _blurEffect.draw(_canvas);
  145.             _blurEffect.applyFilter(_blurEffect, _canvas.rect, ZERO_POINT, BLUR);
  146.             _canvas.fillRect(_canvas.rect, 0x00000000);
  147.             
  148.             // パーティクルの色相を変更
  149.             _hsv.h++;
  150.             _emitter.color.color = _hsv.value32;
  151.             
  152.             // エミッターを更新
  153.             _emitter.step();
  154.         }
  155.         
  156.     }
  157.    
  158. }
  159. import idv.cjcat.stardust.common.clocks.Clock;
  160. import idv.cjcat.stardust.common.initializers.Color;
  161. import idv.cjcat.stardust.common.initializers.Mass;
  162. import idv.cjcat.stardust.common.math.UniformRandom;
  163. import idv.cjcat.stardust.twoD.actions.DeathZone;
  164. import idv.cjcat.stardust.twoD.actions.FollowWaypoints;
  165. import idv.cjcat.stardust.twoD.actions.Move;
  166. import idv.cjcat.stardust.twoD.actions.SpeedLimit;
  167. import idv.cjcat.stardust.twoD.emitters.Emitter2D;
  168. import idv.cjcat.stardust.twoD.initializers.Position;
  169. import idv.cjcat.stardust.twoD.zones.CircleZone;

  170. class WaypointsEmitter extends Emitter2D
  171. {
  172.     public var color:Color;
  173.     public var deathZone:DeathZone;
  174.     public var position:Position;
  175.    
  176.     public function WaypointsEmitter(clock:Clock, waypoints:Array)
  177.     {
  178.         super(clock);
  179.         
  180.         color = new Color();
  181.         position = new Position(new CircleZone(0, 0, 20));
  182.         deathZone = new DeathZone(new CircleZone(0, 0, 20));
  183.         
  184.         addInitializer(color);
  185.         addInitializer(position);
  186.         addInitializer(new Mass(new UniformRandom(4, 1)));
  187.         
  188.         addAction(deathZone);
  189.         addAction(new FollowWaypoints(waypoints, false, false));
  190.         addAction(new Move());
  191.         addAction(new SpeedLimit(3));
  192.     }
  193. }
复制代码



[attach]1224[/attach]

本文来自:http://wonderfl.net/c/6Z8A

作者: lxz    时间: 2019-2-24 02:32
感谢分享!~




欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/)