最近、星みていないなぁ☆
forked from ブラウン運動 (diff: 173)
ドットバン 軌道周回 簡単なのからコツコツと勉強中 参考 「ActionScript3.0アニメーション」 著者:KeithPeters 翻訳:永井勝則
ActionScript3 source code
/**
* Copyright teageek ( http://wonderfl.net/user/teageek )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/e8kr
*/
// forked from teageek's ブラウン運動
//ドットバン
//軌道周回
//簡単なのからコツコツと勉強中
//参考
//「ActionScript3.0アニメーション」
//著者:KeithPeters 翻訳:永井勝則
package {
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.geom.*;
[SWF(backgroundColor = "0x000000", frameRate = "30")]
public class FlashTest extends Sprite {
private var canvas :BitmapData;
private var particles:Vector.<Particle> = new Vector.<Particle>();
private var color:ColorTransform = new ColorTransform(1, 1, 1, 1, -50, -35, -15);
public function FlashTest() {
for( var i :int =182; i<282; i+=2)
for( var j:int =182;j<282; j+=20){
var part:Particle=new Particle(
Math.random()*50-100+228,
228,1,0xffffffff*Math.random());
part.vy=Math.random()*10-20;
part.mass=2*Math.random();
particles.push( part );
}
var sun:Particle = new Particle(228,228,1, 0xffff0000);
sun.mass = 10000;
particles.push(sun);
var planet:Particle = new Particle(228+ 200,228 ,1, 0xffffffff);
planet.vy = 7;
planet.mass = 1;
particles.push(planet);
canvas = new BitmapData( 456,456, true, 0x0);
addChild( new Bitmap(canvas) );
addEventListener("enterFrame", onUpdate );
stage.addEventListener("click",init);
}
private function init(e:Event):void{
for each (var p:Particle in particles ) {
p.x=228+200*Math.random();
p.y=228;
}
}
private function onUpdate( e:Event ):void {
onEnterFrame();
canvas.lock();
canvas.colorTransform(canvas.rect,color);
for each (var p:Particle in particles )
canvas.setPixel32( p.x, p.y, p.color );
canvas.unlock();
}
private function onEnterFrame():void
{
var pl:int=particles.length;
for(var i:uint = 0; i < pl; i++)
{
var particle:Particle = particles[i];
particle.x += particle.vx;
particle.y += particle.vy;
}
for(i=0; i < pl - 1; i++)
{
var partA:Particle = particles[i];
for(var j:uint = i + 1; j < pl; j++)
{
var partB:Particle = particles[j];
checkCollision(partA, partB);
gravitate(partA, partB);
}
}
}
private function gravitate(partA:Particle, partB:Particle):void
{
var dx:Number = partB.x - partA.x;
var dy:Number = partB.y - partA.y;
var distSQ:Number = dx*dx + dy*dy;
var dist:Number = Math.sqrt(distSQ);
var force:Number = partA.mass * partB.mass / distSQ;
var ax:Number = force * dx / dist;
var ay:Number = force * dy / dist;
partA.vx += ax / partA.mass;
partA.vy += ay / partA.mass;
partB.vx -= ax / partB.mass;
partB.vy -= ay / partB.mass;
}
private function checkCollision(ball0:Particle, ball1:Particle):void
{
var dx:Number = ball1.x - ball0.x;
var dy:Number = ball1.y - ball0.y;
var dist:Number = Math.sqrt(dx*dx + dy*dy);
if(dist < ball0.radius + ball1.radius)
{
// 角度とサイン、コサインの計算
var angle:Number = Math.atan2(dy, dx);
var sin:Number = Math.sin(angle);
var cos:Number = Math.cos(angle);
// ball0の位置の回転
var pos0:Point = new Point(0, 0);
// ball1の位置の回転
var pos1:Point = rotate(dx, dy, sin, cos, true);
// ball0の速度の回転
var vel0:Point = rotate(ball0.vx,ball0.vy,sin,cos,true);
// ball1の速度の回転
var vel1:Point = rotate(ball1.vx,ball1.vy,sin,cos,true);
// 衝突反応
var vxTotal:Number = vel0.x - vel1.x;
vel0.x = ((ball0.mass - ball1.mass) * vel0.x +
2 * ball1.mass * vel1.x) /
(ball0.mass + ball1.mass);
vel1.x = vxTotal + vel0.x;
// 位置の更新
var absV:Number = Math.abs(vel0.x) + Math.abs(vel1.x);
var overlap:Number = (ball0.radius + ball1.radius)
- Math.abs(pos0.x - pos1.x);
pos0.x += vel0.x / absV * overlap;
pos1.x += vel1.x / absV * overlap;
// 位置の回転
var pos0F:Object = rotate(pos0.x,pos0.y,sin,cos,false);
var pos1F:Object = rotate(pos1.x,pos1.y,sin,cos,false);
// 実際の画面位置への調整
ball1.x = ball0.x + pos1F.x;
ball1.y = ball0.y + pos1F.y;
ball0.x = ball0.x + pos0F.x;
ball0.y = ball0.y + pos0F.y;
// 速度の回転
var vel0F:Object = rotate(vel0.x,vel0.y,sin,cos,false);
var vel1F:Object = rotate(vel1.x,vel1.y,sin,cos,false);
ball0.vx = vel0F.x;
ball0.vy = vel0F.y;
ball1.vx = vel1F.x;
ball1.vy = vel1F.y;
}
}
private function rotate(x:Number,y:Number,sin:Number,cos:Number,reverse:Boolean):Point
{
var result:Point = new Point();
if(reverse)
{
result.x = x * cos + y * sin;
result.y = y * cos - x * sin;
}
else
{
result.x = x * cos - y * sin;
result.y = y * cos + x * sin;
}
return result;
}
}
}
class Particle {
public var radius:Number;
public var color:uint
public var vx:Number = 0;
public var vy:Number = 0;
public var mass:Number = 1;
public var x:Number=0;
public var y:Number=0;
public function Particle(x:Number=0,y:Number=0,
radius:Number=40, color:uint=0xff000000) {
this.color=color;
this.x=x;
this.y=y;
this.radius = radius;
}
}
