<粗糙>单个粒子

package
{
	import com.Force;
	import com.Particle;
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class Main extends Sprite
	{
		
		private var particles:Vector.<Particle>;
		public function Main()
		{
			particles = new Vector.<Particle>();
			for(var i:int=0; i<8; i++){
				var particle:Particle;
 				particle = new Particle();
				particle.x = 150;
				particle.y = 150;
				 particle.m = 100;
				particle.parent = this.stage;
				var f1:Force = new Force();
				f1.value = 200;
				 f1.angle = 0 + i *45;
				particle.instantForce(f1);
				particles.push(particle);
 			}
			this.stage.addEventListener(Event.ENTER_FRAME,onRender);
		}
		
 		protected function onRender(event:Event):void
		{
			// TODO Auto-generated method stub
 			for each(var particle:Particle in particles){
				particle.render();
 			}
		}
 	}
}






vector2d类见本博客

package com
{
	public class Force extends Vector2D
	{
		/**力**/
		public function Force()
		{
			super(0,0);
		}
		
		/**力的大小**/
		public function set value(value:Number):void{
			super.length = value;
		}
		
		public function get value():Number{
			return super.length;
		}
		
		/**力的方向(角度)**/
		override public function set angle(value:Number):void{
			value = value*(Math.PI/180);
			super.angle = value;
		}
		
		override public function get angle():Number{
			var value:Number = super.angle;
			value = value/(Math.PI/180);
			return value;
		}
		
		/**水平分力**/
		override public function get x():Number{
			return super.x;
		}
		
		/**垂直分力**/
		override public function get y():Number{
			return super.y;
		}
	}
}


package com
{
	import flash.display.DisplayObjectContainer;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.geom.Point;

	/**粒子**/
	public class Particle extends Point
	{
		
		private var _Vx:Number;
		private var _Vy:Number;
		private var _m:Number;
		private var _ax:Number;
		private var _ay:Number;
		private var _graphics:Sprite;
		private var _parent:DisplayObjectContainer
		private var addToStage:Boolean = false;
		private var _t:Number;
		private var _instantForceVec:Vector.<Force>;
		private var _resultantForceVec:Vector.<Force>;
		private var _bForceChange:Boolean = false;
		
		public function Particle()
		{
			this.x = 0;
			this.y = 0;
			_t = 1;
			_Vx = 0;
			_Vy = 0;
			_ax = 0;
			_ay = 0;
			_m = 1;
			_graphics = new Sprite();
			_graphics.graphics.beginFill(0x000000,1);
			_graphics.graphics.drawCircle(0,0,5);
			_instantForceVec = new Vector.<Force>();
			_resultantForceVec = new Vector.<Force>();
			
		}
		
		
		/**给粒子添加一个瞬时力**/
		public function instantForce(F:Force):void{
			_bForceChange = true;
			_instantForceVec.push(F);
		}
		
		/**给粒子添加一个持续力**/
		public function continueForce(F:Force):void{
			_bForceChange = true;
			_resultantForceVec.push(F);
		}
		
		public function render():void{
			if(addToStage==false && _parent!=null){
				_parent.addChild(_graphics);
				addToStage = true;
			}
			if(_bForceChange == true){
				composeForce();
			}
			update();
			project();
		}
		
		public function update():void{
			var Sx:Number = 0;
			var Sy:Number = 0;
			//v0 = v0 + at
			Vx = Vx + ax*t;
			Vy = Vy + ay*t;
			//s = vt
			Sx = Vx*t;
			Sy = Vy*t;
			this.x+=Sx;
			this.y+=Sy;
		}
		
		public function project():void{
			_graphics.x = this.x;
			_graphics.y = this.y;
		}
		
		/**计算合力加速度**/
		private function composeForce():void{
			_bForceChange = false;
			ax = 0;
			ay = 0;
			var F:Force;
			var fx:Number;
			var fy:Number;
			var iax:Number;
			var iay:Number;
			for each(F in _instantForceVec){
				fx = F.x;
				fy = F.y;
				iax = fx/m;
				iay = fy/m;
				ax+=iax;
				ay+=iay;
				_bForceChange = true;
			}
			_instantForceVec.length = 0;
			for each(F in _resultantForceVec){
				fx = F.x;
				fy = F.y;
				iax = fx/m;
				iay = fy/m;
				ax+=iax;
				ay+=iay;
			}
		}

		public function get Vx():Number
		{
			return _Vx;
		}

		public function set Vx(value:Number):void
		{
			_Vx = value;
		}

		/**分速度Vx**/
		public function get Vy():Number
		{
			return _Vy;
		}

		/**分速度Vx**/
		public function set Vy(value:Number):void
		{
			_Vy = value;
		}

		/**质量**/
		public function get m():Number
		{
			return _m;
		}


		public function set m(value:Number):void
		{
			_m = value;
		}

		/**加速度x**/
		public function get ax():Number
		{
			return _ax;
		}


		public function set ax(value:Number):void
		{
			_ax = value;
		}

		/**加速度y**/
		public function get ay():Number
		{
			return _ay;
		}

		public function set ay(value:Number):void
		{
			_ay = value;
		}

		public function get graphics():Sprite
		{
			return _graphics;
		}

		public function set graphics(value:Sprite):void
		{
			_graphics = value;
		}

		public function get parent():DisplayObjectContainer
		{
			return _parent;
		}

		public function set parent(value:DisplayObjectContainer):void
		{
			_parent = value;
		}

		public function get t():Number
		{
			return _t;
		}

		public function set t(value:Number):void
		{
			_t = value;
		}


	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值