1 个不稳定版本
0.1.1 | 2023 年 1 月 2 日 |
---|---|
0.1.0 |
|
#316 in 图形 API
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);
}