// 三角関数を使わない円運動を試してるうちにへんなのができました // グレー減衰だとつまんないので微妙に青だけ残してみる package { import flash.display.*; import flash.filters.*; import flash.geom.*; import flash.events.Event; import net.hires.debug.Stats; [SWF(frameRate="30")] public class FlashTest extends Sprite { private const NLIM : uint = 10000; private const NGEN : uint = 50; private const W : int = 465; private const H : int = 465; private const RLIM2 : Number = W * W + H * H; private const O : Point = new Point(0, 0); private var _bullets : Array = new Array(NLIM); private var _nbullet : uint = 0; private var _transform : ColorTransform = new ColorTransform(0.985, 0.985, 0.99); private var _blur : BitmapFilter = new BlurFilter(2, 2, 1); public function FlashTest() { var bmd : BitmapData = new BitmapData(W, H, false); bmd.fillRect(bmd.rect, 0x000000); var bmp : Bitmap = new Bitmap(bmd); addChild(bmp); var t : int = 0; addEventListener(Event.ENTER_FRAME, function(e : Event) : void { bmd.lock(); var i : int, dx : Number, dy : Number, bullet : Object; for(i = _nbullet - 1;i >= 0;i--){ bullet = _bullets[i]; dx = (bullet.x - bullet.y * bullet.v) * bullet.k; dy = (bullet.y + bullet.x * bullet.v) * bullet.k; bullet.x = dx; bullet.y = dy; // 置換による消去 if(bullet.x * bullet.x + bullet.y * bullet.y > RLIM2){ _bullets[i] = _bullets[_nbullet-1]; _nbullet--; } bmd.setPixel(bullet.x + W / 2, bullet.y + H / 2, bullet.c); } var c : uint = 0xffffff; // Math.abs((t & 511) - 255) << 16 | // Math.abs(((2 * t) & 511) - 255) << 8 | // Math.abs(((3 * t) & 511) - 255) << 0; t++; if(t == 512)t = 0; // 生成 for(i = 0;i < NGEN;i++){ if(_nbullet < NLIM)_bullets[_nbullet++] = { x : 0, y : 5, v : -0.05-Math.random() * 0.1, // ここを0まわりに配置するときれいな弾幕に k : 1 + Math.random() * 0.05, c : c }; } bmd.applyFilter(bmd, bmd.rect, O, _blur); bmd.colorTransform(bmd.rect, _transform); bmd.unlock(); }); addChild(new Stats()); } } } 台風または銀河