forked from: Phys
forked from Phys (diff: 39)
... @author lizhi
ActionScript3 source code
/**
* Copyright owenray ( http://wonderfl.net/user/owenray )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/5w0P
*/
// forked from sliz's Phys
package
{
import flash.geom.Rectangle;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import net.hires.debug.Stats;
/**
* ...
* @author lizhi
*/
[SWF(width = 465, height = 465, backgroundColor = 0xffffff, frameRate = 60)]
public class Main extends Sprite
{
private var g:Point = new Point(0,.8);
private var b:Number = 1.5;
private var cf:Number = .1;
private var w:Number;
private var h:Number;
private var sb:Ball;
private var max:Number = 10;
private var numCols:int;
private var grid:Array;
private var bm:Bitmap = new Bitmap();
private var draw:Sprite = new Sprite();
private var bmd:BitmapData = new BitmapData(465, 465, false, 0),
theWaterColor:BitmapData = new BitmapData(465, 465, false);
public function Main():void
{
w = stage.stageWidth;
h = stage.stageHeight;
numCols = Math.ceil(h / max);
var c:int = 80;
var b:Ball;
while(c-->0){
var ball:Ball = new Ball();
if (sb) {
b.next = ball;
b = ball;
}else {
sb = b = ball;
}
ball.x = w * Math.random();
ball.y = h * Math.random();
ball.r = 10 + 10 * Math.random();
}
addChild(bm);
sb.r = 20;
addEventListener(Event.ENTER_FRAME, update);
addChild(new Stats());
}
private function update(e:Event):void
{
grid = [];
var b1:Ball = sb;
sb.x = mouseX;
sb.y = mouseY;
while (b1) {
var x:int = (b1.x + 0.5) / max;
var y:int = (b1.y + 0.5) / max;
var v:int = y * numCols + x;
if (grid[v]==null) {
grid[v] = [];
}
grid[v].push(b1);
b1.c = 0;
b1 = b1.next;
}
for (var k:int = grid.length - 1; k >= 0;k-- ) {
var balls:Array = grid[k];
if (balls) {
var arr2:Array = grid[k - 1];
if (arr2) {
balls = balls.concat(arr2);
}
arr2 = grid[k - numCols];
if (arr2) {
balls = balls.concat(arr2);
}
arr2 = grid[k - numCols - 1];
if (arr2) {
balls = balls.concat(arr2);
}
arr2 = grid[k - numCols + 1];
if (arr2) {
balls = balls.concat(arr2);
}
for (var i:int = 0; i < balls.length; i++ ) {
b1 = balls[i];
b1.fy += g.y;
if (b1.x - b1.r < 0) b1.fx += b;
if (b1.x + b1.r > w) b1.fx -= b;
if (b1.y - b1.r < 0) b1.fy += b;
if (b1.y + b1.r > h) b1.fy -= b;
for (var j:int = i + 1; j < balls.length; j++ ) {
var b2:Ball = balls[j];
var dx:Number = b1.x - b2.x;
var dy:Number = b1.y - b2.y;
var d:Number = b1.r + b2.r;
if (dx * dx + dy * dy < d * d ) {
b1.fx += dx *cf;
b1.fy += dy *cf;
b2.fx -= dx *cf;
b2.fy -= dy * cf;
b1.c = 0xff0000;
b2.c = 0xff0000;
}
}
}
}
}
draw.graphics.clear();
b1 = sb;
while (b1) {
b1.vx += b1.fx;
b1.vy += b1.fy;
b1.vx *= 0.95;
b1.vy *= 0.95;
b1.x += b1.vx;
b1.y += b1.vy;
b1.fx = 0;
b1.fy = 0;
//graphics.lineStyle(0,b1.c);
var m:Matrix = new Matrix();
var drawBigger:Number = 2;
m.createGradientBox(b1.r*2*drawBigger, b1.r*2*drawBigger, 0, b1.x-b1.r*drawBigger, b1.y-b1.r*drawBigger);
draw.graphics.beginGradientFill(GradientType.RADIAL, [0, 0], [1, 0], [0, 255], m);
draw.graphics.drawCircle(b1.x, b1.y, b1.r*drawBigger);
b1 = b1.next;
}
bmd.fillRect(new Rectangle(0, 0, 465, 465), 0xFFFFFF);
bmd.draw(draw);
theWaterColor.fillRect(new Rectangle(0, 0, 465, 465), 0x0000FF);
bm.bitmapData = theWaterColor;
//bmd.draw(draw);
//bm.bitmapData = bmd;
bm.bitmapData.threshold(bmd, new Rectangle(0, 0, 465, 465), new Point(0, 0), ">=", 0xbbbbbb, 0x00FFFFFF, 0x00FFFFFF, false);
//bm.smoothing =true;
}
}
}
class Ball {
public var next:Ball;
public var c:uint = 0;
public var x:Number = 0;
public var y:Number = 0;
public var r:Number = 10;
public var vx:Number = 0;
public var vy:Number = 0;
public var fx:Number = 0;
public var fy:Number = 0;
}