import browser.document; import browser.window; import jslang.math; pragma(no_js_output) { enum PI = 3.14159265358979323846; float degreesToRadians(float x) { return (x * PI / 180); } template degrees(float x) { enum degrees = degreesToRadians(x); } } struct Player { float x = 640/2; float y = 480/2; float angle = 0; float dx = 0; float dy = 0; float da = 0; bool rotatingLeft; bool rotatingRight; bool thrusting; bool shooting; void advanceFrame() { if(rotatingLeft) da -= degrees!1; if(rotatingRight) da += degrees!1; angle += da; if(thrusting) { dx += Math.cos(angle); dy += Math.sin(angle); } x += dx; y += dy; if(x < 0) x += 640; if(y < 0) y += 480; if(x > 640) x -= 640; if(y > 480) y -= 480; } void draw(JSCanvasContext painter) { float size = 15; painter.strokeStyle = "#ffffff"; painter.beginPath(); painter.moveTo(x, y); foreach(a; [degrees!(180-30), degrees!0, degrees!(180+30)]) { painter.lineTo( x + size * Math.cos(a + angle), y + size * Math.sin(a + angle)); } painter.lineTo(x, y); painter.closePath(); painter.stroke(); } } JSElement canvas; Player player; // FIXME: this should have been initialized void frame() { player.advanceFrame(); auto painter = canvas.getContext("2d"); painter.fillStyle = "#000000"; painter.fillRect(0, 0, 640, 480); // clear the screen player.draw(painter); } void main() { player = Player.init; // FIXME: this shouldn't be necessary canvas = document.getElementById("game"); auto interval = window.setInterval(&frame, 50); document.mainBody.addEventListener("click", { // play/pause on click if(interval) { window.clearInterval(interval); interval = 0; } else { interval = window.setInterval(&frame, 50); } }, false); void keyEventHandler(JSEvent event) { auto down = event.type == "keydown"; switch(event.which) { case 'A', 'a': player.rotatingLeft = down; break; case 'D', 'd': player.rotatingRight = down; break; case 'W', 'w': player.thrusting = down; break; case ' ': player.shooting = down; break; default: {} } event.preventDefault(); } document.mainBody.addEventListener("keydown", &keyEventHandler, false); document.mainBody.addEventListener("keyup", &keyEventHandler, false); }