about summary refs log tree commit diff stats
path: root/js
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2023-12-31 19:29:39 -0500
committerelioat <elioat@tilde.institute>2023-12-31 19:29:39 -0500
commitf8f196f590f21440c3fce6bcaa1a7b4cfe7036c8 (patch)
tree72359cfdb99e487d3531933622308aad1c04c31d /js
parent648d3e13460f787c8929ff34c9accb02d36e8e40 (diff)
downloadtour-f8f196f590f21440c3fce6bcaa1a7b4cfe7036c8.tar.gz
*
Diffstat (limited to 'js')
-rw-r--r--js/hill/game.js139
1 files changed, 77 insertions, 62 deletions
diff --git a/js/hill/game.js b/js/hill/game.js
index ef7cd65..094f79f 100644
--- a/js/hill/game.js
+++ b/js/hill/game.js
@@ -1,6 +1,7 @@
 const canvas = document.getElementById('gameCanvas');
 canvas.width = window.innerWidth;
 canvas.height = window.innerHeight;
+canvas.style.backgroundColor = '#F8F6F4';
 const ctx = canvas.getContext('2d');
 
 const gravity = 1;
@@ -11,6 +12,7 @@ const player = {
     y: 0,
     vx: 16,
     vy: 16,
+    vm: 32,
     jumpForce: gravity + jumpForce,
     onGround: false,
     width: 20,
@@ -20,79 +22,93 @@ const player = {
 const terrain = {
     start: { x: 0, y: 0 },
     end: { x: canvas.width, y: canvas.height },
-    height: 20
+    height: 5
 };
 
 const objects = [];
+let lastObjectX = 0;
 
-function initialize() {
-    terrain.start = { x: 0, y: 0 };
-    terrain.end = { x: canvas.width, y: canvas.height };
+const getRandomInterval = (min, max) => {
+    return Math.floor(Math.random() * (max - min + 1) + min);
+}
 
-    for (let i = 0; i < 50; i++) {
-        const object = {
-            x: i * 10 * canvas.width / 10,
-            width: 50,
-            height: Math.random() * 22
-        };
+setInterval(function() {
+    const object = {
+        x: lastObjectX + 10 * canvas.width / 10,
+        width: 50,
+        height: Math.random() * 22
+    };
 
-        let terrainY = ((terrain.end.y - terrain.start.y) / (terrain.end.x - terrain.start.x)) * (object.x - terrain.start.x) + terrain.start.y;
+    let terrainY = ((terrain.end.y - terrain.start.y) / (terrain.end.x - terrain.start.x)) * (object.x - terrain.start.x) + terrain.start.y;
 
-        object.y = terrainY - object.height;
+    object.y = terrainY - object.height;
 
-        objects.push(object);
-    }
-}
+    objects.push(object);
 
-function draw() {
-    ctx.clearRect(0, 0, canvas.width, canvas.height);
+    lastObjectX = object.x;
+}, getRandomInterval(1000, 3000));
 
-    ctx.save();
+const initialize = () => {
+    terrain.start = { x: 0, y: 0 };
+    terrain.end = { x: canvas.width, y: canvas.height };
+};
 
-    ctx.translate(-player.x + canvas.width / 4, -player.y + canvas.height / 2);
+const drawPlayer = () => {
 
-    ctx.fillStyle = '#b6daf9';
-    ctx.fillRect(player.x, player.y, player.width, player.height);
+    /*
+    ctx.fillStyle = 'lightgrey';
+    ctx.font = '22px Arial';
+    const text = `vx: ${player.vx.toFixed(2)}, vy: ${player.vy.toFixed(2)}`;
+    ctx.fillText(text, player.x, player.y - 12);
+    */
 
-    terrain.start.x = player.x - canvas.width;
-    terrain.end.x = player.x + canvas.width;
+    ctx.fillStyle = '#C4DFDF';
+    ctx.fillRect(player.x, player.y, player.width, player.height);
+};
 
-    ctx.fillStyle = '#aaa';
+const drawObjects = () => {
+    ctx.fillStyle = '#D2E9E9';
     objects.forEach(object => {
         ctx.beginPath();
         ctx.arc(object.x, object.y, object.width / 2, 0, Math.PI * 2, true);
         ctx.fill();
     });
+};
 
+const drawTerrain = () => {
     ctx.beginPath();
     ctx.moveTo(terrain.start.x, terrain.start.y);
     ctx.lineTo(terrain.end.x, terrain.end.y);
-    ctx.strokeStyle = '#ddd';
+    ctx.strokeStyle = '#E3F4F4';
     ctx.lineWidth = terrain.height;
     ctx.stroke();
+};
 
-    // ctx.font = '20px Arial';
-    // ctx.fillStyle = 'black';
-    // ctx.fillText('Health: ' + player.health, player.x, player.y - 22);
-
-     ctx.fillStyle = '#a2a2f2';
-     for (let i = particles.length - 1; i >= 0; i--) {
-         let particle = particles[i];
- 
-         ctx.fillRect(particle.x, particle.y, 5, 5);
- 
-         particle.x += particle.vx;
-         particle.y += particle.vy;
- 
-         particle.lifespan--;
- 
-         if (particle.lifespan === 0) {
-             particles.splice(i, 1);
-         }
-     }
+const drawParticles = () => {
+    ctx.fillStyle = '#C4DFDF';
+    particles.forEach((particle, index) => {
+        ctx.fillRect(particle.x, particle.y, 5, 5);
+        particle.x += particle.vx;
+        particle.y += particle.vy;
+        particle.lifespan--;
+        if (particle.lifespan === 0) {
+            particles.splice(index, 1);
+        }
+    });
+};
 
+const draw = () => {
+    ctx.clearRect(0, 0, canvas.width, canvas.height);
+    ctx.save();
+    ctx.translate(-player.x + canvas.width / 4, -player.y + canvas.height / 2);
+    drawPlayer();
+    terrain.start.x = player.x - canvas.width;
+    terrain.end.x = player.x + canvas.width;
+    drawObjects();
+    drawTerrain();
+    drawParticles();
     ctx.restore();
-}
+};
 
 const isColliding = (obj1, obj2) => (
     obj1.x < obj2.x + obj2.width &&
@@ -104,8 +120,10 @@ const isColliding = (obj1, obj2) => (
 const checkCollision = () => {
     objects.forEach(object => {
         if (isColliding(player, object)) {
-            player.health -= 1;
-            console.log('Collision detected!');
+            if (player.vx >= 1) {
+                player.vx -= 0.5;
+                player.vy -= 0.5;
+            }
         }
     });
 };
@@ -157,25 +175,22 @@ window.addEventListener('resize', () => {
     draw();
 });
 
-canvas.addEventListener('click', () => {
+const playerDoJump = () => {
     const terrainY = (terrain.end.y - terrain.start.y) / (terrain.end.x - terrain.start.x) * (player.x - terrain.start.x) + terrain.start.y;
     if (player.y + player.height >= terrainY) {
         player.vy = player.jumpForce * -1;
+        if (player.vx < player.vm) {
+            player.vx += 0.5;
+        }
     }
-});
+};
 
-canvas.addEventListener('touchstart', () => {
-    const terrainY = (terrain.end.y - terrain.start.y) / (terrain.end.x - terrain.start.x) * (player.x - terrain.start.x) + terrain.start.y;
-    if (player.y + player.height >= terrainY) {
-        player.vy = player.jumpForce * -1;
+const handleKeyDown = event => {
+    if (event.key === 'Enter' || event.key === ' ') {
+        playerDoJump();
     }
-});
+};
 
-window.addEventListener('keydown', event => {
-    if (event.key === 'Enter') {
-        const terrainY = (terrain.end.y - terrain.start.y) / (terrain.end.x - terrain.start.x) * (player.x - terrain.start.x) + terrain.start.y;
-        if (player.y + player.height >= terrainY) {
-            player.vy = player.jumpForce * -1;
-        }
-    }
-});
\ No newline at end of file
+canvas.addEventListener('click', playerDoJump);
+canvas.addEventListener('touchstart', playerDoJump);
+window.addEventListener('keydown', handleKeyDown);