※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : ABA's forked from: AAShip [diff(230)]

FORKED
  1. // forked from ABA's forked from: forked from: AAShip
  2. // forked from ABA's forked from: AAShip
  3. // forked from ABA's AAShip
  4. // AAShip.as
  5. // Ascii art ship.
  6. // [Control]
  7. // Movement: Arrow or [WASD] keys.
  8. // Fire: [Z], [X], [.] or [/] key.
  9. package
  10. {
  11. import flash.display.Sprite;
  12. import flash.display.BitmapData;
  13. import flash.display.Bitmap;
  14. import flash.geom.Rectangle;
  15. import flash.text.TextField;
  16. import flash.events.Event;
  17. import flash.events.KeyboardEvent;
  18. [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
  19. public class AAShip extends Sprite
  20. {
  21. public static const SCREEN_WIDTH:int = 465;
  22. public static const SCREEN_HEIGHT:int = 465;
  23. private const BLUR_MAX_COUNT:int = 512;
  24. private const BLUR_HISTORY_COUNT:int = 6;
  25. private const SHIP_SPEED:Number = 8;
  26. private const SHOT_MAX_COUNT:int = 12;
  27. private const SHOT_SPEED:Number = 20;
  28. private const SHIP_COLLISION_SIZE:Number = 5;
  29. private const SHIP_INVINCIBLE_TICKS:int = 90;
  30. private const ENEMY_MAX_COUNT:int = 16;
  31. private const BULLET_MAX_COUNT:int = 128;
  32. private const SPARK_MAX_COUNT:int = 64;
  33. private const ZAKO1_APPEARANCE_INTERVAL:Number = 30;
  34. private const MID1_APPEARANCE_INTERVAL:Number = 180;
  35. public static var gameSpeed:Number;
  36. private var buffer:BitmapData = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false, 0);
  37. private var rect:Rectangle = new Rectangle;
  38. private var offset:Vector2 = new Vector2;
  39. private var blurs:Vector.> = new Vector.>(BLUR_HISTORY_COUNT, true);
  40. private var blurCounts:Vector. = new Vector.(BLUR_HISTORY_COUNT, true);
  41. private var blurIndex:int;
  42. private var shipChar:AAChar;
  43. private var shipSprite:Sprite = new Sprite;
  44. private var shipPos:Vector2 = new Vector2;
  45. private var shipAngle:Number;
  46. private var shipInvincibleTicks:int;
  47. private var shipFireCount:int;
  48. private var shipFireTicks:Number;
  49. private var shotChar:AAChar;
  50. private var shots:Vector. = new Vector.(SHOT_MAX_COUNT, true);
  51. private var enemies:Vector. = new Vector.(ENEMY_MAX_COUNT, true);
  52. private var zako1:Zako1, mid1:Mid1;
  53. private var bulletChar:AAChar;
  54. private var bullets:Vector. = new Vector.(BULLET_MAX_COUNT, true);
  55. private var sparkChar:AAChar;
  56. private var sparks:Vector. = new Vector.(SPARK_MAX_COUNT, true);
  57. private var bulletIntervalRank:Number;
  58. private var bulletSpeedRank:Number;
  59. private var enemyIntervalRank:Number;
  60. private var enemySpeedRank:Number;
  61. private var rankTicks:int;
  62. public function AAShip()
  63. {
  64. stage.scaleMode = "noScale";
  65. addChild(new Bitmap(buffer));
  66. stage.addEventListener(KeyboardEvent.KEY_DOWN, Key.onKeyDown);
  67. stage.addEventListener(KeyboardEvent.KEY_UP, Key.onKeyUp);
  68. AAChar.initialize();
  69. Field.initialize();
  70. var i:int;
  71. for (i = 0; i < BLUR_HISTORY_COUNT; i++)
  72. {
  73. var bs:Vector. = new Vector.(BLUR_MAX_COUNT, true);
  74. for (var j:int = 0; j < BLUR_MAX_COUNT; j++)
  75. {
  76. bs[j] = new Blur;
  77. }
  78. blurs[i] = bs;
  79. blurCounts[i] = 0;
  80. }
  81. blurIndex = 0;
  82. shipChar = new AAChar([" A ", "I#I"], [" R ", "CBC"], 2, 2);
  83. shipChar.drawToSprite(shipSprite);
  84. shipInvincibleTicks = -SHIP_INVINCIBLE_TICKS;
  85. shotChar = new AAChar(["!"], ["Y"]);
  86. for (i = 0; i < SHOT_MAX_COUNT; i++)
  87. {
  88. shots[i] = new Shot;
  89. shotChar.drawToSprite(shots[i].sprite);
  90. }
  91. zako1 = new Zako1; mid1 = new Mid1;
  92. for (i = 0; i < ENEMY_MAX_COUNT; i++)
  93. {
  94. enemies[i] = new Enemy;
  95. }
  96. bulletChar = new AAChar(["#"], ["P"], 1, 1);
  97. for (i = 0; i < BULLET_MAX_COUNT; i++)
  98. {
  99. bullets[i] = new Bullet;
  100. bulletChar.drawToSprite(bullets[i].sprite);
  101. }
  102. sparkChar = new AAChar(["*"], ["Y"]);
  103. for (i = 0; i < SPARK_MAX_COUNT; i++)
  104. {
  105. sparks[i] = new Spark;
  106. sparkChar.drawToSprite(sparks[i].sprite);
  107. }
  108. bulletIntervalRank = bulletSpeedRank = enemyIntervalRank = enemySpeedRank = 1.0 / 0.5;
  109. gameSpeed = 1.0;
  110. addEventListener(Event.ENTER_FRAME, onEnterFrame);
  111. }
  112. private function initializeShip():void
  113. {
  114. shipPos.x = 0;
  115. shipPos.y = Field.size.y / 2;
  116. shipAngle = 0.0;
  117. shipFireCount = 0;
  118. shipFireTicks = 0;
  119. bulletIntervalRank *= 0.5; bulletSpeedRank *= 0.5;
  120. enemyIntervalRank *= 0.5; enemySpeedRank *= 0.5;
  121. if (bulletIntervalRank < 0.5) bulletIntervalRank = 0.5;
  122. if (bulletSpeedRank < 0.5) bulletSpeedRank = 0.5;
  123. if (enemyIntervalRank < 0.5) enemyIntervalRank = 0.5;
  124. if (enemySpeedRank < 0.5) enemySpeedRank = 0.5;
  125. rankTicks = 0;
  126. zako1.appearanceTicks = 0;
  127. mid1.appearanceTicks = MID1_APPEARANCE_INTERVAL;
  128. shipChar.setSpriteMatrix(shipSprite, shipPos, shipAngle);
  129. addChild(shipSprite);
  130. }
  131. private function onEnterFrame(event:Event):void
  132. {
  133. buffer.fillRect(buffer.rect, 0);
  134. var i:int;
  135. blurCounts[blurIndex] = 0;
  136. updateSparks();
  137. updateShots();
  138. if (shipInvincibleTicks > -SHIP_INVINCIBLE_TICKS) updateShip();
  139. else if (shipInvincibleTicks == -SHIP_INVINCIBLE_TICKS) initializeShip();
  140. else Field.offsetX *= 0.95;
  141. shipInvincibleTicks++;
  142. updateEnemies();
  143. updateBullets();
  144. rankTicks++;
  145. bulletIntervalRank += 0.02;
  146. if (rankTicks % (10 * 30) == 0) bulletIntervalRank *= 0.5;
  147. bulletSpeedRank += 0.005;
  148. if (rankTicks % (15 * 30) == 0) bulletSpeedRank *= 0.5;
  149. enemyIntervalRank += 0.005;
  150. if (rankTicks % (21 * 30) == 0) enemyIntervalRank *= 0.5;
  151. enemySpeedRank += 0.002;
  152. if (rankTicks % (27 * 30) == 0) enemySpeedRank *= 0.5;
  153. buffer.lock();
  154. Field.draw(buffer);
  155. var bi:int = blurIndex + 1;
  156. for (i = 0; i < BLUR_HISTORY_COUNT; i++)
  157. {
  158. if (bi >= BLUR_HISTORY_COUNT) bi = 0;
  159. for (var j:int = 0; j < blurCounts[bi]; j++)
  160. {
  161. updateBlur(blurs[bi][j]);
  162. }
  163. bi++;
  164. }
  165. Field.drawSideBoard(buffer);
  166. buffer.unlock();
  167. blurIndex++;
  168. if (blurIndex >= BLUR_HISTORY_COUNT) blurIndex = 0;
  169. }
  170. private function updateShip():void
  171. {
  172. var px:Number = shipPos.x;
  173. var vx:Number = 0, vy:Number = 0;
  174. if (Key.left) vx = -1;
  175. if (Key.right) vx = 1;
  176. if (Key.up) vy = -1;
  177. if (Key.down) vy = 1;
  178. if (vx != 0 && vy != 0)
  179. {
  180. vx *= 0.7; vy *= 0.7;
  181. }
  182. shipPos.x += vx * SHIP_SPEED * gameSpeed;
  183. shipPos.y += vy * SHIP_SPEED * gameSpeed;
  184. if (shipPos.x < -SCREEN_WIDTH / 2) shipPos.x = -SCREEN_WIDTH / 2;
  185. if (shipPos.x > SCREEN_WIDTH / 2) shipPos.x = SCREEN_WIDTH / 2;
  186. if (shipPos.y < -SCREEN_HEIGHT / 2) shipPos.y = -SCREEN_HEIGHT / 2;
  187. if (shipPos.y > SCREEN_HEIGHT / 2) shipPos.y = SCREEN_HEIGHT / 2;
  188. shipAngle += (shipPos.x - px) * 0.01;
  189. shipAngle *= 0.8;
  190. Field.offsetX = shipPos.x * 0.33;
  191. shipChar.setSpriteMatrix(shipSprite, shipPos, shipAngle);
  192. if (shipInvincibleTicks >= 0 || (-shipInvincibleTicks % 15 > 7))
  193. {
  194. addBlursOfAAChar(shipChar, shipPos, shipAngle);
  195. }
  196. var s:Shot;
  197. if (Key.button1 && shipFireTicks <= 0)
  198. {
  199. shipFireTicks += 1.0;
  200. offset.x = 15;
  201. offset.y = 0;
  202. offset.rotation(shipAngle);
  203. s = getActorInstance(Vector.(shots));
  204. var i:int = shipFireCount % 2;
  205. if (s != null)
  206. {
  207. s.pos.x = shipPos.x + offset.x * (i * 2 - 1);
  208. s.pos.y = shipPos.y + offset.y * (i * 2 - 1);
  209. s.angle = shipAngle;
  210. s.ticks = 0;
  211. addBlur(s.pos.x, s.pos.y, 10, 10, 255, 255, 0);
  212. shotChar.setSpriteMatrix(s.sprite, s.pos, s.angle);
  213. addChild(s.sprite);
  214. shipFireCount++;
  215. }
  216. }
  217. shipFireTicks -= gameSpeed;
  218. if (shipInvincibleTicks >= 0)
  219. {
  220. for each (var e:Enemy in enemies)
  221. {
  222. if (!e.exists) continue;
  223. if (Math.abs(shipPos.x - e.pos.x) <= e.spec.size.x - 12 &&
  224. Math.abs(shipPos.y - e.pos.y) <= e.spec.size.y - 12)
  225. {
  226. shipDestroyed();
  227. e.exists = false;
  228. removeChild(e.sprite);
  229. return;
  230. }
  231. }
  232. for each (var b:Bullet in bullets)
  233. {
  234. if (!b.exists) continue;
  235. if (shipPos.getRoughDistance(b.pos) <= SHIP_COLLISION_SIZE)
  236. {
  237. shipDestroyed();
  238. b.exists = false;
  239. removeChild(b.sprite);
  240. return;
  241. }
  242. }
  243. }
  244. }
  245. private function updateShots():void
  246. {
  247. var s:Shot;
  248. for each (s in shots)
  249. {
  250. if (!s.exists) continue;
  251. s.pos.x += Math.sin(s.angle) * SHOT_SPEED * gameSpeed;
  252. s.pos.y -= Math.cos(s.angle) * SHOT_SPEED * gameSpeed;
  253. if (s.pos.y < -SCREEN_HEIGHT / 2)
  254. {
  255. s.exists = false;
  256. removeChild(s.sprite);
  257. continue;
  258. }
  259. s.ticks += gameSpeed;
  260. shotChar.setSpriteMatrix(s.sprite, s.pos, s.angle);
  261. addBlursOfAAChar(shotChar, s.pos, s.angle, 1.0, 1.0, 150, 100, 0);
  262. for each (var e:Enemy in enemies)
  263. {
  264. if (!e.exists) continue;
  265. if (Math.abs(s.pos.x - e.pos.x) <= e.spec.size.x &&
  266. Math.abs(s.pos.y - e.pos.y) <= e.spec.size.y)
  267. {
  268. addSpark(s.pos, s.angle + Math.PI, 0.2, SHOT_SPEED, 1.0, 2);
  269. e.shield--;
  270. e.isHit = true;
  271. s.exists = false;
  272. removeChild(s.sprite);
  273. break;
  274. }
  275. }
  276. }
  277. }
  278. private function updateEnemies():void
  279. {
  280. var e:Enemy;
  281. var es:EnemySpec = null;
  282. zako1.appearanceTicks -= gameSpeed;
  283. if (zako1.appearanceTicks <= 0)
  284. {
  285. es = zako1;
  286. var ei:int = ZAKO1_APPEARANCE_INTERVAL / enemyIntervalRank;
  287. ei *= (0.75 + Math.random() * 0.5);
  288. if (ei < 5) ei = 5;
  289. zako1.appearanceTicks += ei;
  290. }
  291. mid1.appearanceTicks -= gameSpeed;
  292. if (mid1.appearanceTicks <= 0)
  293. {
  294. es = mid1;
  295. mid1.appearanceTicks += MID1_APPEARANCE_INTERVAL * (0.5 + Math.random());
  296. }
  297. if (es != null)
  298. {
  299. e = getActorInstance(Vector.(enemies));
  300. if (e != null)
  301. {
  302. e.spec = es;
  303. e.speedRatio = enemySpeedRank;
  304. var fsr:Number = bulletSpeedRank;
  305. if (fsr < 1.0) fsr = 1.0;
  306. e.fireSpeedRatio = fsr;
  307. var fir:Number = bulletIntervalRank;
  308. if (fir > 25.0) fir = 25.0;
  309. e.fireIntervalRatio = fir;
  310. e.ticks = 0;
  311. e.fireTicks = 0.0; e.fireSeqTicks = 0.0; e.fireCount = 0;
  312. e.shield = e.spec.shield;
  313. e.isHit = false;
  314. e.spec.initialize(e, shipPos);
  315. e.spec.aaChar.drawToSprite(e.sprite);
  316. addChild(e.sprite);
  317. }
  318. }
  319. for each (e in enemies)
  320. {
  321. if (!e.exists) continue;
  322. if (!Field.contains(e.pos) || e.shield <= 0)
  323. {
  324. e.exists = false;
  325. removeChild(e.sprite);
  326. if (e.shield <= 0) addSpark(e.pos, 0, Math.PI, 4.0, 1.5, 8);
  327. continue;
  328. }
  329. e.spec.update(e, shipPos, this);
  330. e.ticks += gameSpeed;
  331. e.fireTicks -= gameSpeed;
  332. e.spec.aaChar.setSpriteMatrix(e.sprite, e.pos, e.angle, e.spec.scale.x, e.spec.scale.y);
  333. if (e.isHit)
  334. {
  335. e.isHit = false;
  336. addBlursOfAAChar(e.spec.aaChar, e.pos, e.angle, e.spec.scale.x * 1.5, e.spec.scale.y * 1.5, 255, 255, 0);
  337. }
  338. else
  339. {
  340. addBlursOfAAChar(e.spec.aaChar, e.pos, e.angle, e.spec.scale.x, e.spec.scale.y);
  341. }
  342. }
  343. }
  344. public function fireBullet(p:Vector2, angle:Number, speed:Number, size:Number):void
  345. {
  346. if (p.getRoughDistance(shipPos) <= 200 ||
  347. p.x - Field.offsetX <= -Field.size.x + Field.SIDE_BOARD_WIDTH ||
  348. p.x - Field.offsetX >= Field.size.x - Field.SIDE_BOARD_WIDTH) return;
  349. var b:Bullet = getActorInstance(Vector.(bullets));
  350. if (b == null) return;
  351. b.pos.x = p.x; b.pos.y = p.y;
  352. b.vel.x = Math.sin(angle) * speed;
  353. b.vel.y = -Math.cos(angle) * speed;
  354. b.speed = speed;
  355. b.size = size;
  356. addBlur(b.pos.x + b.vel.x * 2, b.pos.y + b.vel.y * 2, 20, 20, 255, 200, 100);
  357. b.ticks = 0;
  358. addChild(b.sprite);
  359. }
  360. private function updateBullets():void
  361. {
  362. var totalSpeed:Number = 0;
  363. for each (var b:Bullet in bullets)
  364. {
  365. if (!b.exists) continue;
  366. b.pos.addMultiplied(b.vel, gameSpeed);
  367. if (!Field.contains(b.pos))
  368. {
  369. b.exists = false;
  370. removeChild(b.sprite);
  371. continue;
  372. }
  373. var a:Number = b.ticks * 0.1;
  374. bulletChar.setSpriteMatrix(b.sprite, b.pos, a, b.size, b.size);
  375. var sz:Number = b.size * (1.1 + Math.sin(b.ticks * 0.2) * 0.2);
  376. var cl:int = 128 + 64 + Math.sin(b.ticks * 0.3) * 64;
  377. addBlursOfAAChar(bulletChar, b.pos, a, sz, sz, cl, 100, 255);
  378. b.ticks += gameSpeed;
  379. totalSpeed += b.speed + 5.0;
  380. }
  381. if (totalSpeed > 500.0)
  382. {
  383. gameSpeed = 1.0 - (totalSpeed - 500.0) / 250.0;
  384. if (gameSpeed < 0.7) gameSpeed = 0.7;
  385. }
  386. else
  387. {
  388. gameSpeed = 1.0;
  389. }
  390. }
  391. private function updateSparks():void
  392. {
  393. for each (var s:Spark in sparks)
  394. {
  395. if (!s.exists) continue;
  396. s.pos.addMultiplied(s.vel, gameSpeed);
  397. s.vel.mul(1 - 0.05 * gameSpeed);
  398. s.size *= (1 - 0.05 * gameSpeed);
  399. if (!Field.contains(s.pos) || s.ticks <= 0)
  400. {
  401. s.exists = false;
  402. removeChild(s.sprite);
  403. continue;
  404. }
  405. var a:Number = s.ticks * 0.2;
  406. sparkChar.setSpriteMatrix(s.sprite, s.pos, a, s.size, s.size);
  407. addBlursOfAAChar(sparkChar, s.pos, a, s.size, s.size,
  408. 250, Math.random() * 128 + 128, 0);
  409. s.ticks -= gameSpeed;
  410. }
  411. }
  412. private function shipDestroyed():void
  413. {
  414. addSpark(shipPos, 0, Math.PI, 10.0, 6.0, 20);
  415. addSpark(shipPos, Math.PI / 2, 0, 30.0, 5.0, 10);
  416. addSpark(shipPos, -Math.PI / 2, 0, 30.0, 5.0, 10);
  417. shipInvincibleTicks = -SHIP_INVINCIBLE_TICKS * 1.5;
  418. removeChild(shipSprite);
  419. }
  420. private function addSpark(p:Vector2, angle:Number, ao:Number, speed:Number, size:Number, count:Number):void
  421. {
  422. for (var i:int = 0; i < count; i++)
  423. {
  424. var s:Spark = getActorInstance(Vector.(sparks));
  425. if (s == null) return;
  426. s.pos.x = p.x; s.pos.y = p.y;
  427. var a:Number = angle + ao * (Math.random() * 2 - 1);
  428. var sp:Number = speed * (0.5 + Math.random());
  429. s.vel.x = Math.sin(a) * sp;
  430. s.vel.y = -Math.cos(a) * sp;
  431. s.size = size;
  432. s.ticks = 15 + 15 * Math.random();
  433. sparkChar.setSpriteMatrix(s.sprite, s.pos, a, s.size, s.size);
  434. addChild(s.sprite);
  435. }
  436. }
  437. private function addBlursOfAAChar(ac:AAChar, p:Vector2, angle:Number, sx:Number = 1, sy:Number = 1,
  438. cr:int = -1, cg:int = -1, cb:int = -1):void
  439. {
  440. var br:int, bg:int, bb:int;
  441. if (cr >= 0)
  442. {
  443. br = cr; bg = cg; bb = cb;
  444. }
  445. for each (var b:Blur in ac.blurs)
  446. {
  447. offset.x = b.pos.x * sx; offset.y = b.pos.y * sy;
  448. offset.rotation(angle);
  449. if (cr < 0)
  450. {
  451. br = b.r; bg = b.g; bb = b.b;
  452. }
  453. addBlur(p.x + offset.x, p.y + offset.y, b.width * sx, b.height * sy, br, bg, bb);
  454. }
  455. }
  456. private function addBlur(x:Number, y:Number, w:Number, h:Number, r:int, g:int, b:int):void
  457. {
  458. if (blurCounts[blurIndex] >= BLUR_MAX_COUNT) return;
  459. var bl:Blur = blurs[blurIndex][blurCounts[blurIndex]];
  460. bl.pos.x = x + SCREEN_WIDTH / 2; bl.pos.y = y + SCREEN_HEIGHT / 2;
  461. bl.width = w; bl.height = h;
  462. bl.r = r; bl.g = g; bl.b = b;
  463. blurCounts[blurIndex]++;
  464. }
  465. private function updateBlur(b:Blur):void
  466. {
  467. rect.x = b.pos.x - b.width / 2 - Field.offsetX;
  468. rect.y = b.pos.y - b.height / 2;
  469. rect.width = b.width;
  470. rect.height = b.height;
  471. buffer.fillRect(rect, b.r * 0x10000 + b.g * 0x100 + b.b);
  472. b.width *= 1.2; b.height *= 1.2;
  473. var a:int = (b.r + b.g + b.b) / 3;
  474. b.r += (a - b.r) * 0.25;
  475. b.g += (a - b.g) * 0.25;
  476. b.b += (a - b.b) * 0.25;
  477. b.r *= 0.65; b.g *= 0.65; b.b *= 0.65;
  478. }
  479. private function getActorInstance(actors:Vector.):*
  480. {
  481. var al:int = actors.length
  482. for (var i:int = 0; i < al; i++)
  483. {
  484. if (!actors[i].exists)
  485. {
  486. actors[i].exists = true;
  487. return actors[i];
  488. }
  489. }
  490. return null;
  491. }
  492. }
  493. }
  494. import flash.display.BitmapData;
  495. import flash.display.Bitmap;
  496. import flash.display.Sprite;
  497. import flash.geom.Rectangle;
  498. import flash.geom.Matrix;
  499. import flash.text.TextField;
  500. import flash.text.TextFormat;
  501. import flash.events.KeyboardEvent;
  502. class Actor
  503. {
  504. public var exists:Boolean = false;
  505. public var pos:Vector2 = new Vector2;
  506. public var sprite:Sprite = new Sprite;
  507. public var ticks:Number;
  508. }
  509. class Shot extends Actor
  510. {
  511. public var angle:Number;
  512. }
  513. class Enemy extends Actor
  514. {
  515. public var angle:Number;
  516. public var speed:Number;
  517. public var speedRatio:Number;
  518. public var fireSpeedRatio:Number;
  519. public var fireIntervalRatio:Number;
  520. public var fireTicks:Number;
  521. public var fireSeqTicks:Number;
  522. public var fireCount:int;
  523. public var shield:int;
  524. public var isHit:Boolean;
  525. public var spec:EnemySpec;
  526. }
  527. class EnemySpec
  528. {
  529. public var size:Vector2 = new Vector2;
  530. public var scale:Vector2 = new Vector2;
  531. public var shield:int;
  532. public var aaChar:AAChar;
  533. public var appearanceTicks:Number;
  534. public function initialize(e:Enemy, shipPos:Vector2):void { }
  535. public function update(e:Enemy, shipPos:Vector2, main:AAShip):void {}
  536. }
  537. class Zako1 extends EnemySpec
  538. {
  539. private const SPEED:Number = 6;
  540. private const ANGLE_VELOCITY:Number = 0.05;
  541. private const FIRE_INTERVAL:Number = 60;
  542. private const BULLET_SPEED:Number = 5;
  543. public function Zako1()
  544. {
  545. size.x = size.y = 32;
  546. scale.x = scale.y = 1.0;
  547. shield = 1;
  548. aaChar = new AAChar(["", " v "], ["WGW", " C "], 2, 2);
  549. }
  550. override public function initialize(e:Enemy, shipPos:Vector2):void
  551. {
  552. e.pos.x = Field.size.x * (Math.random() * 2 - 1);
  553. e.pos.y = -Field.size.y;
  554. e.angle = Math.PI;
  555. e.speed = SPEED * e.speedRatio;
  556. }
  557. override public function update(e:Enemy, shipPos:Vector2, main:AAShip):void
  558. {
  559. e.pos.x += Math.sin(e.angle) * e.speed * AAShip.gameSpeed;
  560. e.pos.y -= Math.cos(e.angle) * e.speed * AAShip.gameSpeed;
  561. var pa:Number = Math.atan2(-e.pos.x + shipPos.x, e.pos.y - shipPos.y);
  562. var ao:Number = pa - e.angle;
  563. ao = Util.normalizeAngle(ao);
  564. if (ao > ANGLE_VELOCITY) e.angle += ANGLE_VELOCITY;
  565. else if (ao < -ANGLE_VELOCITY) e.angle -= ANGLE_VELOCITY;
  566. else e.angle = pa;
  567. e.angle = Util.normalizeAngle(e.angle);
  568. if (e.fireTicks <= 0)
  569. {
  570. e.fireTicks += FIRE_INTERVAL / e.fireIntervalRatio;
  571. main.fireBullet(e.pos, pa, BULLET_SPEED * e.fireSpeedRatio, 1.0);
  572. }
  573. }
  574. }
  575. class Mid1 extends EnemySpec
  576. {
  577. private const WAVE_INTERVAL:int = 120;
  578. private const SPEED:Number = 1;
  579. private const FIRE_INTERVAL:Number = 150;
  580. private const BULLET_SPEED:Number = 5;
  581. public function Mid1()
  582. {
  583. size.x = 64; size.y = 48;
  584. scale.x = scale.y = 1.2;
  585. shield = 16;
  586. aaChar = new AAChar([".__.", "\\##/"], ["RYYR", "WCCW"], 2, 2);
  587. }
  588. override public function initialize(e:Enemy, shipPos:Vector2):void
  589. {
  590. e.pos.x = Field.size.x * 0.6 * (Math.random() * 2 - 1);
  591. e.ticks = Math.random() * WAVE_INTERVAL;
  592. e.pos.y = -Field.size.y;
  593. e.angle = 0;
  594. e.speed = SPEED * (Math.random() + 1.0);
  595. e.fireSpeedRatio = Math.sqrt(e.fireSpeedRatio);
  596. e.fireIntervalRatio = Math.sqrt(e.fireIntervalRatio);
  597. }
  598. override public function update(e:Enemy, shipPos:Vector2, main:AAShip):void
  599. {
  600. var xa:Number = e.ticks * Math.PI * 2.0 / WAVE_INTERVAL;
  601. e.pos.x += Math.sin(xa) * 1.0 * AAShip.gameSpeed;
  602. e.angle = -Math.sin(xa) * 0.2;
  603. e.pos.y += e.speed * AAShip.gameSpeed;
  604. if (e.pos.y < 0)
  605. {
  606. if (e.fireTicks <= 0)
  607. {
  608. e.fireTicks += FIRE_INTERVAL / e.fireIntervalRatio;
  609. e.fireSeqTicks = 0;
  610. e.fireCount = 4;
  611. }
  612. if (e.fireCount > 0)
  613. {
  614. e.fireSeqTicks -= AAShip.gameSpeed;
  615. if (e.fireSeqTicks <= 0)
  616. {
  617. e.fireSeqTicks = 3;
  618. e.fireCount--;
  619. var pa:Number = Math.atan2(-e.pos.x + shipPos.x, e.pos.y - shipPos.y);
  620. for (var i:int = 0; i < 3; i++)
  621. {
  622. main.fireBullet(e.pos, pa - (i - 1) * 0.5,
  623. BULLET_SPEED * e.fireSpeedRatio * (1.0 + (3 - e.fireCount) * 0.25), 1.25);
  624. }
  625. }
  626. }
  627. }
  628. else
  629. {
  630. e.speed += (SPEED * 4 - e.speed) * 0.1;
  631. }
  632. }
  633. }
  634. class Bullet extends Actor
  635. {
  636. public var vel:Vector2 = new Vector2;
  637. public var speed:Number;
  638. public var size:Number;
  639. }
  640. class Spark extends Actor
  641. {
  642. public var vel:Vector2 = new Vector2;
  643. public var size:Number;
  644. }
  645. class Blur
  646. {
  647. public var pos:Vector2 = new Vector2;
  648. public var width:Number, height:Number;
  649. public var r:int, g:int, b:int;
  650. }
  651. class Field
  652. {
  653. public static const SIDE_BOARD_WIDTH:Number = AAShip.SCREEN_WIDTH / 6;
  654. private static const STAR_COUNT:int = 256;
  655. public static var size:Vector2;
  656. public static var offsetX:Number;
  657. private static var stars:Vector.;
  658. private static var rect:Rectangle = new Rectangle;
  659. public static function initialize():void
  660. {
  661. size = new Vector2;
  662. size.x = AAShip.SCREEN_WIDTH * 1.1 / 2; size.y = AAShip.SCREEN_HEIGHT * 1.1 / 2;
  663. stars = new Vector.(STAR_COUNT, true);
  664. for (var i:int = 0; i < STAR_COUNT; i++)
  665. {
  666. var s:Star = new Star;
  667. var z:Number = 1.0 + Math.random() * 10;
  668. var sz:int = (5 + Math.random() * 5) / z;
  669. if (sz < 1) sz = 1;
  670. s.pos.x = (Math.random() * 2 - 1) * size.x - sz;
  671. s.pos.y = (Math.random() * 2 - 1) * size.y - sz;
  672. s.size = sz;
  673. s.velRatio = 1.0 / z;
  674. s.color = (int)(Math.random() * 127 + 128) * 0x100 +
  675. (int)(Math.random() * 127 + 128);
  676. stars[i] = s;
  677. }
  678. }
  679. public static function draw(buffer:BitmapData):void
  680. {
  681. for each (var s:Star in stars)
  682. {
  683. rect.x = s.pos.x - offsetX * s.velRatio + AAShip.SCREEN_WIDTH / 2;
  684. rect.y = s.pos.y + AAShip.SCREEN_HEIGHT / 2;
  685. rect.width = rect.height = s.size;
  686. buffer.fillRect(rect, s.color);
  687. s.pos.y += 3.0 * s.velRatio;
  688. if (s.pos.y > size.y) s.pos.y -= size.y * 2;
  689. }
  690. }
  691. public static function drawSideBoard(buffer:BitmapData):void
  692. {
  693. rect.width = SIDE_BOARD_WIDTH;
  694. rect.height = AAShip.SCREEN_HEIGHT;
  695. rect.x = rect.y = 0;
  696. buffer.fillRect(rect, 0);
  697. rect.x = AAShip.SCREEN_WIDTH - rect.width;
  698. buffer.fillRect(rect, 0);
  699. }
  700. public static function contains(p:Vector2):Boolean
  701. {
  702. return (p.x >= -size.x && p.x <= size.x && p.y >= -size.y && p.y <= size.y);
  703. }
  704. }
  705. class Star
  706. {
  707. public var pos:Vector2 = new Vector2;
  708. public var size:Number;
  709. public var color:int;
  710. public var velRatio:Number;
  711. }
  712. class AAChar
  713. {
  714. private static const COLOR_PATTERNS:Array =
  715. [["R", 250, 100, 100], ["G", 100, 250, 100], ["B", 100, 100, 250],
  716. ["Y", 250, 250, 100], ["P", 250, 100, 250], ["C", 100, 250, 250],
  717. ["W", 250, 250, 250]];
  718. private const CHAR_SIZE:int = 24;
  719. private const CHAR_OFFSET_X:int = 14;
  720. private const CHAR_OFFSET_Y:int = 17;
  721. private const CHAR_HEIGHT:int = 24;
  722. private static var colorCount:int;
  723. private static var textFormats:Vector. = new Vector.;
  724. public var textFields:Vector. = new Vector.;
  725. public var blurs:Vector. = new Vector.;
  726. public var width:int, height:int;
  727. private var bitmapData:BitmapData;
  728. public static function initialize():void
  729. {
  730. colorCount = 0;
  731. for each (var cp:Array in COLOR_PATTERNS)
  732. {
  733. var tf:TextFormat = new TextFormat;
  734. tf.font = "_typewriter";
  735. tf.bold = true;
  736. tf.size = 24;
  737. tf.leading = -10;
  738. tf.color = (int)(cp[1] * 0.75) * 0x10000 + (int)(cp[2] * 0.75) * 0x100 + (int)(cp[3] * 0.75);
  739. textFormats.push(tf);
  740. colorCount++;
  741. }
  742. }
  743. public function AAChar(chars:Array, colors:Array, divX:int = 1, divY:int = 1)
  744. {
  745. var i:int;
  746. var tfts:Vector. = new Vector.(colorCount, true);
  747. var tffs:Vector. = new Vector.(colorCount, true);
  748. for (i = 0; i < colorCount; i++)
  749. {
  750. tfts[i] = "";
  751. tffs[i] = false;
  752. }
  753. var cx:int, cy:int = 0;
  754. var bd:BitmapData;
  755. var tf:TextField;
  756. var b:Blur;
  757. for (i = 0; i < chars.length; i++)
  758. {
  759. var str:String = chars[i];
  760. var colorStr:String = colors[i];
  761. cx = 0;
  762. var j:int;
  763. for (j = 0; j < str.length; j++)
  764. {
  765. var c:String = str.charAt(j);
  766. var color:String = colorStr.charAt(j);
  767. var ci:int;
  768. for (var k:int = 0; k < colorCount; k++)
  769. {
  770. if (color == COLOR_PATTERNS[k][0])
  771. {
  772. tfts[k] += c;
  773. tffs[k] = true;
  774. ci = k;
  775. }
  776. else
  777. {
  778. tfts[k] += " ";
  779. }
  780. }
  781. bd = new BitmapData(CHAR_SIZE, CHAR_SIZE, false, 0);
  782. tf = new TextField;
  783. tf.defaultTextFormat = textFormats[ci];
  784. tf.text = c;
  785. bd.draw(tf);
  786. for (var dx:int = 0; dx < divX; dx++)
  787. {
  788. for (var dy:int = 0; dy < divY; dy++)
  789. {
  790. var minX:int = CHAR_SIZE, maxX:int = -1;
  791. var minY:int = CHAR_SIZE, maxY:int = -1;
  792. for (var x:int = dx * CHAR_SIZE / divX; x < (dx + 1) * CHAR_SIZE / divX; x++)
  793. {
  794. for (var y:int = dy * CHAR_SIZE / divY; y < (dy + 1) * CHAR_SIZE / divY; y++)
  795. {
  796. if (bd.getPixel(x, y) > 0)
  797. {
  798. if (minX > x) minX = x;
  799. if (maxX < x) maxX = x;
  800. if (minY > y) minY = y;
  801. if (maxY < y) maxY = y;
  802. }
  803. }
  804. }
  805. if (maxX >= 0)
  806. {
  807. b = new Blur;
  808. b.width = maxX - minX + 1;
  809. b.height = maxY - minY + 1;
  810. b.pos.x = minX + cx * CHAR_OFFSET_X + b.width / 2;
  811. b.pos.y = minY + cy * CHAR_OFFSET_Y + b.height / 2;
  812. b.r = COLOR_PATTERNS[ci][1] + (255 - COLOR_PATTERNS[ci][1]) * 0.5;
  813. b.g = COLOR_PATTERNS[ci][2] + (255 - COLOR_PATTERNS[ci][2]) * 0.5;
  814. b.b = COLOR_PATTERNS[ci][3] + (255 - COLOR_PATTERNS[ci][3]) * 0.5;
  815. blurs.push(b);
  816. }
  817. }
  818. }
  819. cx++;
  820. }
  821. for (j = 0; j < colorCount; j++)
  822. {
  823. tfts[j] += "\n";
  824. }
  825. cy++;
  826. }
  827. width = cx * CHAR_OFFSET_X;
  828. height = cy * CHAR_HEIGHT;
  829. for (i = 0; i < colorCount; i++)
  830. {
  831. if (!tffs[i]) continue;
  832. tf = new TextField;
  833. tf.defaultTextFormat = textFormats[i];
  834. tf.multiline = true;
  835. tf.text = tfts[i];
  836. textFields.push(tf);
  837. }
  838. for each (b in blurs)
  839. {
  840. b.pos.x -= width / 2;
  841. b.pos.y -= height / 2;
  842. }
  843. bitmapData = new BitmapData(width, height, true, 0);
  844. for each (tf in textFields)
  845. {
  846. bitmapData.draw(tf);
  847. }
  848. }
  849. public function drawToSprite(s:Sprite):void
  850. {
  851. while (s.numChildren > 0)
  852. {
  853. s.removeChildAt(0);
  854. }
  855. s.addChild(new Bitmap(bitmapData));
  856. }
  857. public function setSpriteMatrix(s:Sprite, p:Vector2, angle:Number, sx:Number = 1, sy:Number = 1):void
  858. {
  859. var m:Matrix = new Matrix;
  860. m.translate(-width / 2, -height / 2);
  861. m.scale(sx, sy);
  862. m.rotate(angle);
  863. m.translate(p.x + AAShip.SCREEN_WIDTH / 2 - Field.offsetX, p.y + AAShip.SCREEN_HEIGHT / 2);
  864. s.transform.matrix = m;
  865. }
  866. }
  867. // Utility classes.
  868. class Vector2
  869. {
  870. public var x:Number = 0;
  871. public var y:Number = 0;
  872. public function add(v:Vector2):void
  873. {
  874. x += v.x;
  875. y += v.y;
  876. }
  877. public function addMultiplied(v:Vector2, mv:Number):void
  878. {
  879. x += v.x * mv;
  880. y += v.y * mv;
  881. }
  882. public function sub(v:Vector2):void
  883. {
  884. x -= v.x;
  885. y -= v.y;
  886. }
  887. public function mul(v:Number):void
  888. {
  889. x *= v;
  890. y *= v;
  891. }
  892. public function div(v:Number):void
  893. {
  894. x /= v;
  895. y /= v;
  896. }
  897. public function normalize():void
  898. {
  899. div(length);
  900. }
  901. public function get length():Number
  902. {
  903. return Math.sqrt(x * x + y * y);
  904. }
  905. public function getRoughDistance(p:Vector2):Number
  906. {
  907. return Math.abs(x - p.x) + Math.abs(y - p.y);
  908. }
  909. public function rotation(v:Number):void
  910. {
  911. var sv:Number = Math.sin(v);
  912. var cv:Number = Math.cos(v);
  913. var rx:Number = cv * x - sv * y;
  914. y = sv * x + cv * y;
  915. x = rx;
  916. }
  917. }
  918. class Key
  919. {
  920. public static var left:Boolean, up:Boolean, right:Boolean, down:Boolean;
  921. public static var button1:Boolean;
  922. public static function onKeyUp(event:KeyboardEvent):void
  923. {
  924. switch (event.keyCode)
  925. {
  926. case 0x25:
  927. case 0x41:
  928. {
  929. left = false;
  930. break;
  931. }
  932. case 0x26:
  933. case 0x57:
  934. {
  935. up = false;
  936. break;
  937. }
  938. case 0x27:
  939. case 0x44:
  940. {
  941. right = false;
  942. break;
  943. }
  944. case 0x28:
  945. case 0x53:
  946. {
  947. down = false;
  948. break;
  949. }
  950. case 0x5a:
  951. case 0xbf:
  952. case 0x58:
  953. case 0xbe:
  954. {
  955. button1 = false;
  956. break;
  957. }
  958. }
  959. }
  960. public static function onKeyDown(event:KeyboardEvent):void
  961. {
  962. switch (event.keyCode)
  963. {
  964. case 0x25:
  965. case 0x41:
  966. {
  967. left = true;
  968. break;
  969. }
  970. case 0x26:
  971. case 0x57:
  972. {
  973. up = true;
  974. break;
  975. }
  976. case 0x27:
  977. case 0x44:
  978. {
  979. right = true;
  980. break;
  981. }
  982. case 0x28:
  983. case 0x53:
  984. {
  985. down = true;
  986. break;
  987. }
  988. case 0x5a:
  989. case 0xbf:
  990. case 0x58:
  991. case 0xbe:
  992. {
  993. button1 = true;
  994. break;
  995. }
  996. }
  997. }
  998. }
  999. class Util
  1000. {
  1001. public static function normalizeAngle(v:Number):Number
  1002. {
  1003. if (v > Math.PI) return v - Math.PI * 2;
  1004. else if (v < -Math.PI) return v + Math.PI * 2;
  1005. else return v;
  1006. }
  1007. }
noswf
Get Adobe Flash Player