4个版本

0.2.1 2024年2月21日
0.2.0 2023年7月14日
0.1.1 2021年7月30日
0.1.0 2021年4月16日

#639游戏开发

Download history 32/week @ 2024-04-08 53/week @ 2024-04-15 49/week @ 2024-04-22 39/week @ 2024-04-29 42/week @ 2024-05-06 38/week @ 2024-05-13 65/week @ 2024-05-20 39/week @ 2024-05-27 52/week @ 2024-06-03 36/week @ 2024-06-10 50/week @ 2024-06-17 42/week @ 2024-06-24 55/week @ 2024-07-01 13/week @ 2024-07-08 33/week @ 2024-07-15 38/week @ 2024-07-22

143 每月下载量
用于 mquad

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

将macroquad添加到Cargo.toml作为依赖项


[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上可以通过线程解决这个问题,但在Web上没有方法可以“暂停”和“恢复”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

依赖项

~10MB
~229K SLoC