10 releases (1 stable)

22.6.21 Jun 21, 2022
0.1.8 May 28, 2022
0.1.6 Apr 30, 2022
0.1.4 Mar 31, 2022

#231 in Graphics APIs

Download history 7/week @ 2024-02-19 6/week @ 2024-02-26 1/week @ 2024-03-11 142/week @ 2024-04-01

143 downloads per month

MIT license

755KB
766 lines

cat-box

crates.io Documentation MIT License

Work in progress game engine, inspired by arcade.

Getting started

Add cat-box to your Cargo.toml, and then follow the example below. Read the documentation for more info.

use cat_box::{draw_text, Game, Sprite, SpriteCollection, get_mouse_state, get_keyboard_state};
use sdl2::keyboard::Scancode;

fn main() {
    let game = Game::new("catbox demo", 1000, 800);

    let mut i = 0u8;
    let mut s = Sprite::new("duck.png", 500, 400).unwrap();
    let mut s2 = Sprite::new("duck.png", 400, 500).unwrap();

    let mut coll = SpriteCollection::new();
    for n in 0..10 {
        for o in 0..8 {
            let x = Sprite::new("duck.png", n * 100, o * 100).unwrap();
            coll.push(x);
        }
    } 
    game.run(|ctx| {
        i = (i + 1) % 255;
        ctx.set_background_colour(i as u8, 64, 255);

        draw_text(
            ctx,
            format!("i is {}", i),
            "MesloLGS NF Regular.ttf",
            72,
            (300, 300),
            cat_box::TextMode::Shaded {
                foreground: (255, 255, 255),
                background: (0, 0, 0),
            },
        )
        .unwrap();

        let (start_x, start_y) = s.position();
        let m = get_mouse_state(ctx);
        let x_diff = m.x - start_x;
        let y_diff = m.y - start_y;

        let angle = (y_diff as f64).atan2(x_diff as f64);
        s.set_angle(angle.to_degrees());

        for spr in coll.iter() {
            let (start_x, start_y) = spr.position();
            let m = get_mouse_state(ctx);
            let x_diff = m.x - start_x;
            let y_diff = m.y - start_y;

            let angle = (y_diff as f64).atan2(x_diff as f64);
            spr.set_angle(angle.to_degrees());
        }

        let keys = get_keyboard_state(ctx).keys;

        for key in keys {
            let offset = match key {
                Scancode::Escape => {
                    game.terminate();
                    (0, 0)
                },
                Scancode::W | Scancode::Up => (0, 5),
                Scancode::S | Scancode::Down => (0, -5),
                Scancode::A | Scancode::Left => (-5, 0),
                Scancode::D | Scancode::Right => (5, 0),
                _ => (0, 0),
            };

            s.translate(offset);

            for spr in coll.iter() {
                spr.translate(offset);
            }
        }

        s2.draw(ctx).unwrap();
        s.draw(ctx).unwrap();
        coll.draw(ctx).unwrap();
    })
    .unwrap();
}

Dependencies

~16MB
~353K SLoC