diff options
author | elioat <elioat@tilde.institute> | 2025-02-16 21:48:52 -0500 |
---|---|---|
committer | elioat <elioat@tilde.institute> | 2025-02-16 21:48:52 -0500 |
commit | 9c113e31d93f7c0c6f611b14997dcaec1a9076c0 (patch) | |
tree | 09f7070db2cb4be633f8de7456a7b5e83efb472b | |
parent | 8e8ece41840f52ce1a91ae8b5ca3b0e7bba3dbb0 (diff) | |
download | tour-9c113e31d93f7c0c6f611b14997dcaec1a9076c0.tar.gz |
*
-rw-r--r-- | html/tower/index.html | 4 | ||||
-rw-r--r-- | html/tower/js/game.js | 23 | ||||
-rw-r--r-- | html/tower/js/renderer.js | 33 |
3 files changed, 52 insertions, 8 deletions
diff --git a/html/tower/index.html b/html/tower/index.html index 0a4adc6..8366b98 100644 --- a/html/tower/index.html +++ b/html/tower/index.html @@ -17,10 +17,13 @@ position: relative; display: flex; gap: 20px; + align-items: flex-start; } #gameCanvas { border: 2px solid #333; background-color: white; + position: relative; + flex-shrink: 0; } .tower-palette { width: 100px; @@ -30,6 +33,7 @@ display: flex; flex-direction: column; gap: 10px; + flex-shrink: 0; } .tower-option { width: 80px; diff --git a/html/tower/js/game.js b/html/tower/js/game.js index 2fdcc84..1099c46 100644 --- a/html/tower/js/game.js +++ b/html/tower/js/game.js @@ -121,12 +121,29 @@ function spawnEnemies(timestamp) { * - Separation of rendering and game logic */ function renderGame() { - renderGrid(ctx, gameState.grid); // Background grid - renderParticles(ctx, gameState.particles); // Particles (including slime) go under everything + // Clear and reset canvas state at the start + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Save initial state + ctx.save(); + + // Render game elements + renderGrid(ctx, gameState.grid); + renderParticles(ctx, gameState.particles); renderProjectiles(ctx, gameState.projectiles); renderTowers(ctx, gameState.towers); - renderEnemies(ctx, gameState.enemies); // Enemies on top of slime trail + renderEnemies(ctx, gameState.enemies); + + // Restore to clean state before UI + ctx.restore(); + ctx.save(); + + // Render UI with clean state renderUI(ctx, gameState); + + // Final restore + ctx.restore(); } // Start the game diff --git a/html/tower/js/renderer.js b/html/tower/js/renderer.js index 9bebe0b..cf52ebc 100644 --- a/html/tower/js/renderer.js +++ b/html/tower/js/renderer.js @@ -98,14 +98,37 @@ function renderEnemies(ctx, enemies) { } function renderUI(ctx, gameState) { + const padding = 20; + const lineHeight = 30; + const startY = padding; + const width = 200; + const height = lineHeight * 5; + + // Save the current canvas state + ctx.save(); + + // Reset any transformations + ctx.setTransform(1, 0, 0, 1, 0, 0); + + // Draw semi-transparent background + ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'; + ctx.fillRect(0, 0, width, height + padding); + + // Set text properties ctx.fillStyle = 'black'; ctx.font = '20px Arial'; - ctx.fillText(`Currency: $${gameState.currency}`, 10, 30); - ctx.fillText(`Phase: ${gameState.phase}`, 10, 60); + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; // Add this to ensure consistent vertical alignment + + // Draw UI elements + ctx.fillText(`Level: ${gameState.level}`, padding, startY); + ctx.fillText(`Currency: $${gameState.currency}`, padding, startY + lineHeight); + ctx.fillText(`Phase: ${gameState.phase}`, padding, startY + lineHeight * 2); + ctx.fillText(`Destroyed: ${gameState.enemiesDestroyed}`, padding, startY + lineHeight * 3); + ctx.fillText(`Escaped: ${gameState.enemiesEscaped}`, padding, startY + lineHeight * 4); - // Add enemy stats - ctx.fillText(`Destroyed: ${gameState.enemiesDestroyed}`, 10, 90); - ctx.fillText(`Escaped: ${gameState.enemiesEscaped}`, 10, 120); + // Restore the canvas state + ctx.restore(); } function renderTowers(ctx, towers) { |