forked from: 重力マウス(さらに軽量化してみた)

by kacchan6 forked from 重力マウス(さらに軽量化してみた) (diff: 177)
リンクリストにしてみたけどそんなに速くない??
_bmd.fillRect()を_bmd.setPixel()に変更。
sin(),cos(),atan2(),sqrt()を排除。
♥0 | Line 152 | Modified 2011-01-14 16:56:00 | MIT License
play

ActionScript3 source code

/**
 * Copyright kacchan6 ( http://wonderfl.net/user/kacchan6 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1k0u
 */

// forked from paq's forked from: 重力マウス(ちょっぴり軽量化してみた)
// forked from fumix's 重力マウス(リンクリストにしてみた)
// forked from undo's 重力マウス
// リンクリストにしてみたけどそんなに速くない??
//_bmd.fillRect()を_bmd.setPixel()に変更。
//sin(),cos(),atan2(),sqrt()を排除。
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.ColorTransform;

    import net.hires.debug.Stats;
    [SWF(frameRate='60', backgroundColor='0x0')]
    public class ParticleTest1 extends Sprite
    {

        private static const COUNT:int = 1000000;

        private var _bitmap:BitmapData;

        private var _colorTransform:ColorTransform;

        private var _count:uint;

        private var _tail:Node;

        public function ParticleTest1()
        {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _colorTransform = new ColorTransform(0.9, 0.0, 0.9, 1.0);
            _bitmap = new BitmapData(465, 465, false, 0);
            addChild(new Bitmap(_bitmap));

            var old:Node;
            for (var i:int = 0; i < COUNT; i++)
            {
                _tail = new Node(_tail);
            }

            addChild(new Stats());
            addEventListener(Event.ENTER_FRAME, onEnter);
        }

        private function onEnter(evt:Event):void
        {
            const gx:Number = mouseX;
            const gy:Number = mouseY;
            const bitmap:BitmapData = _bitmap;

            var n:Node = _tail;
            var count:uint = (COUNT + 7) / 8;
            var a:Number;
            var dx:Number;
            var dy:Number;

            bitmap.lock();

            if (++_count % 4)
            {
                while (--count > -1)
                {
                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    bitmap.setPixel(n.px += n.vx, n.py += n.vy, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;
                }
            }
            else
            {
                while (--count > -1)
                {
                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;

                    a = 50 / ((dx = gx - n.px) * dx + (dy = gy - n.py) * dy);
                    bitmap.setPixel((n.px += (n.vx += a * dx)) > 464 ? (n.px = 0) : n.px < 0 ? (n.px = 464) : n.px, (n.py += (n.vy += a * dy)) > 464 ? (n.py = 0) : n.py < 0 ? (n.py = 464) : n.py, 0xffffff);
                    n.vx *= 0.96;
                    n.vy *= 0.96;
                    n = n.prev;
                }
            }

            bitmap.colorTransform(_bitmap.rect, _colorTransform);
            bitmap.unlock();
        }
    }
}

class Node
{

    public var prev:Node;

    public var px:int = 0;

    public var py:int = 0;

    public var vx:Number = 0;

    public var vy:Number = 0;

    public function Node(node:Node)
    {
        prev = node === null ? this : node;
        px = Math.random() * 465;
        py = Math.random() * 465;
    }
}