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 游戏开发

Download history

每月198次下载

MIT/Apache

3MB
13K SLoC

Rust 10K SLoC // 0.0% comments JavaScript 2K SLoC // 0.1% comments WebGPU Shader Language 29 SLoC

Emerald Crates.io License: MIT Discord chat

跨平台引擎

Emerald被设计成尽可能轻量,同时保持功能齐全且跨平台。

API简单强大,为您提供直接访问物理、音频、图形、游戏世界和资产加载的能力。

支持的平台

MacOS Linux Windows RaspberryPi

--- 进行中 ---

Android HTML5
--------------------------

资产加载

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