1 个不稳定版本

0.1.1 2023 年 1 月 2 日
0.1.0 2023 年 1 月 2 日

#316 in 图形 API

MIT 许可证

190KB
4.5K SLoC

ROZE - 无依赖的游戏引擎。

ROZE 是一个使用 win32 和 OpenGL 的简易、无依赖的 Windows 游戏引擎。这是 0.1 版本,API 可能会有重大变化。

当前功能

  • 支持 32 位 rgba BMP 和 DDS 文件的纹理加载系统
  • 支持 WAV 文件的音频加载系统
  • 播放单次和循环音频的系统
  • 文本渲染
  • 鼠标、键盘和 Xinput 游戏手柄的输入系统
  • 随机数生成系统
  • 纹理精灵和基本图形系统
  • 基本的正交摄像机系统
  • 简易数学库
  • 纹理粒子系统
  • 基本的 fps、帧时间和性能统计

入口点

  • System 结构定义了大多数重要函数。

    • 检查 SystemConf 以获取更多项目设置选项。
  • 必须实现 EventFunctions 以启动项目。

  • 查看 ParticleProperties 以定义粒子。

入门

显示一个 600x600 的窗口,背景为红色。

pub struct Game {}

impl EventFunctions for Game {
    fn init(&mut self, system: &mut System) {}
    fn update(&mut self, system: &mut System, dt: Duration) {}
    fn draw(&mut self, system: &mut System) {
        system.display_clear(1.0, 0.0, 0.0, 1.0);
    }
}

fn main() {
    let system = System::new(600, 600, "Game Title");
    let game = Game {};
    Event::run(game, system);
}

使用精灵、纹理和音频系统

显示一个窗口,其中有一个旋转的纹理精灵。当左键单击时播放音频剪辑。

pub struct Game {
    rotation: f32,
}

impl EventFunctions for Game {
    fn init(&mut self, system: &mut System) {
        system.load_texture("textures/SpriteA.bmp");
        system.load_audio("audio/sound.wav");
    }
    fn update(&mut self, system: &mut System, dt: Duration) {
        self.rotation += 90.0 * dt.as_secs_f32();

        if system.mouse_pressed(MOUSECODE::L) {
            system.play_one_shot("sound", 1.0);
        }

        if system.keyboard_pressed(KEYCODE::ESC) {
            system.quit();
        }
    }
    fn draw(&mut self, system: &mut System) {
        system.display_clear(0.05, 0.08, 0.05, 0.0);

        system.sprite(
            system.screen_width() / 2.0,
            system.screen_height() / 2.0,
            0.0,
            100.0,
            100.0,
            self.rotation,
            system.get_texture("SpriteA"),
            (1.0, 1.0, 1.0, 1.0).into(),
        );
    }
}

fn main() {
    let system = System::new(800, 800, "Sprites, Textures and Audio");
    let game = Game { rotation: 0.0 };
    Event::run(game, system);
}

使用粒子和文本系统

定义一个无纹理的有色粒子效果,它从屏幕中心移动出来。还定义一个字体,在屏幕右上角显示当前 fps。

pub struct Game {
    particle_prop: ParticleProperties,
}

impl Game {
    pub fn new() -> Self {
        let particle_prop = ParticleProperties {
            pos: (0.0, 0.0, 0.0).into(),
            velocity: (0.0, 0.0, 0.0).into(),
            velocity_var: (150.0, 150.0, 0.0).into(),
            color_begin: (1.0, 0.0, 0.0, 1.0).into(),
            color_end: (0.0, 0.0, 1.0, 0.0).into(),
            size_begin: 15.0,
            size_end: 25.0,
            size_var: 10.0,
            lifetime: 5.0,
            tex_id: None,
        };
        Self { particle_prop }
    }
}

impl EventFunctions for Game {
    fn init(&mut self, system: &mut System) {
        self.particle_prop.pos = (
            system.screen_width() / 2.0,
            system.screen_height() / 2.0,
            0.0,
        )
            .into();

        system.define_font(
            "myFont",
            22,
            Weight::NORMAL,
            false,
            false,
            false,
            "consolas",
        );
    }
    fn update(&mut self, system: &mut System, _dt: Duration) {
        system.particle_emit(&self.particle_prop);

        if system.keyboard_pressed(KEYCODE::ESC) {
            system.quit();
        }
    }
    fn draw(&mut self, system: &mut System) {
        system.display_clear(0.05, 0.08, 0.05, 0.0);

        system.text(
            &format!("fps: {}", system.get_fps()),
            system.screen_width() - 100.0,
            20.0,
            (1.0, 1.0, 1.0, 1.0),
            "myFont",
        );
    }
}

fn main() {
    let config = SystemConf {
        window_title: "Particles".into(),
        screen_width: 1200,
        screen_height: 1200,
        audio_one_shot_channels: 10,
        audio_loop_channels: 5,
        particle_pool_size: 5000,
        rng_seed: 1,
        rng_pool_size: 1_000_000,
        lock_fps: false,
    };
    let system = System::new_ex(config);
    let game = Game::new();
    Event::run(game, system);
}

无运行时依赖