100k particles THE BUBBLE
いろんな人のコードを参考にさせていただきました. 「重力マウス」の系統です.
forkしにくいコードになってしまいましたが, FlashDevelopのCtrl+Q(コメント切り替え)とCtrl+H(置換)で"Look in:"->"Code and strings"を使えばなんとか.
/**
* Copyright matacat ( http://wonderfl.net/user/matacat )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/r3mz
*/
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.ColorTransform;
[SWF(width = 465, height = 465, frameRate = 60)]
public class ParticleFesta extends Sprite
{
private const TOTAL:int = 100000;
private const PPN:int = 10;
private const TN:int = TOTAL / PPN >> 0;
private var head:Node;
private var screen:BitmapData = new BitmapData(465, 465, false, 0x000000);
private var buffer:BitmapData = screen.clone();
private var blur:BlurFilter = new BlurFilter();
private var ct:ColorTransform = new ColorTransform(3/4, 3/4, 3/4);
public function ParticleFesta()
{
stage.quality = "low";
stage.scaleMode = "noScale";
stage.mouseChildren = false;
stage.tabChildren = false;
addChild(new Bitmap(screen, "never"));
var n:Node = new Node(null);
for (var i:int = 1; i < TN; i++) n = new Node(n);
head = n;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
buffer.applyFilter(screen, screen.rect, buffer.rect.topLeft, blur);
buffer.colorTransform(buffer.rect, ct);
var n:Node = head;
var gx:Number = stage.mouseX;
var gy:Number = stage.mouseY;
var dx:Number, dy:Number, d:Number, c:uint;
do {
//dx = gx - n.r#x;
//dy = gy - n.r#y;
//d = 5.# / (dx * dx + dy * dy + 1);
//n.r#x += n.v#x += dx * d;
//n.r#y += n.v#y += dy * d;
//if (n.r#x < 0) { n.r#x = 0; n.v#x = 0; }
//else if (n.r#x >= 465) { n.r#x = 464.99; n.v#x = 0; }
//if (n.r#y < 0) { n.r#y = 0; n.v#y = 0; }
//else if (n.r#y >= 465) { n.r#y = 464.99; n.v#y = 0; }
//c = buffer.getPixel(n.r#x >> 0, n.r#y >> 0);
// buffer.setPixel(n.r#x >> 0, n.r#y >> 0,
// ((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
// ((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
// ((c & 0xFF) * 3 + 0xFF >> 2)
//);
dx = gx - n.r1x;
dy = gy - n.r1y;
d = 5.1 / (dx * dx + dy * dy + 1);
n.r1x += n.v1x += dx * d;
n.r1y += n.v1y += dy * d;
if (n.r1x < 0) { n.r1x = 0; n.v1x = 0; }
else if (n.r1x >= 465) { n.r1x = 464.99; n.v1x = 0; }
if (n.r1y < 0) { n.r1y = 0; n.v1y = 0; }
else if (n.r1y >= 465) { n.r1y = 464.99; n.v1y = 0; }
c = buffer.getPixel(n.r1x >> 0, n.r1y >> 0);
buffer.setPixel(n.r1x >> 0, n.r1y >> 0,
((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
((c >> 8 & 0xFF) * 3 >> 2) << 8 |
((c & 0xFF) * 3 + 0xFF >> 2)
);
dx = gx - n.r2x;
dy = gy - n.r2y;
d = 5.2 / (dx * dx + dy * dy + 1);
n.r2x += n.v2x += dx * d;
n.r2y += n.v2y += dy * d;
if (n.r2x < 0) { n.r2x = 0; n.v2x = 0; }
else if (n.r2x >= 465) { n.r2x = 464.99; n.v2x = 0; }
if (n.r2y < 0) { n.r2y = 0; n.v2y = 0; }
else if (n.r2y >= 465) { n.r2y = 464.99; n.v2y = 0; }
c = buffer.getPixel(n.r2x >> 0, n.r2y >> 0);
buffer.setPixel(n.r2x >> 0, n.r2y >> 0,
((c >> 16 ) * 3 + 0x55 >> 2) << 16 |
((c >> 8 & 0xFF) * 3 >> 2) << 8 |
((c & 0xFF) * 3 + 0xFF >> 2)
);
dx = gx - n.r3x;
dy = gy - n.r3y;
d = 5.3 / (dx * dx + dy * dy + 1);
n.r3x += n.v3x += dx * d;
n.r3y += n.v3y += dy * d;
if (n.r3x < 0) { n.r3x = 0; n.v3x = 0; }
else if (n.r3x >= 465) { n.r3x = 464.99; n.v3x = 0; }
if (n.r3y < 0) { n.r3y = 0; n.v3y = 0; }
else if (n.r3y >= 465) { n.r3y = 464.99; n.v3y = 0; }
c = buffer.getPixel(n.r3x >> 0, n.r3y >> 0);
buffer.setPixel(n.r3x >> 0, n.r3y >> 0,
((c >> 16 ) * 3 >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0x55 >> 2) << 8 |
((c & 0xFF) * 3 + 0xFF >> 2)
);
dx = gx - n.r4x;
dy = gy - n.r4y;
d = 5.4 / (dx * dx + dy * dy + 1);
n.r4x += n.v4x += dx * d;
n.r4y += n.v4y += dy * d;
if (n.r4x < 0) { n.r4x = 0; n.v4x = 0; }
else if (n.r4x >= 465) { n.r4x = 464.99; n.v4x = 0; }
if (n.r4y < 0) { n.r4y = 0; n.v4y = 0; }
else if (n.r4y >= 465) { n.r4y = 464.99; n.v4y = 0; }
c = buffer.getPixel(n.r4x >> 0, n.r4y >> 0);
buffer.setPixel(n.r4x >> 0, n.r4y >> 0,
((c >> 16 ) * 3 >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
((c & 0xFF) * 3 + 0xFF >> 2)
);
dx = gx - n.r5x;
dy = gy - n.r5y;
d = 5.5 / (dx * dx + dy * dy + 1);
n.r5x += n.v5x += dx * d;
n.r5y += n.v5y += dy * d;
if (n.r5x < 0) { n.r5x = 0; n.v5x = 0; }
else if (n.r5x >= 465) { n.r5x = 464.99; n.v5x = 0; }
if (n.r5y < 0) { n.r5y = 0; n.v5y = 0; }
else if (n.r5y >= 465) { n.r5y = 464.99; n.v5y = 0; }
c = buffer.getPixel(n.r5x >> 0, n.r5y >> 0);
buffer.setPixel(n.r5x >> 0, n.r5y >> 0,
((c >> 16 ) * 3 >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
((c & 0xFF) * 3 + 0x55 >> 2)
);
dx = gx - n.r6x;
dy = gy - n.r6y;
d = 5.6 / (dx * dx + dy * dy + 1);
n.r6x += n.v6x += dx * d;
n.r6y += n.v6y += dy * d;
if (n.r6x < 0) { n.r6x = 0; n.v6x = 0; }
else if (n.r6x >= 465) { n.r6x = 464.99; n.v6x = 0; }
if (n.r6y < 0) { n.r6y = 0; n.v6y = 0; }
else if (n.r6y >= 465) { n.r6y = 464.99; n.v6y = 0; }
c = buffer.getPixel(n.r6x >> 0, n.r6y >> 0);
buffer.setPixel(n.r6x >> 0, n.r6y >> 0,
((c >> 16 ) * 3 + 0x55 >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
((c & 0xFF) * 3 >> 2)
);
dx = gx - n.r7x;
dy = gy - n.r7y;
d = 5.7 / (dx * dx + dy * dy + 1);
n.r7x += n.v7x += dx * d;
n.r7y += n.v7y += dy * d;
if (n.r7x < 0) { n.r7x = 0; n.v7x = 0; }
else if (n.r7x >= 465) { n.r7x = 464.99; n.v7x = 0; }
if (n.r7y < 0) { n.r7y = 0; n.v7y = 0; }
else if (n.r7y >= 465) { n.r7y = 464.99; n.v7y = 0; }
c = buffer.getPixel(n.r7x >> 0, n.r7y >> 0);
buffer.setPixel(n.r7x >> 0, n.r7y >> 0,
((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
((c & 0xFF) * 3 >> 2)
);
dx = gx - n.r8x;
dy = gy - n.r8y;
d = 5.8 / (dx * dx + dy * dy + 1);
n.r8x += n.v8x += dx * d;
n.r8y += n.v8y += dy * d;
if (n.r8x < 0) { n.r8x = 0; n.v8x = 0; }
else if (n.r8x >= 465) { n.r8x = 464.99; n.v8x = 0; }
if (n.r8y < 0) { n.r8y = 0; n.v8y = 0; }
else if (n.r8y >= 465) { n.r8y = 464.99; n.v8y = 0; }
c = buffer.getPixel(n.r8x >> 0, n.r8y >> 0);
buffer.setPixel(n.r8x >> 0, n.r8y >> 0,
((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0x55 >> 2) << 8 |
((c & 0xFF) * 3 >> 2)
);
dx = gx - n.r9x;
dy = gy - n.r9y;
d = 5.9 / (dx * dx + dy * dy + 1);
n.r9x += n.v9x += dx * d;
n.r9y += n.v9y += dy * d;
if (n.r9x < 0) { n.r9x = 0; n.v9x = 0; }
else if (n.r9x >= 465) { n.r9x = 464.99; n.v9x = 0; }
if (n.r9y < 0) { n.r9y = 0; n.v9y = 0; }
else if (n.r9y >= 465) { n.r9y = 464.99; n.v9y = 0; }
c = buffer.getPixel(n.r9x >> 0, n.r9y >> 0);
buffer.setPixel(n.r9x >> 0, n.r9y >> 0,
((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
((c >> 8 & 0xFF) * 3 >> 2) << 8 |
((c & 0xFF) * 3 + 0x55 >> 2)
);
dx = gx - n.r0x;
dy = gy - n.r0y;
d = 5.0 / (dx * dx + dy * dy + 1);
n.r0x += n.v0x += dx * d;
n.r0y += n.v0y += dy * d;
if (n.r0x < 0) { n.r0x = 0; n.v0x = 0; }
else if (n.r0x >= 465) { n.r0x = 464.99; n.v0x = 0; }
if (n.r0y < 0) { n.r0y = 0; n.v0y = 0; }
else if (n.r0y >= 465) { n.r0y = 464.99; n.v0y = 0; }
c = buffer.getPixel(n.r0x >> 0, n.r0y >> 0);
buffer.setPixel(n.r0x >> 0, n.r0y >> 0,
((c >> 16 ) * 3 + 0xFF >> 2) << 16 |
((c >> 8 & 0xFF) * 3 + 0xFF >> 2) << 8 |
((c & 0xFF) * 3 + 0xFF >> 2)
);
} while (n = n.next);
screen.copyPixels(buffer, buffer.rect, screen.rect.topLeft);
}
}
}
class Node
{
//public var r#x:Number;
//public var r#y:Number;
//public var v#x:Number = 0;
//public var v#y:Number = 0;
public var r0x:Number;
public var r0y:Number;
public var v0x:Number = 0;
public var v0y:Number = 0;
public var r1x:Number;
public var r1y:Number;
public var v1x:Number = 0;
public var v1y:Number = 0;
public var r2x:Number;
public var r2y:Number;
public var v2x:Number = 0;
public var v2y:Number = 0;
public var r3x:Number;
public var r3y:Number;
public var v3x:Number = 0;
public var v3y:Number = 0;
public var r4x:Number;
public var r4y:Number;
public var v4x:Number = 0;
public var v4y:Number = 0;
public var r5x:Number;
public var r5y:Number;
public var v5x:Number = 0;
public var v5y:Number = 0;
public var r6x:Number;
public var r6y:Number;
public var v6x:Number = 0;
public var v6y:Number = 0;
public var r7x:Number;
public var r7y:Number;
public var v7x:Number = 0;
public var v7y:Number = 0;
public var r8x:Number;
public var r8y:Number;
public var v8x:Number = 0;
public var v8y:Number = 0;
public var r9x:Number;
public var r9y:Number;
public var v9x:Number = 0;
public var v9y:Number = 0;
public var next:Node;
public function Node(next:Node)
{
//r#x = Math.random() * 465;
//r#y = Math.random() * 465;
r0x = Math.random() * 465;
r0y = Math.random() * 465;
r1x = Math.random() * 465;
r1y = Math.random() * 465;
r2x = Math.random() * 465;
r2y = Math.random() * 465;
r3x = Math.random() * 465;
r3y = Math.random() * 465;
r4x = Math.random() * 465;
r4y = Math.random() * 465;
r5x = Math.random() * 465;
r5y = Math.random() * 465;
r6x = Math.random() * 465;
r6y = Math.random() * 465;
r7x = Math.random() * 465;
r7y = Math.random() * 465;
r8x = Math.random() * 465;
r8y = Math.random() * 465;
r9x = Math.random() * 465;
r9y = Math.random() * 465;
this.next = next;
}
}