45个版本
0.3.214 | 2023年6月4日 |
---|---|
0.3.212 | 2023年5月14日 |
0.3.211 | 2023年3月8日 |
0.3.197 | 2022年12月27日 |
0.1.0 | 2020年4月4日 |
#147 in 游戏开发
每月198次下载
3MB
13K SLoC
跨平台引擎
Emerald被设计成尽可能轻量,同时保持功能齐全且跨平台。
API简单强大,为您提供直接访问物理、音频、图形、游戏世界和资产加载的能力。
支持的平台
--- 进行中 ---
资产加载
let my_sprite = emd.loader()
.sprite("my_sprite.png")
.unwrap();
let my_audio = emd.loader()
.sound("my_sound.wav")
.unwrap();
物理
创建身体
let entity = emd.world().spawn((Transform::from_translation((0.0, 0.0))));
let body_handle = emd.world().physics().build_body(
entity,
RigidBodyBuilder::dynamic()
);
emd.world().physics().build_collider(
body_handle,
ColliderDesc::cuboid(6.0, 6.0)
);
// You can alternatively build both the entity and body at once.
let (entity, body_handle) = emd.world()
.spawn_with_body(
(Transform::from_translation((0.0, 0.0))),
RigidBodyBuilder::dynamic()
)?;
物理步进
emd.world()
.physics()
.step();
您决定何时进行物理步进!这使得在不更改任何数据的情况下“暂停”游戏变得非常容易。
图形
默认的绘制游戏的方法是绘制当前世界中的所有实体。然而,如果您需要做更多,您可以编写自己的 draw
函数!
fn draw(&mut self, mut emd: Emerald) {
emd.graphics().begin();
emd.graphics().draw_world();
emd.graphics().render();
}
音频
let my_sound = emd.loader().sound("sounds/my_song.ogg")?;
emd.audio().mixer("background_music")?.play_and_loop(my_sound);
ECS
Emerald使用实体组件系统范式来创建、管理和更新游戏实体。
Emerald底层使用Hecs进行快速实体迭代,并提供一个非常干净的查询API。
更详细的功能可以在Hecs文档中找到。
for (id, (sprite, mut position)) in emd.world().query::<(&Sprite, &mut Position)>().iter() {
position.x += 10.0;
}
Aseprite
Emerald内置了aseprite加载和渲染。只需加载文件,然后告诉它要播放哪些动画。
let mut aseprite = emd.loader().aseprite("my_sprite.aseprite").unwrap();
aseprite.play("some_aseprite_animation");
emd.world().spawn((aseprite, Position::zero()));
或者,Emerald可以加载从aseprite导出的精灵表。
let mut aseprite = emd.loader()
.aseprite_with_animations("my_texture.png", "my_animation.json").unwrap();
导出设置
WASM (WIP,可能现在已损坏)
构建
cargobuild --targetwasm32-unknown-unknown
资产加载
为了保持干净、简单的API,并避免对资产的网络请求,Emerald将所有必要的资产打包到WASM二进制文件中。
此方法可以用来自动打包所有资产到游戏二进制文件中,无论目标平台为何。
使用 pack_asset_bytes
函数将数据加载到引擎中。
fn initialize(&mut self, mut emd: Emerald) {
/// Pack all game files into WASM binary with path references
/// so that the regular file loading Api is supported.
#[cfg(target_arch = "wasm32")]
{
emd.loader()
.pack_asset_bytes(
"bunny.png",
include_bytes!(".bunny.png").to_vec()
);
}
/// We can now load texture/sprites via the normal Api,
/// regardless of which platform we're targeting.
let sprite = emd.loader()
.sprite("bunny.png")
.unwrap();
// Default transform at 0.0, 0.0
let mut transform = Transform::default();
self.count = 1000;
emd.world().spawn_batch(
(0..1000).map(|_| {
transform.translation.x += 6.0;
transform.translation.y += 1.0;
let mut s = sprite.clone();
(transform.clone(), s, Vel { x: 5.0, y: 3.0 })
})
);
}
Android (WIP,可能现在已损坏)
资产加载
将以下内容添加到 Cargo.toml
并按常规加载资源
[package.metadata.android]
assets = "YOUR_ASSETS_DIRECTORY/"
依赖项
~20–37MB
~615K SLoC