In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

万有引力のお勉強

万有引力のお勉強

書籍「FLASH LAB」のsatelliteという項目を
自分なりに租借してAS3で組みなおしてみました。
惑星がひとつだったり、出現の仕方がちょっと違いますが、
まぁ(面倒だったので)アレンジ的な感じで。

真ん中の惑星(?)はドラッグ可能です。
なんか軌道が変わりまくってるから、多分計算が違うのかなぁ・・・。

ついでにZ軸もつけてみました。
FP10になって焦点距離とか考えなくてよくなったのは
うれしいですね。ここら辺もうちょっと勉強しないと
損かなと実感。

衛星の最大移動距離が惑星より小さいと
惑星の中から衛星が出てきて不恰好な状態に・・・。

あとは全体的に不恰好なんで、エフェクトとか模様とか
付けてみたい気がします。

(5/2 6:47 単純な間違いをしてたと思って治したら更に悪化・・・
Z軸の計算間違ってるっぽい気が・・・)
Get Adobe Flash player
by Hiiragi 24 Jul 2009
package 
{
	/* 万有引力のお勉強
	 * 
	 * 書籍「FLASH LAB」のsatelliteという項目を
	 * 自分なりに租借してAS3で組みなおしてみました。
	 * 惑星がひとつだったり、出現の仕方がちょっと違いますが、
	 * まぁ(面倒だったので)アレンジ的な感じで。
	 * 
	 * 真ん中の惑星(?)はドラッグ可能です。
	 * なんか軌道が変わりまくってるから、多分計算が違うのかなぁ・・・。
	 * 
	 * ついでにZ軸もつけてみました。
	 * FP10になって焦点距離とか考えなくてよくなったのは
	 * うれしいですね。ここら辺もうちょっと勉強しないと
	 * 損かなと実感。
	 * 
	 * 衛星の最大移動距離が惑星より小さいと
	 * 惑星の中から衛星が出てきて不恰好な状態に・・・。
	 * 
	 * あとは全体的に不恰好なんで、エフェクトとか模様とか
	 * 付けてみたい気がします。
	 * 
	 * (5/2 6:47 単純な間違いをしてたと思って治したら更に悪化・・・
	 * Z軸の計算間違ってるっぽい気が・・・)
	 */
	import flash.display.Sprite;
	import flash.events.Event;
	import com.flashdynamix.utils.SWFProfiler
	import flash.events.MouseEvent;
	
	[SWF(width=465,height=465,frameRate=30,backgroundColor=0x000000)]

	public class Main extends Sprite 
	{

		private var targetPlanet:planet = new planet(0x0000FF, 20);
		
		private var satelliteNum:uint = 10;
		private var satelliteArray:Vector.<planet> = new Vector.<planet>;

		private const MG:uint = 4000;
		
		private var maxSpeed:Number = 20;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);

			SWFProfiler.init(this);
			
			targetPlanet.x = stage.stageWidth / 2;
			targetPlanet.y = stage.stageHeight / 2;
			targetPlanet.z = 0;
			targetPlanet.name = "targetPlanet";
			
			targetPlanet.addEventListener(MouseEvent.MOUSE_DOWN, onPlanetMouseDown);
			targetPlanet.addEventListener(MouseEvent.MOUSE_UP, onPlanetMouseUp);
			satelliteArray.push(targetPlanet);
			
			this.addChild(targetPlanet);
			
			var cp_x:Number = stage.stageWidth / 2;
			var cp_y:Number = stage.stageHeight / 2;
			
			for (var i:uint = 0; i < satelliteNum; i++) {
				//var p:planet = new planet(0xFF6600, 3);
				var p:planet = new planet(Math.random()*0xAAAAAA+0x555555, 3);
				p.x = cp_x + Math.random() * 100 - 50;
				p.y = cp_y + Math.random() * 100 - 50;
				this.addChild(p);
				satelliteArray.push(p);
			}
			
			this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
		
		private function onPlanetMouseUp(e:MouseEvent):void 
		{
			var p:planet = e.target as planet;
			p.stopDrag();
		}
		
		private function onPlanetMouseDown(e:MouseEvent):void 
		{
			var p:planet = e.target as planet;
			p.startDrag();
		}
		
		private function onEnterFrameHandler(e:Event):void 
		{
			satelliteArray.forEach(movePlanet);
			
			//zSort
			satelliteArray.sort(function(x:planet, y:planet):Number { return y.z - x.z; } );
			var num:uint = satelliteArray.length;
			for (var i:uint = 0; i < num; i++) {
				this.setChildIndex(satelliteArray[i], i);
			}
		}
		
		private function movePlanet(item:planet, index:int, vector:Vector.<planet>):void
		{
			if (item.name != "targetPlanet") {
				var dx:Number = targetPlanet.x - item.x;
				var dy:Number = targetPlanet.y - item.y;
				var dz:Number = -item.z;
				
				var radXY:Number = Math.atan2(dy, dx);
				var radYZ:Number = Math.atan2(dy, dz);
				
				var distanceXY:Number = dx * dx + dy * dy;
				var distanceYZ:Number = dy * dy + dz * dz;
				
				var aXY:Number = MG / (distanceXY + 4000);
                                    //var aYZ:Number = MG / (distanceYZ + 4000);
				var aYZ:Number = MG / (distanceXY + 4000);
				
				var aXY_x:Number = aXY * Math.cos(radXY);
			         var aXY_y:Number = aXY * Math.sin(radXY);
                                     //var aXY_y:Number = aXY * Math.sin(radYZ);
				var aYZ_z:Number = aYZ * Math.cos(radYZ);
				
				item.vx += aXY_x;
				item.vy += aXY_y;
				item.vz += aYZ_z;
				
				//limiter
				if (item.vx > maxSpeed) {
					item.vx = maxSpeed;
				} else if (item.vx < -maxSpeed) {
					item.vx = -maxSpeed;
				}
				
				if (item.vy > maxSpeed) {
					item.vy = maxSpeed;
				} else if (item.vy < -maxSpeed) {
					item.vy = -maxSpeed;
				}
				
				item.x += item.vx;
				item.y += item.vy;
				item.z += item.vz;
			}

		}
		
	}
	
}

import flash.display.Sprite;

internal class planet extends Sprite{
	
	private var _vx:Number = Math.random() * 20 - 10;
	private var _vy:Number = Math.random() * 20 - 10;
	private var _vz:Number = Math.random() * 20 - 10;
	
	public function planet(color:uint,size:uint) {
		this.graphics.beginFill(color);
		this.graphics.drawCircle(0, 0, size);
		this.graphics.endFill();
	}
	
	public function get vx():Number {
		return _vx;
	}
	
	public function set vx(arg1:Number):void {
		_vx = arg1;
	}
	
	public function get vy():Number {
		return _vy;
	}
	
	public function set vy(arg1:Number):void {
		_vy = arg1;
	}
	
	public function get vz():Number {
		return _vz;
	}
	
	public function set vz(arg1:Number):void {
		_vz = arg1;
	}
}