Cross-platform game engine in Rust.

Last update: Jun 17, 2022

macroquad

Github Actions Docs Crates.io version Discord chat

macroquad is a simple and easy to use game library for Rust programming language, heavily inspired by raylib.

macroquad attempts to avoid any Rust-specific programming concepts like lifetimes/borrowing, making it very friendly for Rust beginners. See the docs.

Features

  • Same code for all supported platforms, no platform dependent defines required
  • Efficient 2D rendering with automatic geometry batching
  • Minimal amount of dependencies: build after cargo clean takes only 16s on x230(~6years old laptop)
  • Immediate mode UI library included
  • Single command deploy for both WASM and Android build instructions

Supported platforms

  • PC: Windows/Linux/MacOs
  • HTML5
  • Android
  • IOS

Build instructions

Setting up a macroquad project

Macroquad is a normal rust dependency, therefore an empty macroquad project may be created with:

# Create empty cargo project
cargo init --bin

Add macroquad as a dependency to Cargo.toml:

[dependencies]
macroquad = "0.3"

Put some macroquad code in src/main.rs:

use macroquad::prelude::*;

#[macroquad::main("BasicShapes")]
async fn main() {
    loop {
        clear_background(RED);

        draw_line(40.0, 40.0, 100.0, 200.0, 15.0, BLUE);
        draw_rectangle(screen_width() / 2.0 - 60.0, 100.0, 120.0, 60.0, GREEN);
        draw_circle(screen_width() - 30.0, screen_height() - 30.0, 15.0, YELLOW);

        draw_text("IT WORKS!", 20.0, 20.0, 30.0, DARKGRAY);

        next_frame().await
    }
}

And to run it natively:

cargo run

For more examples take a look on Macroquad examples folder

linux

# ubuntu system dependencies
apt install pkg-config libx11-dev libxi-dev libgl1-mesa-dev libasound2-dev

# fedora system dependencies
dnf install libX11-devel libXi-devel mesa-libGL-devel alsa-lib-devel

# arch linux system dependencies
 pacman -S pkg-config libx11 libxi mesa-libgl alsa-lib

windows

On windows both MSVC and GNU target are supported, no additional dependencies required.

Also cross-compilation to windows from linux is supported:

rustup target add x86_64-pc-windows-gnu

cargo run --target x86_64-pc-windows-gnu

wasm

rustup target add wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown

This will produce .wasm file in target/debug/wasm32-unknown-unknown/CRATENAME.wasm or in target/release/wasm32-unknown-unknown/CRATENAME.wasm if built with --release.

And then use the following .html to load it:

index.html
TITLE ">
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>TITLEtitle>
    <style>
        html,
        body,
        canvas {
            margin: 0px;
            padding: 0px;
            width: 100%;
            height: 100%;
            overflow: hidden;
            position: absolute;
            background: black;
            z-index: 0;
        }
    style>
head>

<body>
    <canvas id="glcanvas" tabindex='1'>canvas>
    
    <script src="https://not-fl3.github.io/miniquad-samples/mq_js_bundle.js">script>
    <script>load("CRATENAME.wasm");script>  body> html>

One of the ways to server static .wasm and .html:

cargo install basic-http-server
basic-http-server .
tips Adding the following snippet to your Cargo.toml ensures that all dependencies compile in release even in debug mode. In macroquad, this has the effect of making images load several times faster and your applications much more performant, while keeping compile times miraculously low.
[profile.dev.package.'*']
opt-level = 3

async/await

While macroquad attempts to use as few Rust-specific concepts as possible, .await in all examples looks a bit scary. Rust's async/await is used to solve just one problem - cross platform main loop organization.

details

The problem: on WASM and android it's not really easy to organize the main loop like this:

fn main() {
    // do some initialization

    // start main loop
    loop {
        // handle input

        // update logic

        // draw frame
    }
}

It is fixable on Android with threads, but on web there is not way to "pause" and "resume" WASM execution, so no WASM code should block ever. While that loop is blocking for the entire game execution! The C++ solution for that problem: https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html

But in Rust we have async/await. Rust's futures is basically a continuations - future's stack may be store into a variable to later pause/resume execution of future's code.

