SpaceGame.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. var UI = require("UI/ui");
  2. var options = require("UI/options")
  3. exports.component = function(self) {
  4. var game = Atomic.game;
  5. // expose ourselves as a global, this is invalid in "use strict"; which perhaps we should be using
  6. // to enforce better form
  7. SpaceGame = self;
  8. createScene();
  9. self.halfWidth = game.graphics.width * Atomic.PIXEL_SIZE * 0.5;
  10. self.halfHeight = game.graphics.height * Atomic.PIXEL_SIZE * 0.5;
  11. var enemyBaseDir = false;
  12. var enemyBaseNode = self.myscene.createChild("EnemyBaseNode");
  13. var enemyBasePosX = 0;
  14. var score = 0;
  15. self.enemies = [];
  16. self.gameOver = false;
  17. self.random = function random(min, max) {
  18. return Math.random() * (max - min) + min;
  19. }
  20. self.spawnBullet = function(pos, isPlayer) {
  21. var bulletNode = self.myscene.createChild("Bullet");
  22. var bullet = bulletNode.createJSComponent("Components/Bullet.js");
  23. bullet.init(isPlayer, pos);
  24. }
  25. self.removeEnemy = function(enemy) {
  26. score += 10;
  27. self.hud.updateScore(score);
  28. self.enemies.splice(self.enemies.indexOf(enemy), 1);
  29. Atomic.destroy(enemy.node);
  30. }
  31. self.capitalShipDestroyed = function() {
  32. score += 1000;
  33. self.hud.updateScore(score);
  34. Atomic.destroy(self.capitalShipNode);
  35. self.capitalShipNode = self.capitalShip = null;
  36. }
  37. function spawnEnemies() {
  38. self.capitalShipNode = self.myscene.createChild("CapitalShip");
  39. self.capitalShip = self.capitalShipNode.createJSComponent("Components/CapitalShip.js");
  40. var pos = [0, 0];
  41. pos[1] = self.halfHeight - 2.5;
  42. for (var y = 0; y < 2; y++) {
  43. pos[0] = -4.5;
  44. for (var x = 0; x < 12; x++) {
  45. var enemyNode = enemyBaseNode.createChild("Enemy");
  46. var enemy = enemyNode.createJSComponent("Components/Enemy.js", {
  47. spriteName: Math.random() < .85 ? "spaceship_louse" : "spaceship_scarab",
  48. spawnPosition: [pos[0], pos[1]]
  49. });
  50. self.enemies.push(enemy);
  51. pos[0] += 0.75;
  52. }
  53. pos[1] -= 0.75;
  54. }
  55. }
  56. function updateEnemies(timeStep) {
  57. if (!enemyBaseDir)
  58. enemyBasePosX += timeStep;
  59. else
  60. enemyBasePosX -= timeStep;
  61. var xvalue = 2;
  62. if (enemyBasePosX > xvalue) {
  63. enemyBasePosX = xvalue;
  64. enemyBaseDir = !enemyBaseDir;
  65. }
  66. if (enemyBasePosX < -xvalue) {
  67. enemyBasePosX = -xvalue;
  68. enemyBaseDir = !enemyBaseDir;
  69. }
  70. enemyBaseNode.position2D = [enemyBasePosX, 0];
  71. }
  72. self.cleanup = function() {
  73. game.renderer.setViewport(1, null);
  74. self.hud.cleanup();
  75. Atomic.destroy(self.myscene);
  76. // our node is in the main scene
  77. Atomic.destroy(self.node);
  78. SpaceGame = null;
  79. }
  80. self.win = function() {
  81. self.hud.updateGameText("YOU WIN!!!!");
  82. self.gameOver = true;
  83. UI.showGameOver();
  84. //self.cleanup();
  85. }
  86. self.lose = function() {
  87. self.hud.updateGameText("YOU LOSE!!!!");
  88. self.gameOver = true;
  89. UI.showGameOver();
  90. //self.cleanup();
  91. }
  92. function spawnPlayer() {
  93. self.playerNode = self.myscene.createChild("Player");
  94. self.player = self.playerNode.createJSComponent("Components/Player.js");
  95. }
  96. function createScene() {
  97. var scene = new Atomic.Scene();
  98. scene.createComponent("Octree");
  99. var cameraNode = scene.createChild("Camera");
  100. cameraNode.position = [0.0, 0.0, -10.0];
  101. var camera = cameraNode.createComponent("Camera");
  102. camera.orthographic = true;
  103. camera.orthoSize = game.graphics.height * Atomic.PIXEL_SIZE;
  104. var viewport = new Atomic.Viewport(scene, camera);
  105. // assign a render path to our viewport which doesn't clear the screen
  106. // so can be used to composite
  107. var renderPathXML = game.cache.getResource("XMLFile", "Data/RenderPath.xml");
  108. viewport.renderPath = renderPathXML;
  109. // Example of appending a post process filter
  110. if (options.getOptions().blackAndWhite)
  111. viewport.renderPath.append(game.cache.getResource("XMLFile", "PostProcess/GreyScale.xml"));
  112. if (options.getOptions().blur)
  113. viewport.renderPath.append(game.cache.getResource("XMLFile", "PostProcess/Blur.xml"));
  114. game.renderer.setViewport(1, viewport);
  115. // this is component getScene property (there is no setter on it)
  116. // this should be an error, think I saw somewhere you can raise errors on
  117. // get/set of a prop when the get/set missing
  118. self.myscene = scene;
  119. self.cameraNode = cameraNode;
  120. self.camera = camera;
  121. self.viewport = viewport;
  122. }
  123. self.start = function() {
  124. var hudnode = self.myscene.createChild();
  125. self.hud = hudnode.createJSComponent("Components/HUD.js");
  126. spawnPlayer();
  127. spawnEnemies();
  128. }
  129. self.update = function(timeStep) {
  130. updateEnemies(timeStep);
  131. }
  132. }