forked from: 重力マウス(さらに軽量化してみた)
forked from 重力マウス(さらに軽量化してみた) (diff: 177)
リンクリストにしてみたけどそんなに速くない?? _bmd.fillRect()を_bmd.setPixel()に変更。 sin(),cos(),atan2(),sqrt()を排除。
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;
}
}
