flash on 2012-11-24
♥0 |
Line 147 |
Modified 2012-12-06 02:36:20 |
MIT License
archived:2017-03-30 08:27:23
ActionScript3 source code
/**
* Copyright hemingway ( http://wonderfl.net/user/hemingway )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/c3Lv
*/
package
{
import flash.display.*;
import flash.events.*;
import flash.geom.*;
[SWF(frameRate = 60, width = 465, height = 465)]
public class Collision extends Sprite
{
internal var bodyList :Array = [];
public function Collision()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
for (var $index:Number = 0; $index < 25; $index++)
{bodyList[$index] = new Body(Math.random()*465, Math.random()*465)}
}
public function _init() :void
{
for (var $index:Number = 0; $index < bodyList.length; $index++)
{addChild(bodyList[$index])}
graphics.clear ();
graphics.lineStyle (1, 0, 0.75);
graphics.drawRect (0, 0, 464, 464);
}
public function addedToStage($e:Event) :void
{
_init();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame($e:Event) :void
{
for (var $index:Number = 0; $index < bodyList.length; $index++)
{if (($index + 1) < bodyList.length)
{
for (var $i:Number = 0; $i < bodyList.length; $i++)
{if (bodyList[$i] != bodyList[$index])
{ solveCollision(bodyList[$index], bodyList[$i])}}}
}
}
public function solveCollision($body1:Object, $body2:Object) :void
{
var $sum :Number = ($body1.radius + $body2.radius);
var $distX :Number = ($body2.x - $body1.x);
var $distY :Number = ($body2.y - $body1.y);
var $dist :Number = Math.sqrt(($distX * $distX) + ($distY * $distY));
if ($dist < $sum)
{
var $forceX :Number = ($distX / $dist);
var $forceY :Number = ($distY / $dist);
var $force :Number = ($dist - $sum);
$body1.x += $forceX * $force;
$body1.y += $forceY * $force;
$body2.x -= $forceX * $force;
$body2.y -= $forceY * $force;
}
}
}
}
import flash.display.*;
import flash.events.*;
import flash.geom.*;
class Body extends Sprite
{
protected var _c:Number;
protected var _a:Number;
protected var _x:Number;
protected var _y:Number;
protected var _r:Number;
internal var g:Number = 0; //initialize gravity
internal const v:Number = 1; //increment velocity of gravity
public function Body($x:Number = 232.5, $y:Number = 232.5, $r:Number = 12, $c:Number = 0, $a:Number = 0.75)
{
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
_c = $c;
_a = $a;
_x = $x;
_y = $y;
_r = $r;
}
public function _init() :void
{
graphics.clear ();
graphics.beginFill (_c, _a);
graphics.drawCircle (_x, _y, _r);
graphics.endFill ();
}
public function addedToStage($e:Event) :void
{
removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
_init();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}
public function onEnterFrame($e:Event) :void
{
if (!stage.hasEventListener(MouseEvent.MOUSE_MOVE))
{simGravitate()}
}
public function simGravitate() :void
{
if ((y + (g + v)) < (464 - radius)) //if next increment < floor
{ g = (g < 40) ? (g + 2) : g; y += g} //apply increment while < terminal velocity
else { y = (464 - radius); g = 0; } //else snap to floor & reset g
}
internal var oldPt :Point;
internal var newPt :Point;
internal var clcPt :Point;
public function onMouseDown($e:MouseEvent) :void
{
oldPt = new Point($e.stageX, $e.stageY);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
public function onMouseMove($e:MouseEvent) :void
{
newPt = new Point($e.stageX, $e.stageY);
clcPt = Point(newPt.subtract(oldPt));
x = (x + clcPt.x);
y = (y + clcPt.y);
oldPt = newPt;
}
public function onMouseUp($e:MouseEvent) :void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
public override function get x() :Number
{ return _x }
public override function get y() :Number
{ return _y }
public override function get alpha() :Number
{ return _a }
public function get color() :Number
{ return _c }
public function get radius() :Number
{ return _r }
public override function set x($value:Number) :void
{ _x = $value; _init(); }
public override function set y($value:Number) :void
{ _y = $value; _init(); }
public override function set alpha($value:Number) :void
{ _a = $value; _init(); }
public function set color($value:Number) :void
{ _c = $value; _init(); }
public function set radius($value:Number) :void
{ _r = $value; _init(); }
}