From d1e08927eb5d86fd91cbcff26799644928183133 Mon Sep 17 00:00:00 2001 From: Fabio Arnold Date: Fri, 8 Dec 2023 21:25:20 +0100 Subject: [PATCH] Shoot while climbing --- img/zero.png | Bin 2992 -> 3224 bytes src/Player.zig | 50 +++++++++++++++++++++++++------------------------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/img/zero.png b/img/zero.png index 67b1714a1d45a08ebac62a88dd9028c2be0db034..389be391d11808da9b57630569f667d63a7769ef 100644 GIT binary patch delta 3221 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 210) self.anim_time = 0; } }, - .sliding => src_rect = if (use_joys_sprite) Rect.init(120, 8, 24, 24) else Rect.init(144, 6, 32, 26), + .sliding => src_rect = Rect.init(144, 6, 32, 26), .running => { var frame = (self.anim_time % 40) / 10; frame = switch (frame) { @@ -148,32 +142,38 @@ pub fn draw(self: *Player) void { 2 => 2, else => unreachable, }; - src_rect.w = if (use_joys_sprite) 24 else 32; + src_rect.w = 32; src_rect.x = 48 + @as(i32, @intCast(frame)) * src_rect.w; }, - .jumping => src_rect = if (use_joys_sprite) Rect.init(144 + @as(i32, @intCast((self.anim_time % 20) / 10)) * 24, 0, 24, 32) else Rect.init(176, 0, 32, 32), + .jumping => src_rect = Rect.init(176, 0, 32, 32), .climbing => { - src_rect = if (use_joys_sprite) Rect.init(216, 0, 24, 32) else Rect.init(240, 0, 16, 32); - flip_x = @mod(self.box.y, 20) < 10; + if (shooting) { + src_rect = Rect.init(208, 0, 24, 32); + } else { + src_rect = Rect.init(240, 0, 16, 32); + flip_x = @mod(self.box.y, 20) < 10; + } }, - .hurting => src_rect = if (use_joys_sprite) Rect.init(192, 0, 24, 32) else Rect.init(208, 0, 32, 32), + .hurting => src_rect = Rect.init(208, 0, 32, 32), } if (shooting) { src_rect.y += 32; src_rect.w = 32; } var dst_rect = Rect.init(self.box.x + @divTrunc(self.box.w - src_rect.w, 2), self.box.y - 8, src_rect.w, src_rect.h); - if (shooting and self.state == .idle) { - dst_rect.x += if (flip_x) -4 else 4; - } - if (!use_joys_sprite) { - switch (self.state) { - .climbing => dst_rect.y += 4, - .jumping => dst_rect.y += 5, - .hurting => dst_rect.y += 6, - else => {}, + if (shooting) { + if (self.state == .idle) { + dst_rect.x += if (flip_x) -4 else 4; + } else if (self.state == .climbing) { + dst_rect.x += if (flip_x) -8 else 8; } } + switch (self.state) { + .climbing => dst_rect.y += 4, + .jumping => dst_rect.y += 5, + .hurting => dst_rect.y += 6, + else => {}, + } if (flip_x) { src_rect.x += src_rect.w; src_rect.w = -src_rect.w; @@ -224,7 +224,7 @@ pub fn move(self: *Player, room: Room, attribs: []const Tile.Attrib) void { for (&self.shots) |*shot| { if (shot.active) { - const box = Box{.x = shot.x-4, .y = shot.y-3, .w = 8, .h = 6}; + const box = Box{ .x = shot.x - 4, .y = shot.y - 3, .w = 8, .h = 6 }; const clipped_x = room.clipX(attribs, box, shot.vx); if (clipped_x != shot.vx) { shot.active = false; @@ -254,7 +254,9 @@ fn doShooting(self: *Player, input: Input, prev_input: Input) void { shot.y = self.box.y + 8; }, .climbing => { - @panic("TODO"); + shot.x = self.box.x + @divTrunc(self.box.w, 2); + shot.x += if (self.face_left) -15 else 15; + shot.y = self.box.y + 9; }, else => {}, }