From a249dc3cf96c387eaac9cf5713879f53d32dab96 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 1 Feb 2026 04:16:02 +0200 Subject: [PATCH] flip sprites --- src/assets.zig | 33 +++++++++++++--------- src/assets/bullet.png | Bin 0 -> 279 bytes src/assets/skeleton.png | Bin 0 -> 413 bytes src/combat_screen.zig | 61 +++++++++++++++++++++++++++++++--------- src/engine/graphics.zig | 16 +++++++++++ 5 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 src/assets/bullet.png create mode 100644 src/assets/skeleton.png diff --git a/src/assets.zig b/src/assets.zig index 00934e2..ba35d98 100644 --- a/src/assets.zig +++ b/src/assets.zig @@ -41,6 +41,7 @@ font_id: FontName.EnumArray, pistol_mask: Gfx.TextureId, bomb_mask: Gfx.TextureId, laser_mask: Gfx.TextureId, +bullet: Gfx.TextureId, dungeon_tilemap: Tilemap, skeleton: Gfx.Sprite, @@ -89,14 +90,13 @@ pub fn init(gpa: std.mem.Allocator) !Assets { .rgba = laser_mask_image.rgba8_pixels } }); - - const creatures_image = try STBImage.load(@embedFile("assets/tiny-creatures/tilemap_packed.png")); - defer creatures_image.deinit(); - const creatures_texture = try Gfx.addTexture(&.{ + const skeleton_image = try STBImage.load(@embedFile("assets/skeleton.png")); + defer skeleton_image.deinit(); + const skeleton_texture = try Gfx.addTexture(&.{ .{ - .width = creatures_image.width, - .height = creatures_image.height, - .rgba = creatures_image.rgba8_pixels + .width = skeleton_image.width, + .height = skeleton_image.height, + .rgba = skeleton_image.rgba8_pixels } }); @@ -120,17 +120,23 @@ pub fn init(gpa: std.mem.Allocator) !Assets { } }); - const creatures_tilemap = Tilemap{ - .texture = creatures_texture, - .tile_size = .init(16, 16) - }; + const bullet_image = try STBImage.load(@embedFile("assets/bullet.png")); + defer bullet_image.deinit(); + const bullet_texture = try Gfx.addTexture(&.{ + .{ + .width = bullet_image.width, + .height = bullet_image.height, + .rgba = bullet_image.rgba8_pixels + } + }); + const snake = Gfx.Sprite{ .texture = snake_texture, .uv = .unit }; const skeleton = Gfx.Sprite{ - .texture = creatures_texture, - .uv = creatures_tilemap.getTileUV(1, 0) + .texture = skeleton_texture, + .uv = .unit }; const fire_spirit = Gfx.Sprite{ .texture = fire_spirit_texture, @@ -181,6 +187,7 @@ pub fn init(gpa: std.mem.Allocator) !Assets { .fire_spirit = fire_spirit, .map = map, .tilesets = tilesets, + .bullet = bullet_texture, .dungeon_tilemap = .{ .texture = dungeon_texture, .tile_size = .init(16, 16) diff --git a/src/assets/bullet.png b/src/assets/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..30b366466a7371c823565067de8b82a7f56f66a2 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4{{J_kIJdVeoYIb6Mw< G&;$TlK2Mea literal 0 HcmV?d00001 diff --git a/src/assets/skeleton.png b/src/assets/skeleton.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f3ff530dcbb81bfc8e72c9e17e0bc10d02331d GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e49S; zOxz=vCt<`Ze7wUg=3@ABJx+6x{E}Nh+qQ?B{^4h?F5dHRF>{LHj4C!DP)oU;SeJ9_ z=bVF%XE}~?8-y#gH}75bu%733;ZC;cR%$Vv&yGJ#V*|RVZQ0!Ol65k9$7UXg*q}Nk ud9~jH4X0;|)iu<<+;QcysQ7K8%#e3|mHBZtg*iaaGI+ZBxvX self.assets.pistol_mask, .bomb => self.assets.bomb_mask, .laser => self.assets.laser_mask, }, .uv = .unit + }; + + const sprite_size = sprite.getSize(); + if (self.player.facing_left) { + sprite = sprite.flipHorizontal(); } - }); + const pos = self.player.kinetic.pos; + frame.drawRectangle(.{ + .rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y), + .color = rgb(255, 255, 255), + .sprite = sprite + }); + + frame.drawRectangle(.{ + .rect = self.player.getRect(), + .color = rgba(255, 255, 255, 0.5), + }); + } for (self.bullets.items) |*bullet| { bullet.kinetic.vel = bullet.dir.multiplyScalar(bullet.speed); @@ -576,9 +595,20 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul } } + const pos = bullet.kinetic.pos; + const sprite_size = Engine.Graphics.getTextureSize(self.assets.bullet); + frame.drawRectangle(.{ + .rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y), + .color = rgb(255, 255, 255), + .sprite = .{ + .texture = self.assets.bullet, + .uv = .unit + } + }); + frame.drawRectangle(.{ .rect = bullet_rect, - .color = rgb(200, 20, 255) + .color = rgba(200, 20, 255, 0.5) }); } @@ -772,6 +802,7 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul if (to_target.length() > 1) { const dir_to_target = to_target.normalized(); enemy.kinetic.vel = dir_to_target.multiplyScalar(enemy.speed); + enemy.facing_left = enemy.kinetic.vel.x < 0; } else { enemy.kinetic.vel = .zero; } @@ -796,17 +827,21 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul enemy.kinetic.update(dt, .{}); - frame.drawRectangle(.{ - .rect = enemy_rect, - .color = rgba(20, 20, 200, 0.2), - }); - const pos = enemy.kinetic.pos; const sprite_size = enemy.sprite.getSize(); + var sprite = enemy.sprite; + if (enemy.facing_left) { + sprite = sprite.flipHorizontal(); + } frame.drawRectangle(.{ .rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y), .color = rgb(255, 255, 255), - .sprite = enemy.sprite + .sprite = sprite + }); + + frame.drawRectangle(.{ + .rect = enemy_rect, + .color = rgba(20, 20, 200, 0.2), }); } } diff --git a/src/engine/graphics.zig b/src/engine/graphics.zig index 0496baa..93ced4c 100644 --- a/src/engine/graphics.zig +++ b/src/engine/graphics.zig @@ -92,6 +92,17 @@ pub const Sprite = struct { texture: TextureId, uv: Rect, + pub fn flipHorizontal(self: Sprite) Sprite { + var uv = self.uv; + uv.pos.x += uv.size.x; + uv.size.x *= -1; + + return Sprite{ + .texture = self.texture, + .uv = uv + }; + } + pub fn getSize(self: Sprite) Vec2 { const texture_info = getTextureInfo(self.texture); const texture_size = Vec2.initFromInt(u32, texture_info.width, texture_info.height); @@ -456,3 +467,8 @@ pub fn getTextureInfo(id: TextureId) TextureInfo { const texture = textures.items[@intFromEnum(id)]; return texture.info; } + +pub fn getTextureSize(id: TextureId) Vec2 { + const texture_info = getTextureInfo(id); + return Vec2.initFromInt(u32, texture_info.width, texture_info.height); +}