Login
1 branch 0 tags
Ben (Desktop/Arch) README.md dec69e2 25 days ago 2 Commits
gb-rs / src / main.rs

use macroquad::prelude::*;

mod gb;
mod input;
pub use gb::GameBoyState;
pub use input::Buttons;

const W: u32 = 160;
const H: u32 = 144;


#[macroquad::main("GB-RS")]
async fn main() {
    let mut state = GameBoyState::new();

    loop {
        if is_key_down(KeyCode::Escape) || is_key_down(KeyCode::Q) {
            break;
        }
        

        let but = Buttons::default();
        let but = but.set(Buttons::UP, is_key_down(KeyCode::Up));
        let but = but.set(Buttons::DOWN, is_key_down(KeyCode::Down));
        let but = but.set(Buttons::LEFT, is_key_down(KeyCode::Left));
        let but = but.set(Buttons::RIGHT, is_key_down(KeyCode::Right));
        let but = but.set(Buttons::A, is_key_down(KeyCode::Z));
        let but = but.set(Buttons::B, is_key_down(KeyCode::X));
        let but = but.set(Buttons::START, is_key_down(KeyCode::Enter));
        let but = but.set(Buttons::SELECT, is_key_down(KeyCode::Backspace));

        let delta = get_frame_time();
        state.emulate_for(delta, but);


        let fb = state.framebuffer();
        let tex = Texture2D::from_rgba8(160, 144, fb.as_slice());


        // --- letterbox math ---
        let sw = screen_width();
        let sh = screen_height();

        // Use integer scaling for crisp pixels (remove floor() if you want smooth scaling)
        let scale = (f32::min(sw / W as f32, sh / H as f32)).floor().max(1.0);

        let dw = W as f32 * scale;
        let dh = H as f32 * scale;

        let dx = (sw - dw) * 0.5;
        let dy = (sh - dh) * 0.5;

        // --- draw centered, scaled, no stretch ---
        clear_background(SKYBLUE);        
        draw_texture_ex(
            &tex,
            dx,
            dy,
            WHITE,
            DrawTextureParams {
                dest_size: Some(vec2(dw, dh)),
                ..Default::default()
            },
        );
        next_frame().await
    }
}