/World.as

https://github.com/bitc/tunnelgame · ActionScript · 305 lines · 247 code · 52 blank · 6 comment · 22 complexity · 7cd6091b7c7586b02fde030e45178908 MD5 · raw file

  1. package
  2. {
  3. import flash.display.Sprite;
  4. import flash.display.Shape;
  5. import flash.geom.Point;
  6. import flash.display.Bitmap;
  7. public class World extends Sprite
  8. {
  9. public function World(scoreKeeper : ScoreKeeper)
  10. {
  11. mouseEnabled = false;
  12. mouseChildren = false;
  13. tunnel = new Tunnel();
  14. ship = new Ship(this);
  15. this.scoreKeeper = scoreKeeper;
  16. shipBullets = new Array();
  17. enemyBullets = new Array();
  18. particles = new Array();
  19. enemies = new Array();
  20. var startingPos : Number = 1;
  21. var startPoint : Point = tunnel.getPos(startingPos);
  22. ship.x = startPoint.x;
  23. ship.y = startPoint.y;
  24. ship.tunnelQuad = uint(tunnel.getRibsPerSegment() * startingPos);
  25. // Start in the middle of the tunnel
  26. tunnelPos = 1.0;
  27. cameraShake = 0;
  28. surface = new Surface();
  29. surfaceShape = new Shape();
  30. surfaceShape.graphics.beginFill(0x0000FF);
  31. surfaceShape.graphics.beginBitmapFill(surface.bitmapData);
  32. surfaceShape.graphics.lineStyle();
  33. surfaceShape.graphics.drawRect(-100000, -100000, 200000, 200000);
  34. surfaceShape.graphics.endFill();
  35. tunnelShape = new Shape();
  36. addChild(surfaceShape);
  37. addChild(tunnelShape);
  38. addChild(ship);
  39. drawTunnel();
  40. var pos : Point = tunnel.getPos(tunnelPos);
  41. x = (VIEWPORT_WIDTH/2) - pos.x;
  42. y = (VIEWPORT_HEIGHT/2) - pos.y;
  43. }
  44. [Embed(source="surface.jpg")]
  45. private var Surface : Class;
  46. private var surface : Bitmap;
  47. private var tunnelShape : Shape;
  48. private var surfaceShape : Shape;
  49. public static const VIEWPORT_WIDTH : int = 480;
  50. public static const VIEWPORT_HEIGHT : int = 480;
  51. public var tunnelPos : Number;
  52. // Number of frames left for camera shake effect
  53. private var cameraShake : int;
  54. public var tunnel : Tunnel;
  55. public var ship : Ship;
  56. public var scoreKeeper : ScoreKeeper;
  57. public var shipBullets : Array;
  58. public var enemyBullets : Array;
  59. public var particles : Array;
  60. public var enemies : Array;
  61. public function addShipBullet(bullet : ShipBullet) : void
  62. {
  63. shipBullets.push(bullet);
  64. addChild(bullet);
  65. }
  66. public function removeShipBullet(bullet : ShipBullet) : void
  67. {
  68. shipBullets.splice(shipBullets.indexOf(bullet), 1);
  69. removeChild(bullet);
  70. }
  71. public function addEnemyBullet(bullet : EnemyBullet) : void
  72. {
  73. enemyBullets.push(bullet);
  74. addChild(bullet);
  75. }
  76. public function removeEnemyBullet(bullet : EnemyBullet) : void
  77. {
  78. enemyBullets.splice(enemyBullets.indexOf(bullet), 1);
  79. removeChild(bullet);
  80. }
  81. public function addParticle(particle : Particle) : void
  82. {
  83. particles.push(particle);
  84. addChild(particle);
  85. }
  86. public function removeParticle(particle : Particle) : void
  87. {
  88. particles.splice(particles.indexOf(particle), 1);
  89. removeChild(particle);
  90. }
  91. public function addEnemy(enemy : Enemy) : void
  92. {
  93. enemies.push(enemy);
  94. addChild(enemy);
  95. }
  96. public function removeEnemy(enemy : Enemy) : void
  97. {
  98. enemies.splice(enemies.indexOf(enemy), 1);
  99. removeChild(enemy);
  100. }
  101. public function doCameraShake(numFrames : int) : void
  102. {
  103. if (numFrames > cameraShake) // If camera already has a larger shake then don't lower it
  104. cameraShake = numFrames;
  105. }
  106. public function pointInViewport(p : Point, margin : Number) : Boolean
  107. {
  108. var pos : Point = tunnel.getPos(tunnelPos);
  109. if(p.x < pos.x - VIEWPORT_WIDTH/2 - margin)
  110. return false;
  111. if(p.x > pos.x + VIEWPORT_WIDTH/2 + margin)
  112. return false;
  113. if(p.y < pos.y - VIEWPORT_HEIGHT/2 - margin)
  114. return false;
  115. if(p.y > pos.y + VIEWPORT_WIDTH/2 + margin)
  116. return false;
  117. return true;
  118. }
  119. public function tick(controller : Controller) : void
  120. {
  121. var oldPos : Point = tunnel.getPos(tunnelPos);
  122. var advancementSpeed : Number = 0.005;
  123. tunnelPos += advancementSpeed;
  124. var pos : Point = tunnel.getPos(tunnelPos);
  125. var advancementVel : Point = pos.subtract(oldPos);
  126. var relativeShipVel : Point = (new Point(ship.velx, ship.vely)).subtract(advancementVel);
  127. // TODO this may be buggy...
  128. var viewportBounce : Number = 0.4;
  129. if(ship.x < pos.x - VIEWPORT_WIDTH/2)
  130. {
  131. ship.x = pos.x - VIEWPORT_WIDTH/2;
  132. ship.velx = -relativeShipVel.x*viewportBounce + advancementVel.x;
  133. }
  134. if(ship.y < pos.y - VIEWPORT_HEIGHT/2)
  135. {
  136. ship.y = pos.y - VIEWPORT_HEIGHT/2;
  137. ship.vely = -relativeShipVel.y*viewportBounce + advancementVel.y;
  138. }
  139. if(ship.x > pos.x + VIEWPORT_WIDTH/2)
  140. {
  141. ship.x = pos.x + VIEWPORT_WIDTH/2;
  142. ship.velx = -relativeShipVel.x*viewportBounce + advancementVel.x;
  143. }
  144. if(ship.y > pos.y + VIEWPORT_HEIGHT/2)
  145. {
  146. ship.y = pos.y + VIEWPORT_HEIGHT/2;
  147. ship.vely = -relativeShipVel.y*viewportBounce + advancementVel.y;
  148. }
  149. ship.tick(controller);
  150. if(Point.distance(pos, tunnel.getP3()) <= 480)
  151. {
  152. tunnel.nextSegment();
  153. drawTunnel();
  154. spawnEnemies();
  155. }
  156. if(cameraShake > 0)
  157. {
  158. cameraShake--;
  159. }
  160. x = (VIEWPORT_WIDTH/2) - pos.x + (Math.random()-0.5) * cameraShake * 2;
  161. y = (VIEWPORT_HEIGHT/2) - pos.y + (Math.random()-0.5) * cameraShake * 2;
  162. tickEntities();
  163. checkShipCollisions();
  164. checkShipBulletCollisions();
  165. }
  166. private function tickEntities() : void
  167. {
  168. // Traverse over copies of the arrays because they might be modified during traversal
  169. var i : uint;
  170. var shipBulletsCopy : Array = shipBullets.slice();
  171. for(i = 0; i < shipBulletsCopy.length; ++i)
  172. {
  173. var shipBullet : ShipBullet = shipBulletsCopy[i];
  174. shipBullet.tick();
  175. }
  176. var enemyBulletsCopy : Array = enemyBullets.slice();
  177. for(i = 0; i < enemyBulletsCopy.length; ++i)
  178. {
  179. var enemyBullet : EnemyBullet = enemyBulletsCopy[i];
  180. enemyBullet.tick();
  181. }
  182. var particlesCopy : Array = particles.slice();
  183. for(i = 0; i < particlesCopy.length; ++i)
  184. {
  185. var particle : Particle = particlesCopy[i];
  186. particle.tick();
  187. }
  188. var enemiesCopy : Array = enemies.slice();
  189. for(i = 0; i < enemiesCopy.length; ++i)
  190. {
  191. var enemy : Enemy = enemiesCopy[i];
  192. enemy.tick();
  193. }
  194. }
  195. private function checkShipBulletCollisions() : void
  196. {
  197. // Traverse over copies of the arrays because they might be modified during traversal
  198. var i : uint;
  199. var j : uint;
  200. var shipBulletsCopy : Array = shipBullets.slice();
  201. var enemiesCopy : Array = enemies.slice();
  202. for(i = 0; i < shipBulletsCopy.length; i++)
  203. {
  204. for(j = 0; j < enemiesCopy.length; j++)
  205. {
  206. // Verify that the current Enemy has not been destroyed
  207. if(enemies.indexOf(enemiesCopy[j]) >= 0)
  208. {
  209. var shipBullet : ShipBullet = shipBulletsCopy[i];
  210. var enemy : Enemy = enemiesCopy[j];
  211. enemy.performBulletCollision(shipBullet);
  212. }
  213. }
  214. }
  215. }
  216. private function checkShipCollisions() : void
  217. {
  218. var i : uint;
  219. var enemyBulletsCopy : Array = enemyBullets.slice();
  220. for(i = 0; i < enemyBulletsCopy.length; i++)
  221. {
  222. var enemyBullet : EnemyBullet = enemyBulletsCopy[i];
  223. ship.performBulletCollision(enemyBullet);
  224. }
  225. var enemiesCopy : Array = enemies.slice();
  226. for(i = 0; i < enemiesCopy.length; i++)
  227. {
  228. var enemy : Enemy = enemiesCopy[i];
  229. ship.performEnemyCollision(enemy);
  230. }
  231. }
  232. private function drawTunnel() : void
  233. {
  234. tunnelShape.graphics.clear();
  235. tunnel.drawLines(tunnelShape.graphics);
  236. tunnel.drawQuads(tunnelShape.graphics);
  237. }
  238. private function spawnEnemies() : void
  239. {
  240. var i : int;
  241. var head : Number = tunnel.getHead();
  242. for(i = 0; i < 8; i++)
  243. {
  244. if(Math.random() <= 0.2)
  245. {
  246. var pos : Point = tunnel.getPos(head + 1 + (Number(i)/8));
  247. var newEnemy : Enemy = new Enemy(this, pos, head*8 + 8 + i);
  248. addEnemy(newEnemy);
  249. }
  250. }
  251. }
  252. }
  253. }