破晓 发表于 2015-7-15 14:48:30

粒子特效



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

package
{
    import com.actionsnippet.qbox.QuickBox2D;
    import com.actionsnippet.qbox.QuickObject;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import frocessing.color.ColorHSV;
    import idv.cjcat.stardust.common.clocks.SteadyClock;
    import idv.cjcat.stardust.twoD.actions.waypoints.Waypoint;
    import idv.cjcat.stardust.twoD.renderers.PixelRenderer;
    import idv.cjcat.stardust.twoD.zones.CircleZone;
    import net.hires.debug.Stats;
   
    /**
   * Waypointのテスト
   * @author paq89
   */
   
    public class Main extends Sprite
    {
      static private const ZERO_POINT:Point = new Point();
      static private const BLUR:BlurFilter = new BlurFilter();
      static private const WAYPOINT_COUNT:uint = 7;
      private var _emitter:WaypointsEmitter;
      private var _waypoints:/*Waypoint*/Array;
      private var _circles:/*QuickObject*/Array;
      private var _canvas:BitmapData;
      private var _blurEffect:BitmapData;
      private var _hsv:ColorHSV;
      private var _matrix:Matrix;
      private var _kirakira:BitmapData;
      
      public function Main():void
      {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
      }
      
      private function init(e:Event = null):void
      {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            // 変数を初期化
            _hsv = new ColorHSV(0, 0.7);
            _waypoints = []
            _circles = [];
            
            // 背景
            graphics.beginFill(0x000000); graphics.drawRect(0, 0, 465, 465);
            
            // パーティクルを表示するビットマップを作成
            _canvas = new BitmapData(465, 465, true, 0x00000000);
            _blurEffect = new BitmapData(465, 465, true, 0x00000000);
            addChild(Bitmap(new Bitmap(_blurEffect)));
            addChild(Bitmap(new Bitmap(_canvas)));
            
            // QuickBox2D
            initQuickBox2D();
            
            // Stardust
            initStardust();
            
            // キラキラエフェクト
            _kirakira = new BitmapData(465 / 4, 465 / 4, false, 0x000000);
            var bmp:Bitmap = new Bitmap(_kirakira, "never", true);
            bmp.scaleX = bmp.scaleY = 4;
            bmp.smoothing = true;
            bmp.blendMode = BlendMode.ADD;
            addChild(bmp);
            _matrix = new Matrix(0.25, 0, 0, 0.25);
            
            // イベントリスナー
            addEventListener(Event.ENTER_FRAME, loop);
      }
      
      /*
         * Stardust
         */
      private function initStardust():void
      {
            // パーティクルシステムの構築
            _emitter = new WaypointsEmitter(new SteadyClock(0.7), _waypoints);
            var renderer:PixelRenderer = new PixelRenderer(_canvas);
            renderer.addEmitter(_emitter);
      }
      
      /*
         * QuickBox2D
         */
      private function initQuickBox2D():void
      {
            var mc:MovieClip = MovieClip(addChildAt(new MovieClip, 1));
            mc.buttonMode = true;
            var qbox:QuickBox2D = new QuickBox2D(mc, { gravityY:0 } );
            qbox.setDefault( { lineColor:0xFFFFFF, fillAlpha:0 } );
            qbox.addBox( { x:-1.5, y:7.75, width:3, height: 15.5, density:0} );
            qbox.addBox( { x:17, y:7.75, width:3, height: 15.5, density:0 } );
            qbox.addBox( { x:7.75, y:-1.5, width:15.5, height: 3, density:0 } );
            qbox.addBox( { x:7.75, y:17, width:15.5, height: 3, density:0 } );
            qbox.start();
            qbox.mouseDrag();
            
            var hsv:ColorHSV = new ColorHSV(0, 0.7, 1);
            for (var i:int = 0; i < WAYPOINT_COUNT; i++)
            {
                hsv.h = i * (360 / WAYPOINT_COUNT);
                var x:int = (Math.random() * 465) >> 0;
                var y:int = (Math.random() * 465) >> 0;
                var circle:QuickObject = qbox.addCircle( { x:x / 30, y:y / 30, radius:10 / 30, restitution:0.5, lineColor:hsv.value } );
                _circles.push(circle);
                _waypoints.push(new Waypoint(circle.x*30, circle.y*30));
            }
      }
      
      /*
         * エンターフレームイベント
         */
      private function loop(e:Event):void
      {
            // Waypointの位置を調整
            for (var i:int = 0; i < WAYPOINT_COUNT; i++)
            {
                _waypoints.x = _circles.x * 30;
                _waypoints.y = _circles.y * 30;
            }
            
            CircleZone(_emitter.position.zone).x = _waypoints.x;
            CircleZone(_emitter.position.zone).y = _waypoints.y;
            CircleZone(_emitter.deathZone.zone).x = _waypoints.x;
            CircleZone(_emitter.deathZone.zone).y = _waypoints.y;
            
            // キラキラエフェクト
            _kirakira.fillRect(_kirakira.rect, 0x00000000);
            _kirakira.draw(_canvas, _matrix);
            
            // 残像エフェクト
            _blurEffect.draw(_canvas);
            _blurEffect.applyFilter(_blurEffect, _canvas.rect, ZERO_POINT, BLUR);
            _canvas.fillRect(_canvas.rect, 0x00000000);
            
            // パーティクルの色相を変更
            _hsv.h++;
            _emitter.color.color = _hsv.value32;
            
            // エミッターを更新
            _emitter.step();
      }
      
    }
   
}
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.initializers.Color;
import idv.cjcat.stardust.common.initializers.Mass;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.twoD.actions.DeathZone;
import idv.cjcat.stardust.twoD.actions.FollowWaypoints;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.actions.SpeedLimit;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.initializers.Position;
import idv.cjcat.stardust.twoD.zones.CircleZone;

class WaypointsEmitter extends Emitter2D
{
    public var color:Color;
    public var deathZone:DeathZone;
    public var position:Position;
   
    public function WaypointsEmitter(clock:Clock, waypoints:Array)
    {
      super(clock);
      
      color = new Color();
      position = new Position(new CircleZone(0, 0, 20));
      deathZone = new DeathZone(new CircleZone(0, 0, 20));
      
      addInitializer(color);
      addInitializer(position);
      addInitializer(new Mass(new UniformRandom(4, 1)));
      
      addAction(deathZone);
      addAction(new FollowWaypoints(waypoints, false, false));
      addAction(new Move());
      addAction(new SpeedLimit(3));
    }
}




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

lxz 发表于 2019-2-24 02:32:10

感谢分享!~
页: [1]
查看完整版本: 粒子特效