root/as3/Study/Particle-20090416/Main.as

リビジョン 2466, 7.1 kB (コミッタ: yossy, コミット時期: 3 年 前)

Particle Study 20090416

Line 
1 package
2 {
3         import flash.events.Event;
4         import flash.display.Bitmap;
5         import flash.display.BitmapData;
6         import flash.display.PixelSnapping;
7         import flash.display.Sprite;
8         import flash.display.StageAlign;
9         import flash.display.StageQuality;
10         import flash.display.StageScaleMode;
11        
12         import com.flashdynamix.utils.SWFProfiler;
13        
14         [SWF(width = 1024, height = 512, frameRate = 30, backgoundColor = 0x000000)]
15         public class Main extends Sprite
16         {
17                 private static const NUM_PARTICLES:uint = 30000;
18                
19                 public function Main()
20                 {
21                         // Setup Stage
22                         stage.scaleMode = StageScaleMode.NO_SCALE;
23                         stage.quality = StageQuality.LOW;
24                         stage.align = StageAlign.TOP_LEFT;
25                         stage.addEventListener(Event.RESIZE, resizeHandler);
26                        
27                         // Setup Instances
28                         _buffer = new Vector.<uint>(1024 * 512, true);
29                         _screen = new BitmapData(1024, 512, false, 0x000000);
30                        
31                         // Setup Sin/Cos Table
32                         _sinTable = new Vector.<int>(1024, true);
33                         _cosTable = new Vector.<int>(1024, true);
34                         for (var angle:uint = 0; angle < 1024; ++angle) {
35                                 _sinTable[angle] = Math.sin(angle / 512 * Math.PI) * 65536 >> 0;
36                                 _cosTable[angle] = Math.cos(angle / 512 * Math.PI) * 65536 >> 0;
37                         }
38                        
39                         // Setup Particles
40                         var prev:Particle = _particles = new Particle();
41                         for (var i:uint = 0; i < NUM_PARTICLES; ++i) {
42                                 var p:Particle = new Particle();
43                                 // Angle
44                                 p.xy = 1024 * Math.random() >> 0;
45                                 p.xz = 1024 * Math.random() >> 0;
46                                 // Velocity
47                                 p.vxy = (4 * Math.random() - 2) >> 0;
48                                 p.vxz = (4 * Math.random() - 2) >> 0;
49                                 if ((p.vxy | p.vxz) == 0) {
50                                         p.vxy = 1;
51                                 }
52                                 // Link
53                                 prev.next = p;
54                                 prev = p;
55                         }
56                        
57                         // Setup Display
58                         addChild(_display = new Bitmap(_screen, PixelSnapping.NEVER, false));
59                         resizeHandler(null);
60                        
61                         // Setup SWFProfiler
62                         SWFProfiler.init(this);
63                        
64                         // Hook Event
65                         addEventListener(Event.ENTER_FRAME, enterFrameHandler);
66                 }
67                
68                 private var _buffer:Vector.<uint>;
69                 private var _screen:BitmapData;
70                 private var _display:Bitmap;
71                
72                 private var _sinTable:Vector.<int>;
73                 private var _cosTable:Vector.<int>;
74                
75                 private var _particles:Particle;
76                
77                 private var _c:uint = 0;
78                
79                 private function resizeHandler(e:Event):void
80                 {
81                         // Set Position
82                         _display.x = Math.floor((stage.stageWidth - 1024) / 2);
83                         _display.y = Math.floor((stage.stageHeight - 512) / 2);
84                 }
85                
86                 private function enterFrameHandler(e:Event):void
87                 {
88                         var buffer:Vector.<uint> = _buffer;
89                         var sinTable:Vector.<int> = _sinTable;
90                         var cosTable:Vector.<int> = _cosTable;
91                        
92                         // Fade Out (for Motion Blur Effect)
93                         // NIKAI NI IKKAI DAKE
94                         if ((_c = _c ^ 1) == 0) {
95                                 var n:int = -8;
96                                 var b:uint;
97                                 while ((n += 8) < (1024 * 512)) {
98                                         // Underflow SHINAI YOUNI HIKU
99                                         if ((b = buffer[n + 0]) != 0) {
100                                                 buffer[n + 0] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
101                                         }
102                                         if ((b = buffer[n + 1]) != 0) {
103                                                 buffer[n + 1] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
104                                         }
105                                         if ((b = buffer[n + 2]) != 0) {
106                                                 buffer[n + 2] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
107                                         }
108                                         if ((b = buffer[n + 3]) != 0) {
109                                                 buffer[n + 3] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
110                                         }
111                                         if ((b = buffer[n + 4]) != 0) {
112                                                 buffer[n + 4] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
113                                         }
114                                         if ((b = buffer[n + 5]) != 0) {
115                                                 buffer[n + 5] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
116                                         }
117                                         if ((b = buffer[n + 6]) != 0) {
118                                                 buffer[n + 6] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
119                                         }
120                                         if ((b = buffer[n + 7]) != 0) {
121                                                 buffer[n + 7] = b - (((((b & 0x0f0f0f0f) + 0x0f0f0f0f) | b) & 0xf0f0f0f0) >> 4);
122                                         }
123                                 }
124                         }
125                        
126                         // Calc & Render
127                         var p:Particle = _particles;
128                         var xy:int, xz:int, cxy:int, px:int, py:int, fz:Number, ax:int, ay:int;
129                         while ((p = p.next) != null) {
130                                
131                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
132                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
133                                 cxy = (cosTable[xy] >> 8)
134                                 fz = 80000.0 / (80000.0 - (cxy * (sinTable[xz] >> 8)));
135                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
136                                         buffer[ax + (ay << 10)] = 0xffffff;
137                                 }
138                                
139                                 p = p.next;
140                                
141                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
142                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
143                                 cxy = (cosTable[xy] >> 8)
144                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
145                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
146                                         buffer[ax + (ay << 10)] = 0xffffff;
147                                 }
148                                
149                                 p = p.next;
150                                
151                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
152                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
153                                 cxy = (cosTable[xy] >> 8)
154                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
155                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
156                                         buffer[ax + (ay << 10)] = 0xffffff;
157                                 }
158                                
159                                 p = p.next;
160                                
161                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
162                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
163                                 cxy = (cosTable[xy] >> 8)
164                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
165                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
166                                         buffer[ax + (ay << 10)] = 0xffffff;
167                                 }
168                                
169                                 p = p.next;
170                                
171                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
172                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
173                                 cxy = (cosTable[xy] >> 8)
174                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
175                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
176                                         buffer[ax + (ay << 10)] = 0xffffff;
177                                 }
178                                
179                                 p = p.next;
180                                
181                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
182                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
183                                 cxy = (cosTable[xy] >> 8)
184                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
185                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
186                                         buffer[ax + (ay << 10)] = 0xffffff;
187                                 }
188                                
189                                 p = p.next;
190                                
191                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
192                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
193                                 cxy = (cosTable[xy] >> 8)
194                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
195                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
196                                         buffer[ax + (ay << 10)] = 0xffffff;
197                                 }
198                                
199                                 p = p.next;
200                                
201                                 xy = p.xy = (p.xy + p.vxy) & 0x3ff;
202                                 xz = p.xz = (p.xz + p.vxz) & 0x3ff;
203                                 cxy = (cosTable[xy] >> 8)
204                                 fz = 98304.0 / (98304.0 - (cxy * (sinTable[xz] >> 8)));
205                                 if ((((ax = (int((cxy * (cosTable[xz] >> 8)) * fz) >> 8) + 512) & ~0x3ff) | ((ay = (int(sinTable[xy] * fz) >> 8) + 256) & ~0x1ff)) == 0) {
206                                         buffer[ax + (ay << 10)] = 0xffffff;
207                                 }
208                         }
209                        
210                         _screen.lock();
211                         _screen.setVector(_screen.rect, buffer);
212                         _screen.unlock(_screen.rect);
213                 }
214         }
215 }
216
217 internal class Particle
218 {
219         // Angle
220         public var xy:int;
221         public var xz:int;
222        
223         // Velocity
224         public var vxy:int;
225         public var vxz:int;
226        
227         // Linked List
228         public var next:Particle;
229 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。