最近、星みていないなぁ☆

by teageek forked from ブラウン運動 (diff: 173)
ドットバン
軌道周回
簡単なのからコツコツと勉強中
参考
「ActionScript3.0アニメーション」
著者:KeithPeters 翻訳:永井勝則
♥0 | Line 151 | Modified 2009-08-02 00:24:40 | MIT License
play

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;
	}
     
}