1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//! A minimal game engine that's really easy to get started with.
//!
//! This project aims to create a minimal, yet usable, game engine. It is heavily inspired by [the Pixel Game Engine](https://github.com/OneLoneCoder/olcPixelGameEngine),
//! with the goal of creating something that abstracts away the complexities of creating graphical, interactive apps and
//! games. Right now, it's a thin wrapper around [SDL2](https://www.libsdl.org) (using the [sdl2
//! crate](https://crates.io/crates/sdl2)) for visuals.
//! # Features
//! * **Very simple to use:** Just implement the [`Application` trait][Application] on a type of your choice, then pass an instance of this type to [`Engine::new`].
//! * **Powerful:** Anything you can do with sdl2 from Rust, you can do with this library, and we provide thin abstractions over some of the more convoluted sdl2 interfaces.
//! * **Built-in text rendering:** No need to find a TTF font and distribute it with your application, just call the [`Canvas::draw_text`][canvas::Canvas::draw_text] method. ([see below](#caveats-with-text-rendering))
//! ## Caveats With Text Rendering
//! This crate uses the [GNU Unifont][unifont] for built-in text rendering. As such, if you wish to use this feature, you
//! must distribute your project under the [GPL][gpl]. As this is not desirable for many projects, this feature is only
//! enabled if this crate is built with the "unifont" cargo feature.
//! ```toml
//! [dependencies.simple-game-engine]
//! version = "0.8.2"
//! features = ["unifont"]
//! ```
//! If you'd like to render text without using this font, consider checking out the [SDL2 TTF module][sdl2-ttf].
//!
//! [unifont]: <http://unifoundry.com/unifont/index.html>
//! [gpl]: <https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html>
//! [sdl2-ttf]: <https://docs.rs/sdl2/latest/sdl2/ttf/index.html>
//! # Example
//! The simplest SGE program looks like this:
//! ```no_run
//! 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_create` and `on_update` are optional, but their default implementation does nothing, so
//! you'll probably want to define some logic for at least `on_update`, which is called for every
//! frame.
pub use Engine;
pub use WindowCanvas;
use Error;
pub use ;
/// The return type of [`Application::on_create`] and [`Application::on_update`].
pub type ApplicationResult = ;
/// An application using this framework.