From 62736b77498e5214b2615fe0d318c7bfe95e5111 Mon Sep 17 00:00:00 2001 From: Aaron Delasy Date: Tue, 22 Oct 2024 01:21:09 +0300 Subject: [PATCH] Display hits on zombies with different SVG --- public/entities/rocks.png | Bin 2412 -> 0 bytes renderer/index.ts | 55 +++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 9 deletions(-) delete mode 100644 public/entities/rocks.png diff --git a/public/entities/rocks.png b/public/entities/rocks.png deleted file mode 100644 index 1f2e53a75ab628ba229e93d39f059c1198e5f9f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2412 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 e{D1v7tiJ { @@ -63,18 +67,46 @@ function getEntityImage(entity: Entity): HTMLImageElement | null { return assets.rock; } case EntityType.Zombie: { - return assets.zombie; + if (entity.getHealth() === 1) { + return assets.zombieHit; + } else { + return assets.zombie; + } } } } function getEntityOffset(entity: Entity): { x: number; y: number } { return { - x: entity.getType() === EntityType.Zombie ? 16 : 0, + x: + entity.getType() === EntityType.Zombie && entity.getHealth() !== 1 + ? 8 + : 0, y: 0, }; } +function getEntityRatio(entity: Entity): { width: number; height: number } { + switch (entity.getType()) { + case EntityType.Box: { + return { width: 0.87, height: 1 }; // 41x47 + } + case EntityType.Player: { + return { width: 1, height: 1 }; // 64x64 + } + case EntityType.Rock: { + return { width: 1, height: 0.76 }; // 67x51 + } + case EntityType.Zombie: { + if (entity.getHealth() === 1) { + return { width: 0.61, height: 1 }; // 40x65 + } else { + return { width: 1, height: 1 }; // 64x64 + } + } + } +} + export class Renderer { private readonly assets: RendererAssets; private readonly cellSize: number; @@ -118,8 +150,6 @@ export class Renderer { for (const entity of entities) { this.drawEntity(entity); } - - this.ctx.globalAlpha = 1.0; } private drawBg() { @@ -158,6 +188,7 @@ export class Renderer { const entityPosition = entity.getPosition(); const entityOffset = getEntityOffset(entity); + const entityScale = getEntityRatio(entity); this.ctx.globalAlpha = entity.getType() === EntityType.Zombie && entity.getHealth() === 1 @@ -166,10 +197,16 @@ export class Renderer { this.ctx.drawImage( entityImage, - entityPosition.x * this.cellSize + entityOffset.x, - entityPosition.y * this.cellSize + entityOffset.y, - this.cellSize, - this.cellSize, + entityPosition.x * this.cellSize + + ((1 - entityScale.width) / 2) * this.cellSize + + entityOffset.x, + entityPosition.y * this.cellSize + + ((1 - entityScale.height) / 2) * this.cellSize + + entityOffset.y, + this.cellSize * entityScale.width, + this.cellSize * entityScale.height, ); + + this.ctx.globalAlpha = 1; } }