diff options
Diffstat (limited to 'src/stacker')
| -rw-r--r-- | src/stacker/index.html | 215 | ||||
| -rw-r--r-- | src/stacker/server.js | 11 | 
2 files changed, 226 insertions, 0 deletions
| diff --git a/src/stacker/index.html b/src/stacker/index.html new file mode 100644 index 0000000..eb256a6 --- /dev/null +++ b/src/stacker/index.html @@ -0,0 +1,215 @@ +<!doctype html> +<html lang="en"> + +<head> +    <title>Stacker</title> +    <meta charset="UTF-8"> +    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> +    <!-- <link rel="stylesheet" type="text/css" href="/css/styles.css"> --> +</head> + +<body style="padding:0; margin:0; overflow:hidden;"> +    <canvas id="canvas"></canvas> +    <script> +        var gameInterval, canvas, ctx; +        var score, t, isGameOver, mouseX, mouseY, scaleX, scaleY, selected, stack, next, v, perfect; +        let VELOCITY = 15; + +        function init() { +            next = {left: 0, width:200}; +            v = VELOCITY; +            stack = [{left: 100, width:200}]; + +            score = 0; +            isGameOver = false; +            mouseX = 0; +            mouseY = 0; +            t = 0; +            selected = -1; +            perfect = 0; +            gameInterval = setInterval(game, 1000 / 10); +        } + +        window.onload = function () { +            canvas = document.getElementById("canvas"); +            ctx = canvas.getContext("2d"); + +            document.addEventListener("keydown", keyPush); +            document.addEventListener("mousedown", mousePush); + +            window.addEventListener('resize', resizeCanvas, false); +            window.addEventListener('orientationchange', resizeCanvas, false); +            resizeCanvas(); + +            init(); +        } + +        function resizeCanvas() { +            canvas.width = window.innerWidth; +            canvas.height = window.innerHeight; +            scaleX = window.innerWidth/400;  +            scaleY = window.innerHeight/600; + +            if(scaleX/scaleY > 1.3){ +                scaleX = scaleY = 1; +            } +            ctx.scale(scaleX, scaleY); +        } +        function game() { +            update(); +            draw(); +        } +        function draw() { +            color("white"); +            ctx.fillRect(0, 0, canvas.width,canvas.height); +            color("black"); +            ctx.fillRect(0, 0, 400,400); +             +            // Draw moving block +            if(stack.length % 2 == 0){ +                color("white"); +            } else { +                color("red") +            } +            var y; +            if(stack.length < 10){ +                y = 380-stack.length*20; +            } else { +                y = 380-10*20; +            } +            ctx.fillRect(next.left, y, next.width, 20) + + +            // Draw stack +            var index = max(stack.length-10, 0); +            stack.slice(-10).forEach((element, i) => { +                if(index % 2 == 0){ +                    color("white"); +                } else { +                    color("red") +                } +                 +                let y = 380-i*20 +                ctx.fillRect(element.left, y, element.width, 20) +                index++; +            }); +             +            // Draw "perfect" marker +            if(perfect > 0 ){ +                font(20); +                color("red"); +                let last = stack[stack.length - 1] +                ctx.fillText("Perfect!", 170, 60); +                perfect--; +            } + +            // Draw score +            font(20); +            color("red"); +            ctx.fillText("Score: " + score, 170, 30); + +            // Draw touch controls +            color("#ff9900"); +            if(selected) { +                color("#cc9900") +            } +            ctx.beginPath(); +            ctx.moveTo(200, 500); +            ctx.arc(200, 500, 100, 0, 2*Math.PI); +            ctx.fill(); +            selected = 0; + +            if (isGameOver) { +                color("blue"); +                font(32); +                ctx.fillText("Game over!", 160, 200); +                font(24); +            } +        } + +        function update() { +            t++; +            next.left += v; +            if(next.left + next.width >= 400) { +                let diff = next.left + next.width - 400; +                next.left -= diff; +                v = -1 * VELOCITY; +            } else if(next.left <= 0) { +                let diff = 0 - next.left; +                next.left += diff; +                v = VELOCITY; +            } +            if (next.width <= 0) { +                gameOver(); +            } +        } +        function max(a, b) { +            return a > b ? a : b; +        } +        function min(a, b) { +            return a < b ? a : b; +        } +        function keyPush(e) { +            if(isGameOver){ +                init(); +                return; +            } +            if(e.keyCode == 32){ +                let last = stack[stack.length -1]; +                var left = max(next.left, last.left); +                let right = min(next.left + next.width, last.left+last.width); +                var width = right-left; + +                if(stack[stack.length -1 ].width - width < 10){ +                    width = stack[stack.length -1 ].width +                    left = stack[stack.length -1 ].left +                    perfect = 5; +                } + +                if(width > 0){ +                    stack.push({left: left, width: width}) +                    score += 1; +                } +                 +                if(v < 0) { +                    next = {left: 0, width: width} +                    v = VELOCITY +                } else { +                    next = {left: 400-width, width: width} +                    v = -1 * VELOCITY +                } +            } +        } +        function mousePush(e) { +            mouseX = e.clientX/scaleX - 200; +            mouseY = e.clientY/scaleY - 500; +            if (Math.sqrt(mouseX * mouseX + mouseY * mouseY) > 100) { +                return; +            } +            selected = 1; +            keyPush({keyCode:  32}) +        } +        function randomInt(max) { +            return Math.floor(Math.random() * max); +        } +        function font(size) { +            ctx.font = size + "px sans serif"; +        } +        function color(c) { +            ctx.fillStyle = c; +        } +        function gameOver() { +            isGameOver = true; +            clearInterval(gameInterval); +             +            const urlParams = new URLSearchParams(window.location.search); +            const uid = urlParams.get('uid'); +            const mid = urlParams.get('mid'); + +            const request = new Request(`/setScore?uid=${uid}&mid=${mid}&score=${score}`); +            fetch(request).then(response => console.log("response")); +        } +    </script> +</body> + +</html>
\ No newline at end of file diff --git a/src/stacker/server.js b/src/stacker/server.js new file mode 100644 index 0000000..ee2fca6 --- /dev/null +++ b/src/stacker/server.js @@ -0,0 +1,11 @@ +const path = require('path'); +const fs = require('fs'); + +function setUpRoutes(server, models, jwtFunctions, database) { +    server.get('/stacker', (req, res) => res.sendFile(__dirname + "/index.html")) +    server.get('/stacker/styles.css', (req, res) => res.sendFile(__dirname + "/static/styles.css")) +} + +module.exports = { +    setUpRoutes +}; | 
