SpaceGame.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. 'atomic component';
  2. var UI = require("UI/ui");
  3. var options = require("UI/options")
  4. exports.component = function(self) {
  5. var game = Atomic.game;
  6. // expose ourselves as a global, this is invalid in "use strict"; which perhaps we should be using
  7. // to enforce better form
  8. SpaceGame = self;
  9. createScene();
  10. self.halfWidth = game.graphics.width * Atomic.PIXEL_SIZE * 0.5;
  11. self.halfHeight = game.graphics.height * Atomic.PIXEL_SIZE * 0.5;
  12. var enemyBaseDir = false;
  13. var enemyBaseNode = self.myscene.createChild("EnemyBaseNode");
  14. var enemyBasePosX = 0;
  15. var score = 0;
  16. self.enemies = [];
  17. self.gameOver = false;
  18. self.random = function random(min, max) {
  19. return Math.random() * (max - min) + min;
  20. }
  21. self.spawnBullet = function(pos, isPlayer) {
  22. var bulletNode = self.myscene.createChild("Bullet");
  23. var bullet = bulletNode.createJSComponent("Components/Bullet.js");
  24. bullet.init(isPlayer, pos);
  25. }
  26. self.removeEnemy = function(enemy) {
  27. score += 10;
  28. self.hud.updateScore(score);
  29. self.enemies.splice(self.enemies.indexOf(enemy), 1);
  30. Atomic.destroy(enemy.node);
  31. }
  32. self.capitalShipDestroyed = function() {
  33. score += 1000;
  34. self.hud.updateScore(score);
  35. Atomic.destroy(self.capitalShipNode);
  36. self.capitalShipNode = self.capitalShip = null;
  37. }
  38. function spawnEnemies() {
  39. self.capitalShipNode = self.myscene.createChild("CapitalShip");
  40. self.capitalShip = self.capitalShipNode.createJSComponent("Components/CapitalShip.js");
  41. var pos = [0, 0];
  42. pos[1] = self.halfHeight - 2.5;
  43. for (var y = 0; y < 2; y++) {
  44. pos[0] = -4.5;
  45. for (var x = 0; x < 12; x++) {
  46. var enemyNode = enemyBaseNode.createChild("Enemy");
  47. var enemy = enemyNode.createJSComponent("Components/Enemy.js", {
  48. spriteName: Math.random() < .85 ? "spaceship_louse" : "spaceship_scarab",
  49. spawnPosition: [pos[0], pos[1]]
  50. });
  51. self.enemies.push(enemy);
  52. pos[0] += 0.75;
  53. }
  54. pos[1] -= 0.75;
  55. }
  56. }
  57. function updateEnemies(timeStep) {
  58. if (!enemyBaseDir)
  59. enemyBasePosX += timeStep;
  60. else
  61. enemyBasePosX -= timeStep;
  62. var xvalue = 2;
  63. if (enemyBasePosX > xvalue) {
  64. enemyBasePosX = xvalue;
  65. enemyBaseDir = !enemyBaseDir;
  66. }
  67. if (enemyBasePosX < -xvalue) {
  68. enemyBasePosX = -xvalue;
  69. enemyBaseDir = !enemyBaseDir;
  70. }
  71. enemyBaseNode.position2D = [enemyBasePosX, 0];
  72. }
  73. self.cleanup = function() {
  74. //if its a mobile
  75. if(Atomic.platform == "Android" || Atomic.platform == "iOS") {
  76. //remove dpad
  77. Atomic.game.dpad.remove();
  78. //remove fireButton
  79. Atomic.game.uiView.removeChild(self.fireButton);
  80. }
  81. game.renderer.setViewport(1, null);
  82. self.hud.cleanup();
  83. Atomic.destroy(self.myscene);
  84. // our node is in the main scene
  85. Atomic.destroy(self.node);
  86. SpaceGame = null;
  87. }
  88. self.win = function() {
  89. self.hud.updateGameText("YOU WIN!!!!");
  90. self.gameOver = true;
  91. UI.showGameOver();
  92. //self.cleanup();
  93. }
  94. self.lose = function() {
  95. self.hud.updateGameText("YOU LOSE!!!!");
  96. self.gameOver = true;
  97. UI.showGameOver();
  98. //self.cleanup();
  99. }
  100. function spawnPlayer() {
  101. self.playerNode = self.myscene.createChild("Player");
  102. self.player = self.playerNode.createJSComponent("Components/Player.js");
  103. }
  104. function createScene() {
  105. var scene = new Atomic.Scene();
  106. scene.createComponent("Octree");
  107. var cameraNode = scene.createChild("Camera");
  108. cameraNode.position = [0.0, 0.0, -10.0];
  109. var camera = cameraNode.createComponent("Camera");
  110. camera.orthographic = true;
  111. camera.orthoSize = game.graphics.height * Atomic.PIXEL_SIZE;
  112. var viewport = new Atomic.Viewport(scene, camera);
  113. // assign a render path to our viewport which doesn't clear the screen
  114. // so can be used to composite
  115. var renderPathXML = game.cache.getResource("XMLFile", "Data/RenderPath.xml");
  116. viewport.renderPath = renderPathXML;
  117. // Example of appending a post process filter
  118. if (options.getOptions().blackAndWhite)
  119. viewport.renderPath.append(game.cache.getResource("XMLFile", "PostProcess/GreyScale.xml"));
  120. if (options.getOptions().blur)
  121. viewport.renderPath.append(game.cache.getResource("XMLFile", "PostProcess/Blur.xml"));
  122. game.renderer.setViewport(1, viewport);
  123. // this is component getScene property (there is no setter on it)
  124. // this should be an error, think I saw somewhere you can raise errors on
  125. // get/set of a prop when the get/set missing
  126. self.myscene = scene;
  127. self.cameraNode = cameraNode;
  128. self.camera = camera;
  129. self.viewport = viewport;
  130. }
  131. self.start = function() {
  132. var hudnode = self.myscene.createChild();
  133. self.hud = hudnode.createJSComponent("Components/HUD.js");
  134. //if its a mobile
  135. if(Atomic.platform == "Android" || Atomic.platform == "iOS") {
  136. //require ours dpad module
  137. var DPad = require("DPad");
  138. //create dpad
  139. var dpad = new DPad();
  140. //add only horizontal buttons
  141. dpad.addHorizontal();
  142. //init with existing ui
  143. dpad.init(Atomic.game.uiView);
  144. //set X spacing
  145. dpad.setSpacingX(50);
  146. Atomic.game.dpad = dpad;
  147. //create a jump button
  148. self.fireButton = new Atomic.UIButton();
  149. //unset its skin, because we will use UIImageWidget
  150. self.fireButton.skinBg = "";
  151. //create ours fire button image
  152. var fireButtonImage = new Atomic.UIImageWidget();
  153. //load image
  154. fireButtonImage.setImage("UI/fireButton.png");
  155. //resize ours image by 2.2x
  156. var fireButtonWidth = fireButtonImage.imageWidth*2.2;
  157. var fireButtonHeight = fireButtonImage.imageHeight*2.2;
  158. //calculate position
  159. var posX = Atomic.graphics.width - Atomic.graphics.width/8-fireButtonWidth/2;
  160. var posY = Atomic.graphics.height - Atomic.graphics.height/4-fireButtonHeight/2;
  161. //sets fireButton rect, specify position and end position
  162. self.fireButton.rect = [posX, posY, posX+fireButtonWidth, posY+fireButtonHeight];
  163. //sets fireButtonImage rect, we specify there only end position
  164. fireButtonImage.rect = [0, 0, fireButtonWidth, fireButtonHeight];
  165. //adds image to fireButton
  166. self.fireButton.addChild(fireButtonImage);
  167. //adds fireButton to the dpad view
  168. dpad.view.addChild(self.fireButton);
  169. //sets fireButton capturing to false, because we wanna make it multitouchable
  170. self.fireButton.setCapturing(false);
  171. //binds fireButton to KEY_SPACE
  172. Atomic.input.bindButton(self.fireButton, Atomic.KEY_SPACE);
  173. }
  174. spawnPlayer();
  175. spawnEnemies();
  176. }
  177. self.update = function(timeStep) {
  178. updateEnemies(timeStep);
  179. }
  180. }