粒子效果和万有引力

  1 package cn.d
2 {
3 import flash.display.Sprite;
4 import flash.display.StageAlign;
5 import flash.display.StageScaleMode;
6 import flash.events.Event;
7
8 [SWF(height="800", width="1200")]
9 public class ClassName extends Sprite
10 {
11 private var pars:Array=[];
12 private var numPar:int=200;
13
14 public function ClassName()
15 {
16
17 stage.scaleMode=StageScaleMode.NO_SCALE;
18 stage.align=StageAlign.TOP_LEFT;
19
20 init();
21 }
22
23 private function init():void
24 {
25 for (var i:int=0; i < numPar; i++)
26 {
27 var size:Number = Math.random() * 10 + 2;
28 var par:Ball=new Ball(5);
29 par.x=Math.random() * 1024;
30 par.y=Math.random() * 900;
31 par.mass=size;
32 par.vx=Math.random()*6-3;
33 par.vy=Math.random()*6-3;
34
35 this.addChild(par);
36 pars.push(par);
37 }
38
39 this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
40 }
41
42
43 private function onEnterFrame(e:Event):void
44 {
45 graphics.clear();
46 var i:int=0;
47 for (i=0; i < numPar; i++)
48 {
49 var par:Ball=pars[i];
50 par.x+=par.vx;
51 par.y+=par.vy;
52
53
54 if(par.x>=stage.stageWidth)
55 {
56 par.x=0;
57 }
58 else if(par.x<=0)
59 {
60 par.x=stage.stageWidth;
61 }
62
63 if(par.y>=stage.stageHeight)
64 {
65 par.y=0;
66 }
67 else if(par.y<=0)
68 {
69 par.y=stage.stageHeight;
70 }
71 }
72
73 for (i=0; i < numPar - 1; i++)
74 {
75 var parA:Ball=pars[i];
76 for(var j:int=i+1;j<numPar;j++)
77 {
78 var parB:Ball=pars[j];
79 //gravitate(parA,parB);
80 spring(parA,parB);
81 }
82 }
83
84 }
85
86 private function spring(parA:Ball,parB:Ball):void
87 {
88 var dx:Number=parB.x-parA.x;
89 var dy:Number=parB.y-parA.y;
90
91 var dist:Number=Math.sqrt(dx*dx+dy*dy);
92
93 if(dist<100)
94 {
95
96 graphics.lineStyle(1,0,1-dist/100);
97 graphics.moveTo(parA.x,parA.y);
98 graphics.lineTo(parB.x,parB.y);
99
100 var ax:Number=dx*.001;
101 var ay:Number=dy*.001;
102
103 //计算质量mass
104 parA.vx+=ax/parA.mass;
105 parA.vy+=ay/parA.mass;
106
107 parB.vx-=ax/parB.mass;
108 parB.vy-=ay/parB.mass;
109 }
110
111 }
112
113 /**
114 * 这是万游引力计算
115 *
116 * 公式定义:引力与距离的平方成反比
117 *
118 * 计算公式:force = m1 * m2 / distance2
119 * 完全公式:force = G * m1 * m2 / distance2
120 * 换算公式:G = (6.6742 ± 0.0010) * 10-11 * m3 * kg-1 * s-2
121 *
122 * @param parA
123 * @param parB
124 *
125 */
126 private function gravitate(parA:Ball, parB:Ball):void
127 {
128 var dx:Number=parB.x - parA.x;
129 var dy:Number=parB.y - parA.y;
130
131 var distSQ:Number=dx * dx + dy * dy;
132
133 var dist:Number=Math.sqrt(distSQ);
134
135 var fore:Number=parB.mass * parA.mass / distSQ;
136
137 var ax:Number=fore * dx / dist;
138 var ay:Number=fore * dy / dist;
139
140 parA.vx+=ax / parA.mass;
141 parA.vy+=ay / parA.mass;
142
143 parB.vx-=ax / parB.mass;
144 parB.vy-=ay / parB.mass;
145
146 }
147
148 }
149 }
posted @ 2012-03-07 16:15  ndljava  阅读(254)  评论(0编辑  收藏  举报