3 个不稳定版本

0.2.0 2023年7月14日
0.1.1 2021年9月1日
0.1.0 2021年7月12日

#153性能分析

Download history 26/week @ 2024-03-11 23/week @ 2024-03-18 31/week @ 2024-03-25 132/week @ 2024-04-01 13/week @ 2024-04-08 13/week @ 2024-04-15 19/week @ 2024-04-22 33/week @ 2024-04-29 9/week @ 2024-05-06 18/week @ 2024-05-13 22/week @ 2024-05-20 12/week @ 2024-05-27 16/week @ 2024-06-03 9/week @ 2024-06-10 18/week @ 2024-06-17 9/week @ 2024-06-24

每月 53 次下载
用于 2 crate

MIT/Apache

1MB
12K SLoC

macroquad

Github Actions Docs Crates.io version Discord chat

macroquad 是一个简单易用的 Rust 编程语言的游戏库,灵感主要来自 raylib

功能

  • 所有支持的平台使用相同的代码,无需平台相关的定义。
  • 高效的 2D 渲染,具有自动几何体批处理。
  • 依赖项最少:在 x230 上(大约 6 年前的笔记本电脑)使用 cargo clean 构建,只需 16 秒。
  • 包含即时模式 UI 库。
  • 一次命令即可部署 WASM 和 Android(构建说明)。

支持的平台

  • PC: Windows/Linux/macOS;
  • HTML5;
  • Android;
  • IOS.

构建说明

设置 Macroquad 项目

Macroquad 是一个正常的 Rust 依赖项,因此可以使用以下命令创建一个空的 Macroquad 项目:

# Create empty cargo project
cargo init --bin

在 Cargo.toml 中添加 macroquad 作为依赖项


[dependencies]
macroquad = "0.4"

src/main.rs 中放置一些 macroquad 代码

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
    }
}

并本地运行它

cargo run

有关更多示例,请参阅 Macroquad 示例文件夹

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

在 Windows 上,支持 MSVC 和 GNU 目标,无需额外的依赖项。

还支持从 Linux 跨编译到 Windows

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

这将生成位于 target/debug/wasm32-unknown-unknown/CRATENAME.wasm 或在 target/release/wasm32-unknown-unknown/CRATENAME.wasm 的 .wasm 文件中,如果使用 --release 构建。

然后使用以下 .html 来加载它

index.html
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>TITLE</title>
    <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>
    <!-- Minified and statically hosted version of https://github.com/not-fl3/macroquad/blob/master/js/mq_js_bundle.js -->
    <script src="https://not-fl3.github.io/miniquad-samples/mq_js_bundle.js"></script>
    <script>load("CRATENAME.wasm");</script> <!-- Your compiled wasm file -->
</body>

</html>

服务静态.wasm和.html文件的一种方法

cargo install basic-http-server
basic-http-server .

IOS

在模拟器上运行

mkdir MyGame.app
cargo build --target x86_64-apple-ios --release
cp target/release/mygame MyGame.app
# only if the game have any assets
cp -r assets MyGame.app
cat > MyGame.app/Info.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>mygame</string>
<key>CFBundleIdentifier</key>
<string>com.mygame</string>
<key>CFBundleName</key>
<string>mygame</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
</dict>
</plist>
EOF

xcrun simctl install booted MyGame.app/
xcrun simctl launch booted com.mygame

有关为真实iPhone配置的详细信息和说明,请查看https://macroquad.rs/articles/ios/

提示将以下片段添加到您的Cargo.toml中可以确保所有依赖项即使在调试模式下也能编译。在macroquad中,这会使得图像加载速度提高几倍,并使您的应用程序性能更优,同时将编译时间保持在奇迹般的低水平。
[profile.dev.package.'*']
opt-level = 3

async/await

虽然macroquad尽量减少使用Rust特定的概念,但所有示例中的.await看起来可能有点可怕。Rust的async/await用于解决一个问题——跨平台主循环组织。

详情

问题:在WASM和Android上,组织主循环并不是特别容易

fn main() {
    // do some initialization

    // start main loop
    loop {
        // handle input

        // update logic

        // draw frame
    }
}

在Android上可以通过线程解决这个问题,但在网络上没有方法“暂停”和“恢复”WASM执行,因此WASM代码永远不会被阻塞。而那个循环会阻塞整个游戏执行!解决该问题的C++方案:https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html

但在Rust中我们有async/await。Rust的futures基本上是延续——future的堆栈可以存储到变量中,以在稍后某个时刻暂停/恢复future代码的执行。

macroquad中的async/await支持无需任何外部依赖——没有运行时,没有执行器,futures-rs也没有涉及。它只是保持WASM上的main堆栈的方法,同时保持代码跨平台,无需任何WASM特定的主循环。

社区

  • Quads Discord服务器 - 与库的开发人员和社区成员聊天的地方。
  • Awesome Quads - 一个精心挑选的链接列表,包括miniquad/macroquad相关的代码和资源。

白金赞助商

Macroquad由以下公司支持

SourceGear

依赖项

~18MB
~227K SLoC