async/await in macroquad is used without any external dependencies - no runtime, executor or even futures-rs are involved. It's just a way to preserve main's stack on WASM and keep the code cross platform without any WASM-specific main loop.

Community

  • Quads Discord server - a place to chat with the library's devs and other community members.
  • Awesome Quads - a curated list of links to miniquad/macroquad-related code & resources.

Platinum sponsors

Macroquad is supported by:

GitHub

https://github.com/not-fl3/macroquad
Comments
  • 1. Allow users to use arbitrary futures

    fixes #286

    In the future (haha), when we get a pending future, we could even consider sleeping/yielding the current thread until a waker has been invoked.

    Some background on why I hit this:

    I had to wait for a callback in some js code that I invoked. I didn't want to just loop until the value is created (not even sure that would work), so I tried implementing a future. I did a trivial one first, that didn't use wakers and just returned pending as long as there was no value. That just caused the entire macroquad state to get stuck somewhere, since I wasn't using the ExecState datastructure. I didn't know about that yet, so I tried implementing a waker system by sending a boxed waker to js and creating a wasm callback that js can call in order to wake the waker. So good so far, but then the wasm crashed with an index out of bounds. Some debugging later I land in the resume function and am trying to understand what is going on. Some research on futures, contexts and wakers later I opened #286. It wasn't quite as easy as I thought in the issue, but this PR has no user-visible changes, except that custom futures now work.

    If you like this change, I could later also add some helpers (probably to sapp-jsutils) to make it easier for people to write their own futures that wrap a js callback/promise.

    Reviewed by oli-obk at 2021-09-02 10:07
  • 2. Using wasm with macroquad

    I came by this library because I heard its very simple and can compile into wasm. I copied one of the examples and it worked but when i tried to put it on web with the instructions, i kept seeing the same error. I even cloned one of the examples and did the exact steps and i got the same error. The error was : image Please help!!

    Reviewed by ZeroTixDev at 2021-03-23 16:33
  • 3. Constrain Mouse To Window (For First Person Camera infinite mouse scrolling)

    I'm trying to get a first person 3D camera to work. Currently, I can successfully fly around the world and look using the mouse.

    However, when the mouse reaches the edge of the screen, it hits the edge and no longer gives any mouse position information.

    There are 2 ways to solve this that I can see:

    1. Keep sending mouse events when mouse is outside the window.
    2. Allow the user to set the mouse position so they can control wrapping the mouse when it goes outside the window.

    I don't know if Sokol uses GLFW but in Raylib (GLFW), I have this same problem on Linux. Not quite sure how to solve it without a way to set the cursor position.

    Note: I have used the ctx.set_cursor_grab(true) and ctx.show_mouse(false) functions and it doesn't change the above behavior.

    Alternatively, if another 3D example could be created that tests the mouse look and screen border interaction that would be amazing.

    Here is what I've got so far for reference:

    use macroquad::prelude::*;
    // use glam::vec3;
    
    const MOVE_SPEED: f32 = 0.1;
    const LOOK_SPEED: f32 = 0.1;
    
    
    fn conf() -> Conf
    {
        Conf {
            window_title: String::from("Macroquad"),
            window_width: 1260,
            window_height: 768,
            fullscreen: true,
            ..Default::default()
        }
    }
    
    #[macroquad::main(conf)]
    async fn main() {
        let InternalGlContext { quad_context: ctx, ..} = unsafe { get_internal_gl() };
    
        ctx.show_mouse(false);
        ctx.set_cursor_grab(true);
    
        let dirt = load_texture("Dirt.png").await;
        dirt.set_filter(ctx, FilterMode::Nearest);
    
        let mut x = 0.0;
        let mut switch = false;
        let bounds = 8.0;
    
    
        let world_up = vec3(0.0, 1.0, 0.0);
        let mut yaw: f32 = 0.0;
        let mut pitch: f32 = 0.0;
    
        let mut facing = vec3(
            yaw.cos() * 1.0,
            0.0,
            yaw.sin() * 1.0
        ).normalize();
    
        let mut front = vec3(
            yaw.cos() * pitch.cos(),
            pitch.sin(),
            yaw.sin() * pitch.cos()
        ).normalize();
        let mut right = front.cross(world_up).normalize();
        let mut up;
    
        let mut position = vec3(0.0, 1.0, 0.0);
        let mut last_mouse_position: Vec2 = mouse_position().into();
    
        let mut own_mouse_position = vec2(0.0, 0.0);
    
        loop {
            let delta = get_frame_time();
            
            if is_key_pressed(KeyCode::Escape) { break; }
    
            if is_key_down(KeyCode::Up) { position += front * MOVE_SPEED; }
            if is_key_down(KeyCode::Down) { position -= front * MOVE_SPEED; }
            if is_key_down(KeyCode::Left) { position -= right * MOVE_SPEED; }
            if is_key_down(KeyCode::Right) { position += right * MOVE_SPEED; }
    
            let mouse_position: Vec2 = mouse_position().into();
            let mouse_delta = mouse_position - last_mouse_position;
            last_mouse_position = mouse_position;
    
            yaw += mouse_delta.x * delta * LOOK_SPEED;
            pitch += mouse_delta.y * delta * -LOOK_SPEED;
    
            pitch = if pitch > 1.5 { 1.5 } else { pitch };
            pitch = if pitch < -1.5 { -1.5 } else { pitch };
    
            facing = vec3(
                yaw.cos() * 1.0,
                0.0,
                yaw.sin() * 1.0
            ).normalize();
        
            front = vec3(
                yaw.cos() * pitch.cos(),
                pitch.sin(),
                yaw.sin() * pitch.cos()
            ).normalize();
    
            right = front.cross(world_up).normalize();
            up = right.cross(front).normalize();
    
    
            x += if switch { 0.04 } else { -0.04 };
            if x >= bounds || x <= -bounds { switch = !switch; }
    
            clear_background(Color::new(1.0, 0.7, 0.0, 1.0));
    
            // Going 3d!
    
            set_camera(Camera3D {
                position: position,
                up: up,
                target: position + front,
                ..Default::default()
            });
    
            draw_grid(20, 1.);
    
            draw_line_3d(vec3(x, 0.0, x), vec3(5.0, 5.0, 5.0), Color::new(1.0, 1.0, 0.0, 1.0));
    
            draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN);
            draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE);
            draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW);
    
            draw_cube(vec3(x, 1., x), vec3(2., 2., 2.), dirt, WHITE);
    
            // Back to screen space, render some text
    
            set_default_camera();
            draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK);
    
            draw_text(format!("X: {} Y: {}", own_mouse_position.x, own_mouse_position.y).as_str(), 10.0, 48.0, 30.0, BLACK);
            draw_text(format!("X: {} Y: {}", mouse_position.x, mouse_position.y).as_str(), 10.0, 48.0 + 18.0, 30.0, BLACK);
    
            next_frame().await
        }
    }
    
    Reviewed by Pebaz at 2021-01-23 19:38
  • 4. [Question] How to limit FPS?

    I want to test wether delta time in my game works as expected and want to test the game on different fps, but there's no function to do that, can you add one, please? It's not even necessary for it to work on all platforms, just desktop would be nice, for debugging and stuff.

    Reviewed by alexmozaidze at 2022-01-28 17:53
  • 5. screen_width/height wrong before resize

    easiest to see in the camera example (note the debug logging for the screen size I added)

    use macroquad::prelude::*;
    
    #[macroquad::main("Camera")]
    async fn main() {
        loop {
            clear_background(RED);
    
            // Render some primitives in camera space
    
            debug!("size: {},{}",screen_width() ,screen_height());
    
            set_camera(Camera2D {
                zoom: vec2(1., screen_width() / screen_height()),
                ..Default::default()
            });
            draw_line(-0.4, 0.4, -0.8, 0.9, 0.05, BLUE);
            draw_rectangle(-0.3, 0.3, 0.2, 0.2, GREEN);
            draw_circle(0., 0., 0.1, YELLOW);
    
            // Back to screen space, render some text
    
            set_default_camera();
            draw_text("HELLO", 30.0, 200.0, 30.0, BLACK);
    
            next_frame().await
        }
    }
    

    leads to this output:

    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    size: 1600,1200
    resize_event: 807,606
    size: 807,606
    ....
    

    the window looks like this before I resize (this is not 1600x1200): image

    after a tiny resize it has the correct values and the camera works: image

    note that I am testing this on MacOS

    Reviewed by extrawurst at 2021-03-22 23:43
  • 6. button hitbox is offset from where the button actually is

    using this code

    use macroquad::prelude::*;
    use macroquad::math::vec2;
    use macroquad::ui::{root_ui, widgets};
    #[macroquad::main("button testing")]
    async fn main() {
        loop {
            clear_background(BLACK);
            if widgets::Button::new("push me").size(vec2(100.0, 100.0)).position(vec2(100.0, 100.0)).ui(&mut *root_ui()) {
                println!("button was pushed");
            }
            next_frame().await;
        }
    }
    

    This shows up The yellow rectangle was added in by me to show approximately where the button could be clicked, and it doesn't line up with the actual button button testing The hitbox (clickbox?) seems to have different offsets if I move the button to different parts of the screen. However, it always offsets towards the top left of the button. any help?

    Reviewed by Eisverygoodletter at 2021-12-08 05:11
  • 7. Problem building WASM

    Looking into using macroquad for a WASM prototype. For some reason the WASM build seems to be failing on a missing import.

    image

    Just following the documentation, and double checked everything. gl.js which is placed online maybe outdated?

    Great work on the implementation, and fundamental choices.

    Reviewed by boymaas at 2020-06-06 17:09
  • 8. Error compiling v0.3.19

    It's the first time I'm using macroquad, I used ggez and gwg in the past. I get this error when trying to compile my first example: #################################### Compiling macroquad v0.3.19 (/home/amsoares/Programming/rust/macroquad-master) error[E0107]: this struct takes 0 lifetime arguments but 2 lifetime arguments were supplied --> src/window.rs:35:41 | 35 | pub quad_context: &'a mut miniquad::Context<'static, 'static>, | ^^^^^^^------------------ help: remove these generics | | | expected 0 lifetime arguments | note: struct defined here, with 0 lifetime parameters --> /home/amsoares/.cargo/registry/src/github.com-1ecc6299db9ec823/miniquad-0.3.8/src/graphics.rs:632:12 | 632 | pub struct GraphicsContext { | ^^^^^^^^^^^^^^^

    error[E0107]: this struct takes 0 lifetime arguments but 2 lifetime arguments were supplied --> src/lib.rs:153:19 | 153 | quad_context: QuadContext<'static, 'static>, | ^^^^^^^^^^^------------------ help: remove these generics | | | expected 0 lifetime arguments | note: struct defined here, with 0 lifetime parameters --> /home/amsoares/.cargo/registry/src/github.com-1ecc6299db9ec823/miniquad-0.3.8/src/graphics.rs:632:12 | 632 | pub struct GraphicsContext { | ^^^^^^^^^^^^^^^

    For more information about this error, try rustc --explain E0107. #################################### My environment: #################################### [email protected]:macroquad-master$ rustup show Default host: x86_64-unknown-linux-gnu rustup home: /home/amsoares/.rustup

    installed targets for active toolchain

    wasm32-unknown-unknown wasm32-wasi x86_64-unknown-linux-gnu

    active toolchain

    stable-x86_64-unknown-linux-gnu (default) rustc 1.61.0 (fe5b13d68 2022-05-18) #################################### Thanks

    Reviewed by ccie18473 at 2022-06-18 19:57
  • 9. Nothing gets drawn with v0.3.18 (and segmentation fault)

    Using an iMac with MacOS v12.4, I created a brand new project in VS Code, added Macroquad as a dependency, and pasted the example text into main.rs: `use macroquad::prelude::*;

    #[macroquad::main("BasicShapes")] async fn main() { loop { clear_background(RED);

        draw_line(40.0, 40.0, 100.0, 200.0, 15.0, BLUE);
        draw_rectangle(screen_width() / 2.0 - 60.0, 100.0, 120.0, 60.0, GREEN);
        draw_circle(screen_width() - 30.0, screen_height() - 30.0, 15.0, YELLOW);
    
        draw_text("IT WORKS!", 20.0, 20.0, 30.0, DARKGRAY);
    
        next_frame().await
    }
    

    }`

    The app runs but all I get is the red background. No line, rectangle, circle, or text.

    I have not had a problem with previous Macroquad versions (all good through 0.3.16). Also (and it must be related), with existing, larger projects than ran fine under previous versions of Macroquad, I can't get 0.3.18 to run at all. I get a segmentation fault.

    (Is there a way to specify an exact, earlier version of Macroquad in cargo.toml?)

    Reviewed by getzen at 2022-06-13 18:35
  • 10. Android build crashes, cannot locate symbol "glStencilOpSeparate"

    I build an apk package and install with:

    $ docker run --rm -v $(pwd):/root/src -w /root/src notfl3/cargo-apk cargo quad-apk build --release
    $ adb install target/android-artifacts/release/apk/app.apk
    

    When I start the app on the Android phone (Fairphone 3 running Android 10) it crashes without displaying anything.

    Running adb logcat I find errors where it fails to locale the symbol "glStencilOpSeparate":

    12-12 12:26:17.002  7783  7783 E AndroidRuntime: java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/app.example.com-xxxx==/lib/arm64/libapp.so": dlopen failed: cannot locate symbol "glStencilOpSeparate" referenced by "/data/app/app.example.com-xxxx==/lib/arm64/libapp.so"...
    

    I have built this same project before for Android with the docker image builder without problems, but that was a few months ago and on another machine (Arch Linux both times).

    I'm using macroquad = { version = "0.3", features = ["log-impl"] } in my Cargo.toml


    Steps to reproduce in a new project:

    $ mkdir androidtest
    $ cd androidtest
    $ cargo init
    

    Add macroquad = "0.3" to dependency section of Cargo.toml

    Open src/main.rs and replace the content with:

    use macroquad::prelude::*;
    
    #[macroquad::main("BasicShapes")]
    async fn main() {
        loop {
            clear_background(RED);
    
            draw_line(40.0, 40.0, 100.0, 200.0, 15.0, BLUE);
            draw_rectangle(screen_width() / 2.0 - 60.0, 100.0, 120.0, 60.0, GREEN);
            draw_circle(screen_width() - 30.0, screen_height() - 30.0, 15.0, YELLOW);
    
            draw_text("IT WORKS!", 20.0, 20.0, 30.0, DARKGRAY);
    
            next_frame().await
        }
    }
    

    Build Android apk and install to Android device with:

    $ docker run --rm -v $(pwd):/root/src -w /root/src notfl3/cargo-apk cargo quad-apk build --release
    $ adb install target/android-artifacts/release/apk/androidtest.apk
    

    Start the app on the phone (used Fairphone 3 with Android 10), then check logs with:

    $ adb logcat | grep androidtest
    

    For this new project it instead logs cannot locate symbol "glAttachShader", but the pattern is otherwise similar:

    12-12 13:21:45.807 14324 14324 E AndroidRuntime: Process: rust.androidtest, PID: 14324
    12-12 13:21:45.807 14324 14324 E AndroidRuntime: java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/rust.androidtest-I71JsUQHONeEUuyI3-lZiA==/lib/arm64/libandroidtest.so": dlopen failed: cannot locate symbol "glAttachShader" referenced by "/data/app/rust.androidtest-I71JsUQHONeEUuyI3-lZiA==/lib/arm64/libandroidtest.so"...
    12-12 13:21:45.809  1580 11173 W ActivityTaskManager:   Force finishing activity rust.androidtest/android.app.NativeActivity
    12-12 13:21:45.893  1580  3662 I ActivityManager: Process rust.androidtest (pid 14324) has died: vis+99 TOP 
    12-12 13:21:46.309  1580  1661 W ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{27523c1 u0 rust.androidtest/android.app.NativeActivity t-1 f}
    12-12 13:21:48.049  1580  6690 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=rust.androidtest/android.app.NativeActivity bnds=[839,258][1039,540]} from uid 10023
    12-12 13:21:48.084  1580  1674 I ActivityManager: Start proc 14354:rust.androidtest/u0a326 for activity {rust.androidtest/android.app.NativeActivity}
    12-12 13:21:48.155 14354 14354 W NativeActivity: NativeActivity LoadNativeLibrary("/data/app/rust.androidtest-I71JsUQHONeEUuyI3-lZiA==/lib/arm64/libandroidtest.so") failed: dlopen failed: cannot locate symbol "glAttachShader" referenced by "/data/app/rust.androidtest-I71JsUQHONeEUuyI3-lZiA==/lib/arm64/libandroidtest.so"...
    

    Are there some OpenGL libraries that needs to be linked during build to get access to the "glStencilOpSeparate" and "glAttachShader" symbols?

    Reviewed by tirithen at 2021-12-12 12:07
  • 11. set_camera function not working correctly

    Looks like https://github.com/not-fl3/macroquad/tree/e5fce26e6cd436f2b57e08931e1d32a37c361bff commit broke some camera logic.

    I have find out the issue with my project, but at least arkanoid.rs from examples folder works fine on the commit before and starting to show something strange with this one.

    arkanoid before e5fce26e6cd436f2b57e08931e1d32a37c361bff commit Screenshot 2021-09-18 at 11 18 25

    arkanoid with e5fce26e6cd436f2b57e08931e1d32a37c361bff commit Screenshot 2021-09-18 at 11 17 41

    Reviewed by GerodruS at 2021-09-18 08:22
  • 12. get target fps

    Is there a function that returns the FPS that macroquad is attempting to render?

    I see macroquad::time::get_fps returns the current FPS. But that may be lower than target.

    Reviewed by sloganking at 2022-06-25 18:48
  • 13. Reloading a wasm game doesn't show anything on the canvas (No erros on console).

    Currently I'm trying to host on my site (made with Nuxt) a small game I made using macroquad 0.3 and compiling to wasm.

    I load the mq_js_bundle.js (this version in particular) and everything works great. However, the component showing the game is unmounted once you close it, and when opening it again, after calling the load function the game appears to instantiate (I can see the requests for assets in my network panel) but the canvas doesn't show anything and I see no errors on the console. Is there any way to debug this?

    I noticed that on the examples page games are shown with an iframe which would give a new context every time, but also download the mq_js_bundle.js every time. My idea was to lazy load the js file only once, and then call load every time it was needed. Is this way not supported?

    Reviewed by luis-agm at 2022-06-21 08:32
  • 14. `is_mouse_button_pressed` randomly requires 1 or 2 clicks

    When trying to run the compiled program (both debug and release) the program randomly requires 1 or 2 clicks for is_mouse_button_pressed to activate (different depending of the launch, but same during one launch of a program). I tried it on 0.3.15 and 0.3.16, ~~0.3.18 doesn't render anything at all~~ and 0.3.19 too.

    The same behavior is with is_mouse_button_down

    M1 mac, latest OS version, latest stable rust version

    Reviewed by s-valent at 2022-06-14 16:50
  • 15. load_texture() memory leak

    loop{
        load_texture("./test.png").await.unwrap();
    }
    

    The above rust code will continue to fill ram until it is exhausted. Is this a memory leak or am I supposed to manually deallocate loaded textures? If so then how?

    Macroquad version: 0.3.18

    Reviewed by sloganking at 2022-06-14 04:17
  • 16. Problems creating windows in high DPI mode on Windows

    Using this code to create a test window on macroquad-0.3.18, running on Windows 10.

    use macroquad::prelude::*;
    
    fn window_conf() -> Conf {
        Conf {
            window_title: "Test".to_owned(),
            fullscreen: false,
            window_width: 2048,
            window_height: 1536,
            high_dpi: true,
            ..Default::default()
        }
    }
    
    #[macroquad::main(window_conf)]
    async fn main() {
        println!("Screen {}x{}", screen_width(), screen_height());
        loop {
            clear_background(BLACK);
            next_frame().await
        }
    }
    

    However this does not produce a window of the correct size, or even the correct ratio, it prints:

    Screen 962x530.5
    

    The window also does not have the correct title, and is positioned in the wrong place (partly off screen), as shown here:

    image

    Reviewed by tomshackell at 2022-06-12 12:31
