Advertisement
DannySherman

Untitled

Oct 9th, 2015
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.55 KB | None | 0 0
  1. <html>
  2.  
  3. <head>
  4. <title>HTML5 Canvas &mdash; Demo asteroid</title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF8">
  6. <script type="text/javascript" src="dat.gui.js"></script>
  7. <script type="text/javascript" src="gl-matrix.js"></script>
  8.  
  9. <style>
  10. canvas {border: solid 1px black}
  11. td {vertical-align: top;}
  12. </style>
  13. </head>
  14.  
  15. <script type="text/javascript">
  16. window.requestAnimFrame = (function() {
  17. return window.requestAnimationFrame ||
  18. window.webkitRequestAnimationFrame ||
  19. window.mozRequestAnimationFrame ||
  20. window.oRequestAnimationFrame ||
  21. window.msRequestAnimationFrame ||
  22. function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
  23. window.setTimeout(callback, 1000/60);
  24. };
  25. })();
  26.  
  27. var canvas;
  28. var ctx;
  29. var w,h;
  30.  
  31. var params
  32. function initParams() {
  33. params = { //This is an object, initialized using literal notation
  34. 'x0': w/2,
  35. 'y0': h/2,
  36. 'angle': 0,
  37. 'inSpace': false,
  38. 'bounceOnBorder': false,
  39. 'angleVelocity': 180, // 1 turn in 2s
  40. 'velocity': 20,
  41. 'vx': 0,
  42. 'vy': 0,
  43. 'acceleration': 0.1
  44. }
  45. }
  46.  
  47. /* ### GUI ### */
  48. var gui;
  49. function initGUI()
  50. {
  51. gui = new dat.GUI({ autoPlace: true });
  52.  
  53. gui.add(params, 'x0').min(0).max(w).step(1)//.listen()
  54. gui.add(params, 'y0').min(0).max(h).step(1)//.listen()
  55. gui.add(params, 'angle').min(-180).max(180).step(1)//.listen() //It's in degrees needs to be converted
  56. gui.add(params, 'inSpace')
  57. gui.add(params, 'bounceOnBorder')
  58. gui.add(params, 'angleVelocity').min(0).max(720).step(0.1) // 720 deg max in 1s
  59. gui.add(params, 'velocity').min(0).max(50).step(0.1) // 50 pix max in 1s
  60. gui.add(params, 'vx').min(-50).max(+50).step(0.1)//.listen()
  61. gui.add(params, 'vy').min(-50).max(+50).step(0.1)//.listen()
  62. gui.add(params, 'acceleration').min(0).max(+50).step(0.1)
  63.  
  64. //var parent = document.getElementById('controls');
  65. //parent.appendChild(gui.domElement);
  66. }
  67.  
  68. /* ### Keyboard ### */
  69. var currentlyPressedKeys = {};
  70. function initKeys(canvas) {
  71. canvas.setAttribute('tabindex','0');
  72. canvas.focus();
  73.  
  74. canvas.addEventListener( "keydown", handleKeyDown, true);
  75. canvas.addEventListener( "keyup", handleKeyUp, true);
  76. }
  77. function handleKeyDown(event) {
  78. // Uncomment this to display key presses to find the keyCodes
  79. //console.log(event)
  80. event.preventDefault();
  81. currentlyPressedKeys[event.keyCode] = true;
  82.  
  83. // Handle single key presses (for example for firing the gun)
  84. if (event.keyCode == 67) { // K
  85. comsole.log('Pressed "K"')
  86. }
  87. }
  88. function handleKeyUp(event) {
  89. currentlyPressedKeys[event.keyCode] = false;
  90. }
  91. function handleKeys() { //reason why angles work
  92. // Rotation
  93.  
  94.  
  95. if (currentlyPressedKeys[37]) { //Left
  96. params.angle -= params.angleVelocity * elapsed
  97. }
  98. if (currentlyPressedKeys[39]) { // Right
  99. params.angle += params.angleVelocity * elapsed
  100. }
  101. if (params.angle > 180) params.angle-=360;
  102. else if (params.angle < -180) params.angle += 360;
  103.  
  104.  
  105. if(params.inSpace === false){
  106. if (currentlyPressedKeys[38]) { // Up
  107. // TODO: ship translation
  108.  
  109. params.x0+=Math.sin(params.angle*Math.PI/180);
  110. params.y0+=-Math.cos(params.angle*Math.PI/180);
  111.  
  112. }
  113. if (currentlyPressedKeys[40]) { // Down
  114. // TODO: ship translation
  115.  
  116. params.x0+=-Math.sin(params.angle*Math.PI/180);
  117. params.y0+=Math.cos(params.angle*Math.PI/180);
  118.  
  119. }
  120. }
  121.  
  122. else if(params.inSpace === true){
  123.  
  124. params.vx+=params.accel/elapsed
  125. params.vy+=params.accel/elapsed
  126. if (currentlyPressedKeys[38]) { // Up
  127. // TODO: ship translation
  128.  
  129.  
  130. params.x0+= params.vx*Math.sin(params.angle*Math.PI/180)//*elapsed;
  131. params.y0+= -params.vy*Math.cos(params.angle*Math.PI/180)//*elapsed;
  132.  
  133. }
  134. if (currentlyPressedKeys[40]) { // Down
  135. // TODO: ship translation
  136.  
  137. params.x0+= -params.vx*Math.sin(params.angle*Math.PI/180)//*elapsed;
  138. params.y0+= params.vy*Math.cos(params.angle*Math.PI/180)//*elapsed;
  139. }
  140. }
  141.  
  142. if(params.x0 > w) params.x0 = 0;
  143. else if (params.x0 < 0) params.x0 = w;
  144.  
  145. if(params.y0 > h) params.y0 = 0;
  146. else if (params.y0 < 0) params.y0 = h;
  147.  
  148. }
  149.  
  150. /* ### Timing and main loop ### */
  151. var startTime = 0;
  152. var lastTime = 0;
  153. var elapsed = 0, totalElapsed = 0;
  154. function animate() {
  155. var timeNow = new Date().getTime() / 1000; // All expressed in seconds
  156. if (lastTime != 0) {
  157. elapsed = (timeNow - lastTime);
  158. } else {
  159. startTime = timeNow;
  160. }
  161. lastTime = timeNow;
  162. }
  163. function tick() {
  164. animate();
  165. handleKeys();
  166. drawAll();
  167. console.log(params.angle);
  168. requestAnimFrame(tick); //recursion!!!
  169. }
  170.  
  171. /* ### Drawing ### */
  172. function drawShip(ctx) {
  173.  
  174. // Define transformation before drawing ship
  175. /*Transform explanation:
  176. Each object on the canvas has a current transformation matrix.
  177. The setTransform() method resets the current transform to the identity matrix, and then runs transform() with the same arguments.
  178. In other words, the setTransform() method lets you scale, rotate, move, and skew the current context.
  179.  
  180. context.setTransform(scale x, skew x, skew y, scale y, translate x, translate y);
  181. */
  182.  
  183. //settings
  184. ctx.setTransform(1,0,0, 1,0,0)
  185. ctx.translate(params.x0, params.y0) //The translate() method remaps the (0,0) position on the canvas!!!
  186. ctx.rotate(params.angle/180*Math.PI) //The rotate() method rotates the current drawing by params.angle!!!
  187.  
  188. //Actual drawing taking place
  189. ctx.beginPath()
  190. ctx.moveTo(0, -20)
  191. ctx.lineTo(10, 10)
  192. ctx.lineTo(-10, 10)
  193. ctx.lineTo(0, -20)
  194. ctx.strokeStyle="red";
  195. ctx.lineWidth = 2;
  196. ctx.stroke()
  197.  
  198. // Reset canvas transformation after drawing
  199. ctx.setTransform(1,0,0, 1,0,0)
  200. }
  201.  
  202. function drawAll() {
  203. ctx.clearRect(0,0,canvas.width,canvas.height)
  204.  
  205. drawShip(ctx)
  206. }
  207.  
  208. /* ### Initialization ### */
  209. function start() {
  210. canvas = document.getElementById('canvas');
  211. ctx = canvas.getContext('2d');
  212.  
  213. w = canvas.width;
  214. h = canvas.height;
  215.  
  216. // Do init
  217. initParams()
  218. initGUI()
  219. initKeys(canvas)
  220.  
  221. // Launch main animation loop
  222. tick()
  223. }
  224. </script>
  225.  
  226. <body onload="start();">
  227. <h2>Asteroid</h2>
  228. <table><tbody><tr>
  229.  
  230. <td>
  231. <table><tbody>
  232. <tr>
  233. <td><canvas id="canvas" width="300" height="300"></canvas></td>
  234. </tr>
  235. <tr>
  236. <td>Canvas</td>
  237. </tr>
  238. <tr>
  239. <td><small><span id="text"></span></small></td>
  240. </tr>
  241. </tbody></table>
  242. </td>
  243.  
  244. </body>
  245. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement