sge 1.0.4

Simple game engine
Documentation
use sge::*;
use sge_api::shapes_2d::Shape2DExt;

const PATTERNS: &[Pattern] = &[
    Pattern::Fill,
    Pattern::Checker,
    Pattern::HorizontalLines,
    Pattern::VerticalLines,
    Pattern::NwseLines,
    Pattern::NeswLines,
    Pattern::Dots,
    Pattern::Grid,
    Pattern::CrossHatch,
    Pattern::SparseDots,
    Pattern::Bricks,
    Pattern::HerringBone,
    Pattern::Triangles,
    Pattern::ConcentricSquares,
    Pattern::Waves,
    Pattern::ConcentricRings,
    Pattern::Textured,
    Pattern::Truchet,
    Pattern::RandomTiles,
    Pattern::DiagonalWaves,
    Pattern::Topology,
    Pattern::Zebra,
    Pattern::FishScales,
    Pattern::Maze,
    Pattern::Moire,
    Pattern::LeopardSpots,
    Pattern::Rings,
];

#[main("Patterned shapes")]
async fn main() {
    let mut controller = PanningCameraController::new();
    let mut i = 0;
    let n = PATTERNS.len();
    let w = (n as f32).sqrt().ceil() as usize;
    let colors = Palette::PALETTES.map(|p| p.v500);
    let mut scale = 50.0;

    loop {
        controller.update();

        draw_fps_black();

        if key_pressed(KeyCode::KeyN) {
            i = (i + 1) % n;
        }

        if key_pressed(KeyCode::ArrowUp) {
            scale *= 2.0;
        }

        if key_pressed(KeyCode::ArrowDown) {
            scale *= 0.5;
        }

        clear_screen(Color::NEUTRAL_100);

        for i in 0..n {
            let x = (i % w) as f32 * 400.0 - (w as f32 * 200.0);
            let y = (i / w) as f32 * 400.0 - (w as f32 * 200.0);
            let color = colors[i % colors.len()];
            let square = Rect::new_square(Vec2::new(x, y), 300.0, color);
            square.draw_outline_world(20.0, color);
            draw_shape_with_pattern_world(square, Color::TRANSPARENT, PATTERNS[i], scale);
        }

        if should_quit() {
            break;
        }

        next_frame().await;
    }
}