text/x-rust
•
1.86 KB
•
68 lines
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
}
}