From ac35cf1612f303e415e193f3b0fb09a912551084 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sat, 29 Apr 2023 14:34:15 +0900 Subject: [PATCH] Work on game Added sprites, WIP world logic. --- Cargo.lock | 7 ++ Cargo.toml | 1 + src/helpers.rs | 34 ------ src/lib.rs | 60 +++-------- src/sprites.rs | 91 ++++++++++++++++ src/world.rs | 279 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 395 insertions(+), 77 deletions(-) create mode 100644 src/world.rs diff --git a/Cargo.lock b/Cargo.lock index d7837fe..e205cc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,4 +13,11 @@ name = "cart" version = "0.1.0" dependencies = [ "buddy-alloc", + "tinyrand", ] + +[[package]] +name = "tinyrand" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ffaad2263779579369d45f65cad0647c860893d27e4543cdcc1e428d07da2c" diff --git a/Cargo.toml b/Cargo.toml index 9e57f16..b42bb03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ crate-type = ["cdylib"] [dependencies] buddy-alloc = { version = "0.4.1", optional = true } +tinyrand = "0.5.0" [profile.release] opt-level = "z" diff --git a/src/helpers.rs b/src/helpers.rs index 52d9ceb..28077f6 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -1,7 +1,3 @@ -static mut CAR_STATE: u8 = 0; -static mut CAR_STATE_FRAMES: u8 = 0; -const CAR_FRAMES: u8 = 10; - pub fn fill(color: u8) { if color > 3 { crate::trace("ERROR: Invalid value passed to helper \"fill\""); @@ -11,33 +7,3 @@ pub fn fill(color: u8) { (&mut *crate::FRAMEBUFFER).fill(color | (color << 2) | (color << 4) | (color << 6)); } } - -pub fn draw_mouse() -> Option<(i16, i16)> { - let mouse = unsafe { *crate::MOUSE_BUTTONS }; - let mouse_x = unsafe { *crate::MOUSE_X }; - let mouse_y = unsafe { *crate::MOUSE_Y }; - if mouse & crate::MOUSE_LEFT != 0 { - unsafe { *crate::DRAW_COLORS = 2 } - crate::rect(i32::from(mouse_x) - 4, i32::from(mouse_y) - 4, 8, 8); - Some((mouse_x, mouse_y)) - } else { - unsafe { *crate::DRAW_COLORS = 1 } - crate::rect(i32::from(mouse_x) - 2, i32::from(mouse_y) - 2, 4, 4); - None - } -} - -pub fn toggle_car_state() -> bool { - unsafe { - CAR_STATE_FRAMES += 1; - if CAR_STATE_FRAMES >= CAR_FRAMES { - CAR_STATE_FRAMES = 0; - if CAR_STATE == 0 { - CAR_STATE = 1; - } else { - CAR_STATE = 0; - } - } - CAR_STATE != 0 - } -} diff --git a/src/lib.rs b/src/lib.rs index 6c038d6..6bf7098 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,53 +5,27 @@ use wasm4::*; mod helpers; mod sprites; +mod world; -#[rustfmt::skip] -const SMILEY: [u8; 8] = [ - 0b11000011, - 0b10000001, - 0b00100100, - 0b00100100, - 0b00000000, - 0b00100100, - 0b10011001, - 0b11000011, -]; +static mut WORLD: Option = None; #[no_mangle] fn update() { + // init + unsafe { + if WORLD.is_none() { + WORLD = Some(world::World::new()); + } + } + + // update + unsafe { + WORLD.as_mut().unwrap().update(); + } + + // draw helpers::fill(3); - - unsafe { *DRAW_COLORS = 2 } - text("Hello from Rust!", 10, 10); - - let gamepad = unsafe { *GAMEPAD1 }; - if gamepad & BUTTON_1 != 0 { - unsafe { *DRAW_COLORS = 3 } + unsafe { + WORLD.as_mut().unwrap().draw(); } - - blit(&SMILEY, 76, 76, 8, 8, BLIT_1BPP); - text("Press X to blink", 16, 90); - - unsafe { *DRAW_COLORS = 0x312 } - if helpers::toggle_car_state() { - blit( - &sprites::CAR0, - 50, - 40, - sprites::CAR0_WIDTH, - sprites::CAR0_HEIGHT, - sprites::CAR0_FLAGS, - ); - } else { - blit( - &sprites::CAR1, - 50, - 40, - sprites::CAR1_WIDTH, - sprites::CAR1_HEIGHT, - sprites::CAR1_FLAGS, - ); - } - if let Some((x, y)) = helpers::draw_mouse() {} } diff --git a/src/sprites.rs b/src/sprites.rs index 551ef18..f29dfb2 100644 --- a/src/sprites.rs +++ b/src/sprites.rs @@ -58,3 +58,94 @@ pub const CAR1: [u8; 384] = [ 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x51, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x14, 0x53, 0xff, 0xff, 0xff, 0xff, 0x04, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0f, 0xff, 0xff, ]; +// house0 +pub const HOUSE0_WIDTH: u32 = 48; +pub const HOUSE0_HEIGHT: u32 = 48; +pub const HOUSE0_FLAGS: u32 = 1; // BLIT_2BPP +pub const HOUSE0: [u8; 576] = [ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xab, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xa0, 0x0a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x02, 0xab, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa0, 0x00, 0x00, 0x0a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x02, + 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xab, 0xff, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xfe, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaf, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xab, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xff, + 0xff, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xbf, 0xfe, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaf, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xab, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, + 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x80, 0x0a, + 0xa0, 0x00, 0x00, 0x2a, 0xaa, 0x80, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x85, 0x08, 0x50, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x80, + 0x08, 0x00, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0xaa, 0xaa, 0xaa, 0x80, 0x0a, + 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x85, 0x08, 0x50, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x80, + 0x08, 0x00, 0x80, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x04, 0x80, 0x00, 0xaa, 0xaa, 0xaa, 0x80, 0x0a, + 0xa0, 0x00, 0x00, 0x20, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0xa0, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x20, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +]; +// house1 +pub const HOUSE1_WIDTH: u32 = 48; +pub const HOUSE1_HEIGHT: u32 = 21; +pub const HOUSE1_FLAGS: u32 = 1; // BLIT_2BPP +pub const HOUSE1: [u8; 252] = [ + 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xab, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x80, 0x0a, 0xaa, 0x28, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x0a, + 0xaa, 0x8a, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x0a, 0xa2, 0xa2, 0x83, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x80, 0x0a, 0xa0, 0xaa, 0x80, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x80, 0x2a, 0xa0, 0x28, 0xa1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x80, 0x8a, + 0xa0, 0x2a, 0x88, 0x23, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaa, 0x82, 0x0a, 0xa8, 0x22, 0x82, 0x23, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x28, 0x88, 0x0a, 0xa8, 0x82, 0xa2, 0xa0, 0x3f, 0xff, 0xff, 0xff, + 0xc8, 0xa0, 0xa0, 0x0a, 0xa2, 0x82, 0x20, 0xa8, 0xff, 0xff, 0xff, 0xfe, 0x4a, 0x80, 0xa2, 0x8a, + 0xa2, 0xa2, 0x28, 0x22, 0xff, 0xff, 0xff, 0xfe, 0xaa, 0xaa, 0x8a, 0x0a, 0xaa, 0x2a, 0x0a, 0x28, + 0xbf, 0xff, 0xff, 0xff, 0x28, 0x08, 0x20, 0x0a, 0xa8, 0x0a, 0x02, 0xa2, 0xa3, 0xff, 0xff, 0xfe, + 0xa0, 0xa0, 0x80, 0x8a, 0xa2, 0x08, 0xa0, 0xa0, 0xa8, 0x40, 0x4f, 0xfe, 0xa2, 0x82, 0x02, 0xaa, + 0xa2, 0x88, 0x2a, 0x28, 0x02, 0x80, 0x80, 0x2a, 0x2a, 0x28, 0x2a, 0x8a, 0xa0, 0xa8, 0x02, 0xa2, + 0x82, 0x82, 0x80, 0x62, 0x80, 0x20, 0xa8, 0x0a, 0xa0, 0x2a, 0x00, 0x20, 0xaa, 0x82, 0x00, 0x80, + 0xa8, 0xa0, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +]; +// box +pub const BOX_WIDTH: u32 = 28; +pub const BOX_HEIGHT: u32 = 28; +pub const BOX_FLAGS: u32 = 1; // BLIT_2BPP +pub const BOX: [u8; 196] = [ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, + 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, + 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, + 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, + 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x1a, 0xa5, 0x55, 0x55, 0x69, 0x55, 0x55, 0x5a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, + 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, + 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, + 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, + 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa0, 0x00, 0x00, 0x68, 0x00, 0x00, 0x1a, 0xa5, + 0x55, 0x55, 0x69, 0x55, 0x55, 0x5a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, +]; +// plant +pub const PLANT_WIDTH: u32 = 12; +pub const PLANT_HEIGHT: u32 = 10; +pub const PLANT_FLAGS: u32 = 1; // BLIT_2BPP +pub const PLANT: [u8; 30] = [ + 0x7f, 0xff, 0xf7, 0x13, 0xff, 0x03, 0xf0, 0xbc, 0x3f, 0xfc, 0x3c, 0x81, 0xff, 0x30, 0x0f, 0xff, + 0x82, 0xef, 0x43, 0x0b, 0xff, 0xf0, 0x0b, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0x2f, 0xff, +]; diff --git a/src/world.rs b/src/world.rs new file mode 100644 index 0000000..c39036f --- /dev/null +++ b/src/world.rs @@ -0,0 +1,279 @@ +use crate::sprites::*; +use tinyrand::{Rand, StdRand}; + +const CAR_ANIM_FRAMES: u8 = 10; +const CAMERA_RATE: f32 = 0.07f32; +const BOX_INTERP_RATE: f32 = 0.01f32; +const HOUSE_MAX_DIST: f32 = 10.0f32; + +pub struct World { + // x, y + shrubs: [(i32, i32); 4], + // x, y, state + // state: + // - 0 does not exist + // - 1 exists + // - 2 destroyed + houses: [(i32, i32, u8); 2], + // u8: + // - 0 facing right + // - 1 facing left + // - 2 facing up + // - 3 facing down + // - 4 facing right alt + // - 5 facing left alt + // - 6 facing up alt + // - 7 facing down alt + car_pos: (i32, i32, u8), + car_frames: u8, + camera_pos: (f32, f32), + // x, y, interp, house_idx + box_pos: Option<(f32, f32, f32, usize)>, + rand: StdRand, +} + +impl World { + pub fn new() -> World { + World { + shrubs: [(-40, 0), (0, 40), (40, 0), (0, -40)], + houses: [(300, 0, 2), (0, 0, 0)], + car_pos: (0, 0, 0), + car_frames: 0, + camera_pos: (-80f32, -80f32), + box_pos: None, + rand: StdRand::default(), + } + } + + fn car_to_left(&mut self) { + if self.car_pos.2 > 3 { + self.car_pos.2 = 5; + } else { + self.car_pos.2 = 1; + } + } + + fn car_to_right(&mut self) { + if self.car_pos.2 > 3 { + self.car_pos.2 = 4; + } else { + self.car_pos.2 = 0; + } + } + + fn car_to_up(&mut self) { + if self.car_pos.2 > 3 { + self.car_pos.2 = 6; + } else { + self.car_pos.2 = 2; + } + } + + fn car_to_down(&mut self) { + if self.car_pos.2 > 3 { + self.car_pos.2 = 7; + } else { + self.car_pos.2 = 3; + } + } + + pub fn update(&mut self) { + let gamepad = unsafe { *crate::GAMEPAD1 }; + + if gamepad & crate::BUTTON_UP != 0 { + self.car_pos.1 -= 1; + self.car_to_up(); + self.rand.next_u16(); + } + if gamepad & crate::BUTTON_DOWN != 0 { + self.car_pos.1 += 1; + self.car_to_down(); + self.rand.next_u16(); + } + if gamepad & crate::BUTTON_LEFT != 0 { + self.car_pos.0 -= 1; + self.car_to_left(); + self.rand.next_u16(); + } + if gamepad & crate::BUTTON_RIGHT != 0 { + self.car_pos.0 += 1; + self.car_to_right(); + self.rand.next_u16(); + } + + self.camera_pos.0 += ((self.car_pos.0 as f32 - 80f32) - self.camera_pos.0) * CAMERA_RATE; + self.camera_pos.1 += ((self.car_pos.1 as f32 - 80f32) - self.camera_pos.1) * CAMERA_RATE; + + let mut house_repaired = false; + for (x, y, state) in &mut self.houses { + if *state == 2 { + let dx = self.car_pos.0 - *x; + let dy = self.car_pos.1 - *y; + let dist = ((dx * dx + dy * dy) as f32).sqrt(); + if dist <= HOUSE_MAX_DIST { + *state = 1; + house_repaired = true; + } + } + } + if house_repaired { + for (x, y, state) in &mut self.houses { + if *state == 0 { + *state = 2; + // TODO + match self.rand.next_u16() % 4 { + 0 => (), + 1 => (), + 2 => (), + 3 => (), + _ => unreachable!(), + } + } + } + } + } + + pub fn draw(&mut self) { + unsafe { + *crate::DRAW_COLORS = 0x312; + } + + for (x, y) in self.shrubs { + crate::blit( + &PLANT, + ((x - PLANT_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() as i32, + ((y - PLANT_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() as i32, + PLANT_WIDTH, + PLANT_HEIGHT, + PLANT_FLAGS, + ) + } + + for (x, y, flags) in &mut self.houses { + // if self.car_frames == 0 { + // if *flags == 1 { + // *flags = 2; + // } else if *flags == 2 { + // *flags = 1; + // } + // } + match flags { + 0 => (), + 1 => crate::blit( + &HOUSE0, + ((*x - HOUSE0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() as i32, + ((*y - HOUSE0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() as i32, + HOUSE0_WIDTH, + HOUSE0_HEIGHT, + HOUSE0_FLAGS, + ), + 2 => crate::blit( + &HOUSE1, + ((*x - HOUSE1_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() as i32, + ((*y - HOUSE0_HEIGHT as i32 / 2 + (HOUSE0_HEIGHT - HOUSE1_HEIGHT) as i32) + as f32 + - self.camera_pos.1) + .round() as i32, + HOUSE1_WIDTH, + HOUSE1_HEIGHT, + HOUSE1_FLAGS, + ), + _ => (), + } + } + + self.car_frames += 1; + if self.car_frames > CAR_ANIM_FRAMES { + self.car_frames = 0; + if self.car_pos.2 > 3 { + self.car_pos.2 -= 4; + } else { + self.car_pos.2 += 4; + } + } + + match self.car_pos.2 { + 0 => crate::blit( + &CAR0, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR0_WIDTH, + CAR0_HEIGHT, + CAR0_FLAGS, + ), + 1 => crate::blit( + &CAR0, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR0_WIDTH, + CAR0_HEIGHT, + CAR0_FLAGS | crate::BLIT_FLIP_X, + ), + 2 => crate::blit( + &CAR0, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR0_WIDTH, + CAR0_HEIGHT, + CAR0_FLAGS | crate::BLIT_ROTATE, + ), + 3 => crate::blit( + &CAR0, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR0_WIDTH, + CAR0_HEIGHT, + CAR0_FLAGS | crate::BLIT_ROTATE | crate::BLIT_FLIP_X, + ), + 4 => crate::blit( + &CAR1, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR1_WIDTH, + CAR1_HEIGHT, + CAR1_FLAGS, + ), + 5 => crate::blit( + &CAR1, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR1_WIDTH, + CAR1_HEIGHT, + CAR1_FLAGS | crate::BLIT_FLIP_X, + ), + 6 => crate::blit( + &CAR1, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR1_WIDTH, + CAR1_HEIGHT, + CAR1_FLAGS | crate::BLIT_ROTATE, + ), + 7 => crate::blit( + &CAR1, + ((self.car_pos.0 - CAR0_WIDTH as i32 / 2) as f32 - self.camera_pos.0).round() + as i32, + ((self.car_pos.1 - CAR0_HEIGHT as i32 / 2) as f32 - self.camera_pos.1).round() + as i32, + CAR1_WIDTH, + CAR1_HEIGHT, + CAR1_FLAGS | crate::BLIT_ROTATE | crate::BLIT_FLIP_X, + ), + _ => (), + } + } +}