Bevy Version: | 0.10 | (current) |
---|
Windows Desktop
If you have any additional Windows-specific knowledge, please help improve this page!
Create Issues or PRs on GitHub.
Windows is one of the best-supported platforms by Bevy.
Both the MSVC and the GNU compiler toolchains should work.
You can also build Windows EXEs while working in Linux.
Distributing Your App
The EXE built with cargo build
can work standalone without any extra files or DLLs.
Your assets
folder needs be distributed alongside it. Bevy will search for it in
the same directory as the EXE on the user's computer.
The easiest way to give your game to other people to play is to put them
together in a ZIP file. If you use some other method of installation,
install the assets
folder and the EXE to the same path.
If built with the MSVC toolchain, your users may need the Microsoft C/C++ Runtime Redistributables installed.
Disabling the Windows Console
By default, when you run a Bevy app (or any Rust program for that matter)
on Windows, a Console window also shows up. To disable this,
place this Rust attribute at the top of your main.rs
:
#![windows_subsystem = "windows"]
This tells Windows that your executable is a graphical application, not a command-line program. Windows will know not display a console.
However, the console can be useful for development, to see log messages. You can disable it only for release builds, and leave it enabled in debug builds, like this:
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
Working in WSL2
If you prefer to have a more Linux-centric development workflow, you might want to work inside of WSL2 and build your project there. Another reason to do it is compile times; they are often much faster in WSL2 than on the Windows host system.
Fortunately, this can actually work quite well! The trick is that you want to cross-compile for Windows. The Windows EXE you build inside of WSL2 can be run just fine from the Linux commandline, and it will seamlessly run on the host system! This way, you don't need any GPU drivers or GUI support inside your WSL2 Linux environment.
Note that when you run Windows binaries from WSL2, they don't get the Linux
environment variables. cargo run
does not just work, because your Bevy game
will look for its assets
folder in the path where the EXE is (which would be
in the target
build output folder). My simple solution is to just copy the
EXE into the project folder after building, and run it directly from there.
This can be automated with a little script, to use instead of cargo run
:
#!/bin/sh
cargo build --target x86_64-pc-windows-msvc &&
cp target/x86_64-pc-windows-msvc/debug/mygame.exe . &&
exec ./mygame.exe "$@"
This way you also don't have to type the cross-compilation target every time (and you can also add any other options you want there).
Creating an icon for your app
There are two places where you might want to put your application icon:
- The EXE file (how it looks in the file explorer)
- The window at runtime (how it looks in the taskbar and the window title bar)
Setting the EXE icon
(adapted from here)
The EXE icon can be set using a cargo build script.
Add a build dependency of embed_resources
to your Cargo.toml
allow embedding assets into your compiled executables
[build-dependencies]
embed-resource = "1.6.3"
Create a build.rs
file in your project folder:
extern crate embed_resource;
fn main() {
let target = std::env::var("TARGET").unwrap();
if target.contains("windows") {
embed_resource::compile("icon.rc");
}
}
Create a icon.rc
file in your project folder:
app_icon ICON "icon.ico"
Create your icon as icon.ico
in your project folder.