1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use pixel_game_lib::{
canvas::Canvas,
vek::Extent2,
vek::Vec2,
window::{Input, KeyCode, MouseButton, WindowConfig},
PixelGame,
};
/// Define a game state with a simple counter.
struct GameState {
/// Simple number that will be incremented when the mouse is pressed.
///
/// For each number a pixel is drawn.
pub pixels_to_draw: usize,
}
impl PixelGame for GameState {
// Update loop exposing input events we can handle, this is where you would handle the game logic
fn update(&mut self, input: &Input, _mouse_pos: Option<Vec2<usize>>, _dt: f32) -> bool {
// Increment when mouse is clicked
if input.mouse_held(MouseButton::Left) {
self.pixels_to_draw += 1;
}
// Exit when escape is pressed
input.key_pressed(KeyCode::Escape)
}
// Render loop exposing the pixel buffer we can mutate
fn render(&mut self, canvas: &mut Canvas<'_>) {
// Fill the window with a background color, if we don't fill it the pixels of the last frame will be drawn again
canvas.fill(0xFFFFFFFF);
// Ensure that we don't draw pixels outside of the canvas
let max_pixels_to_draw = canvas.size().product();
let pixels_to_draw = self.pixels_to_draw.min(max_pixels_to_draw);
// Draw a red color for each pixel
canvas.raw_buffer()[0..pixels_to_draw].fill(0xFFFF0000);
}
}
/// Open an empty window.
fn main() {
// Active modifiable state
let state = GameState { pixels_to_draw: 0 };
// Window configuration with huge pixels
let window_config = WindowConfig {
buffer_size: Extent2::new(64, 64),
scaling: 8,
..Default::default()
};
state.run(window_config).expect("Error running game");
}