#wrapper #sdl #sge #graphics #gamedev #game-engine

simple-game-engine

受OLC像素游戏引擎启发的最小化游戏引擎

7个版本

0.8.3 2021年5月23日
0.8.2 2021年5月7日
0.6.1 2021年4月2日
0.6.0 2021年1月25日
0.5.2 2021年1月24日

#839 in 游戏开发

每月 23 次下载

MIT 和可能 GPL-3.0-or-later

34KB
508 代码行

Simple Game Engine

该项目旨在创建一个最小化但实用的游戏引擎。它深受像素游戏引擎的启发,目标是创建一个可以抽象出创建图形交互式应用程序和游戏的复杂性的东西。目前,它是对SDL2(使用sdl2 crate)的视觉上的轻量级封装。

目前这是一个高度实验性的项目,所以如果您有任何想法或愿意贡献,请提交一个issue

特性

  • 非常简单易用:只需在您选择的一种类型上实现`Application trait`,然后将此类型的实例传递给Engine::new()
  • 强大:您可以使用Rust中的sdl2做任何事情,我们提供了对一些更复杂的sdl2接口的轻量级封装。
  • 内置文本渲染:无需寻找TTF字体并将其与您的应用程序一起分发,只需调用Canvas::draw_text()方法即可。(见下文

关于文本渲染的注意事项

该crate使用GNU Unifont进行内置文本渲染。因此,如果您想使用此功能,则必须将您的项目分发给GPL。由于这对许多项目来说并不理想,因此此功能仅在构建此crate时使用“unifont”cargo功能时才启用。

[dependencies.simple-game-engine]
version = "0.8.2"
features = ["unifont"]

如果您想使用此字体以外的字体进行文本渲染,请考虑查看SDL2 TTF模块

安装

将以下内容添加到您的Cargo.toml

[dependencies]
simple-game-engine = "0.8.2"

本软件包依赖于 sdl2,可以通过多种方式构建和链接。

  • 默认情况下,如果存在系统版本的sdl,将使用系统版本。
  • 使用“bundled_sdl”功能,将下载最新版本的sdl2,编译并动态链接到您的程序。这需要您安装 cmake
  • 使用“static_sdl”功能,sdl2将被静态链接。

请参阅 sdl2软件包README 了解每个平台的安装说明。

示例

最简单的SGE程序看起来是这样的

use simple_game_engine::{self as sge, prelude::*};
use std::error::Error;

struct App {}

impl sge::Application for App {
    fn on_create(
        &mut self,
        canvas: &mut WindowCanvas,
        input: &InputState,
    ) -> sge::ApplicationResult {
        // Do one-time initialisation here
        Ok(true) // `true` indicates to continue running the application
    }

    fn on_update(
        &mut self,
        canvas: &mut WindowCanvas,
        input: &InputState,
        elapsed_time: f64,
    ) -> sge::ApplicationResult {
        // Handle user input, update the canvas, and perform any other tasks to be ran on each frame
        Ok(true) // `true` indicates to continue running the application
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    let mut app = App {};
    let mut engine = sge::Engine::new(
        &mut app,   // Application instance
        "Test App", // Window title
        640,        // Window width
        480,        // Window height
    )?;
    engine.start(true) // `true` starts the app with vsync enabled
}

on_createon_update 是可选的,但它们的默认实现没有任何功能,因此您可能希望至少定义一些逻辑用于 on_update,它在每一帧都会被调用。

依赖关系

~17MB
~354K SLoC