A cross platform classic RPG game creator written in Rust.
A cross platform classic RPG game creator written in Rust.

Eldiron - Classic RPG Creation Create RPGs for every platform with Eldiron. Eldiron v1 will be able to create games similar to the classic Ultima seri

Jun 4, 2022
This is a cross-platform tool to historicize different branches/depots/manifests and generating pseudocode for it to compare different game updates
This is a cross-platform tool to historicize different branches/depots/manifests and generating pseudocode for it to compare different game updates

CSHP This is a cross-platform tool to historicize different branches/depots/manifests and generating pseudocode for it to compare different game updat

Jan 28, 2022
Minecraft-esque voxel engine prototype made with the bevy game engine. Pending bevy 0.6 release to undergo a full rewrite.
Minecraft-esque voxel engine prototype made with the bevy game engine. Pending bevy 0.6 release to undergo a full rewrite.

vx_bevy A voxel engine prototype made using the Bevy game engine. Goals and features Very basic worldgen Animated chunk loading (ala cube world) Optim

Jun 18, 2022
2-player game made with Rust and "ggez" engine, based on "Conway's Game of Life"
2-player game made with Rust and

fight-for-your-life A 2-player game based on the "Conway's Game of Life", made with Rust and the game engine "ggez". Create shapes on the grid that wi

