SpaceGame.js 8.9 KB

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