App.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. var App = function(aSettings, aCanvas) {
  2. var app = this;
  3. var model,
  4. canvas,
  5. context,
  6. webSocket,
  7. webSocketService,
  8. mouse = {x: 0, y: 0, worldx: 0, worldy: 0, tadpole:null},
  9. keyNav = {x:0,y:0},
  10. messageQuota = 5
  11. ;
  12. app.update = function() {
  13. if (messageQuota < 5 && model.userTadpole.age % 50 == 0) { messageQuota++; }
  14. // Update usertadpole
  15. if(keyNav.x != 0 || keyNav.y != 0) {
  16. model.userTadpole.userUpdate(model.tadpoles, model.userTadpole.x + keyNav.x,model.userTadpole.y + keyNav.y);
  17. }
  18. else {
  19. var mvp = getMouseWorldPosition();
  20. mouse.worldx = mvp.x;
  21. mouse.worldy = mvp.y;
  22. model.userTadpole.userUpdate(model.tadpoles, mouse.worldx, mouse.worldy);
  23. }
  24. if(model.userTadpole.age % 6 == 0 && model.userTadpole.changed > 1 && webSocketService.hasConnection) {
  25. model.userTadpole.changed = 0;
  26. webSocketService.sendUpdate(model.userTadpole);
  27. }
  28. model.camera.update(model);
  29. // Update tadpoles
  30. for(id in model.tadpoles) {
  31. model.tadpoles[id].update(mouse);
  32. }
  33. // Update waterParticles
  34. for(i in model.waterParticles) {
  35. model.waterParticles[i].update(model.camera.getOuterBounds(), model.camera.zoom);
  36. }
  37. // Update arrows
  38. for(i in model.arrows) {
  39. var cameraBounds = model.camera.getBounds();
  40. var arrow = model.arrows[i];
  41. arrow.update();
  42. }
  43. };
  44. app.draw = function() {
  45. model.camera.setupContext();
  46. // Draw waterParticles
  47. for(i in model.waterParticles) {
  48. model.waterParticles[i].draw(context);
  49. }
  50. // Draw tadpoles
  51. for(id in model.tadpoles) {
  52. model.tadpoles[id].draw(context);
  53. }
  54. // Start UI layer (reset transform matrix)
  55. model.camera.startUILayer();
  56. // Draw arrows
  57. for(i in model.arrows) {
  58. model.arrows[i].draw(context, canvas);
  59. }
  60. };
  61. app.onSocketOpen = function(e) {
  62. var sendObj = {
  63. type: 'login'
  64. };
  65. webSocket.send(JSON.stringify(sendObj));
  66. //console.log('Socket opened!', e);
  67. //FIXIT: Proof of concept. refactor!
  68. uri = parseUri(document.location)
  69. if ( uri.queryKey.oauth_token ) {
  70. app.authorize(uri.queryKey.oauth_token, uri.queryKey.oauth_verifier)
  71. }
  72. // end of proof of concept code.
  73. };
  74. app.onSocketClose = function(e) {
  75. //console.log('Socket closed!', e);
  76. webSocketService.connectionClosed();
  77. };
  78. app.onSocketMessage = function(e) {
  79. try {
  80. var data = JSON.parse(e.data);
  81. webSocketService.processMessage(data);
  82. } catch(e) {}
  83. };
  84. app.sendMessage = function(msg) {
  85. if (messageQuota>0) {
  86. messageQuota--;
  87. webSocketService.sendMessage(msg);
  88. }
  89. }
  90. app.authorize = function(token,verifier) {
  91. webSocketService.authorize(token,verifier);
  92. }
  93. app.mousedown = function(e) {
  94. mouse.clicking = true;
  95. if(mouse.tadpole && mouse.tadpole.hover && mouse.tadpole.onclick(e)) {
  96. return;
  97. }
  98. if(model.userTadpole && e.which == 1) {
  99. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  100. }
  101. };
  102. app.mouseup = function(e) {
  103. if(model.userTadpole && e.which == 1) {
  104. model.userTadpole.targetMomentum = 0;
  105. }
  106. };
  107. app.mousemove = function(e) {
  108. mouse.x = e.clientX;
  109. mouse.y = e.clientY;
  110. };
  111. app.keydown = function(e) {
  112. if(e.keyCode == keys.up) {
  113. keyNav.y = -1;
  114. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  115. e.preventDefault();
  116. }
  117. else if(e.keyCode == keys.down) {
  118. keyNav.y = 1;
  119. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  120. e.preventDefault();
  121. }
  122. else if(e.keyCode == keys.left) {
  123. keyNav.x = -1;
  124. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  125. e.preventDefault();
  126. }
  127. else if(e.keyCode == keys.right) {
  128. keyNav.x = 1;
  129. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  130. e.preventDefault();
  131. }
  132. };
  133. app.keyup = function(e) {
  134. if(e.keyCode == keys.up || e.keyCode == keys.down) {
  135. keyNav.y = 0;
  136. if(keyNav.x == 0 && keyNav.y == 0) {
  137. model.userTadpole.targetMomentum = 0;
  138. }
  139. e.preventDefault();
  140. }
  141. else if(e.keyCode == keys.left || e.keyCode == keys.right) {
  142. keyNav.x = 0;
  143. if(keyNav.x == 0 && keyNav.y == 0) {
  144. model.userTadpole.targetMomentum = 0;
  145. }
  146. e.preventDefault();
  147. }
  148. };
  149. app.touchstart = function(e) {
  150. e.preventDefault();
  151. mouse.clicking = true;
  152. if(model.userTadpole) {
  153. model.userTadpole.momentum = model.userTadpole.targetMomentum = model.userTadpole.maxMomentum;
  154. }
  155. var touch = e.changedTouches.item(0);
  156. if (touch) {
  157. mouse.x = touch.clientX;
  158. mouse.y = touch.clientY;
  159. }
  160. }
  161. app.touchend = function(e) {
  162. if(model.userTadpole) {
  163. model.userTadpole.targetMomentum = 0;
  164. }
  165. }
  166. app.touchmove = function(e) {
  167. e.preventDefault();
  168. var touch = e.changedTouches.item(0);
  169. if (touch) {
  170. mouse.x = touch.clientX;
  171. mouse.y = touch.clientY;
  172. }
  173. }
  174. app.resize = function(e) {
  175. resizeCanvas();
  176. };
  177. var getMouseWorldPosition = function() {
  178. return {
  179. x: (mouse.x + (model.camera.x * model.camera.zoom - canvas.width / 2)) / model.camera.zoom,
  180. y: (mouse.y + (model.camera.y * model.camera.zoom - canvas.height / 2)) / model.camera.zoom
  181. }
  182. }
  183. var resizeCanvas = function() {
  184. canvas.width = window.innerWidth;
  185. canvas.height = window.innerHeight;
  186. };
  187. // Constructor
  188. (function(){
  189. canvas = aCanvas;
  190. context = canvas.getContext('2d');
  191. resizeCanvas();
  192. model = new Model();
  193. model.settings = aSettings;
  194. model.userTadpole = new Tadpole();
  195. model.userTadpole.id = -1;
  196. model.tadpoles[model.userTadpole.id] = model.userTadpole;
  197. model.waterParticles = [];
  198. for(var i = 0; i < 150; i++) {
  199. model.waterParticles.push(new WaterParticle());
  200. }
  201. model.camera = new Camera(canvas, context, model.userTadpole.x, model.userTadpole.y);
  202. model.arrows = {};
  203. webSocket = new WebSocket( model.settings.socketServer );
  204. webSocket.onopen = app.onSocketOpen;
  205. webSocket.onclose = app.onSocketClose;
  206. webSocket.onmessage = app.onSocketMessage;
  207. webSocketService = new WebSocketService(model, webSocket);
  208. })();
  209. }