Oct 25, 2021
A game of snake written in Rust using the Bevy game engine, targeting WebGL2

Snake using the Bevy Game Engine Prerequisites cargo install cargo-make Build and serve WASM version Set your local ip address in Makefile.toml (loca

Dec 26, 2021
2d Endless Runner Game made with Bevy Game Engine
2d Endless Runner Game made with Bevy Game Engine

Cute-runner A 2d Endless Runner Game made with Bevy Game Engine. Table of contents Project Infos Usage Screenshots Disclaimer Project Infos Date: Sept

Sep 30, 2021
A game made in one week for the Bevy engine's first game jam

¿Quien es el MechaBurro? An entry for the first Bevy game jam following the theme of "Unfair Advantage." It was made in one week using the wonderful B

Jun 14, 2022
Solana Game Server is a decentralized game server running on Solana, designed for game developers

Solana Game Server* is the first decentralized Game Server (aka web3 game server) designed for game devs. (Think web3 SDK for game developers as a ser

Jun 7, 2022
Cross-platform (including wasm) persistent key value store plugin for rust games/apps

bevy_pkv bevy_pkv is a cross-platform persistent key value store for rust apps. Use it for storing things like settings, save games etc. Currently, it

Jun 1, 2022
Cross platform rendering in Rust
Cross platform rendering in Rust

Miniquad Miniquad is a manifestation of a dream in a world where we do not need a deep dependencies tree and thousands lines of code to draw things wi

Jun 24, 2022
Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows)

webview A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs. Also, there are Rust bindings, Python bindings, Ni

Jun 23, 2022
IDE for cross-platform software development

Diversity Space IDE for cross-platform software development | 日本語 | English | Русский | READMEの英語版とロシア語版はDeepl翻訳を使用して翻訳されています Английская и русская вер

Feb 23, 2022
A cross platform (wasm included) networking library!

bootleg_networking A cross platform (wasm included) networking library! A networking plugin for the Bevy game engine that wraps around bevy_networking

Jun 1, 2022
A lightweight, cross-platform epub reader.
A lightweight, cross-platform epub reader.

Pend Pend is a program for reading EPUB files. Check out the web demo! Preview Image(s) Installation Building Pend is simple & easy. You should be abl

May 5, 2022
A refreshingly simple data-driven game engine built in Rust

What is Bevy? Bevy is a refreshingly simple data-driven game engine built in Rust. It is free and open-source forever! WARNING Bevy is still in the ve

Jun 17, 2022
RTS game/engine in Rust and WebGPU
RTS game/engine in Rust and WebGPU

What is this? A real time strategy game/engine written with Rust and WebGPU. Eventually it will be able to run in a web browser thanks to WebGPU. This

May 19, 2022
unrust - A pure rust based (webgl 2.0 / native) game engine

unrust A pure rust based (webgl 2.0 / native) game engine Current Version : 0.1.1 This project is under heavily development, all api are very unstable

Jun 20, 2022
A no-frills Tetris implementation written in Rust with the Piston game engine, and Rodio for music.
A no-frills Tetris implementation written in Rust with the Piston game engine, and Rodio for music.

rustris A no-frills Tetris implementation written in Rust with the Piston game engine, and Rodio for music. (C) 2020 Ben Cantrick. This code is distri

Jun 20, 2022
Rust implementation of Another World (aka Out of this world) game engine
Rust implementation of Another World (aka Out of this world) game engine

RustyWorld Rust implementation of Another World (aka Out of this world) game engine. I wanted a fun project to challenge myself while learning Rust, a

Jul 1, 2021