设置窗口图标

点击这里下载完整示例代码


你可能想设置一个自定义的窗口图标。在 Windows 和 Linux 上,这是显示在窗口标题栏(如果有的话)和任务栏(如果有的话)的图标图像。

不幸的是,Bevy 还没有提供一个简单的、符合人体工程学的内置方法来实现这个功能。然而,它可以通过 winit API 来完成。

这里显示的方法是一个不优雅的变通技巧。为了节省代码的复杂性,我们不使用 Bevy 的资源系统在后台加载图片,而是绕过资源系统,直接使用 image 库加载文件。

在 Bevy 中加入一个适当的 API 来完成设置窗口图标的工作仍处于 WIP:见 PR#2268Issue #1031

这个例子展示了如何从 Bevy 的启动系统中设置主窗口的图标:

use bevy::window::WindowId;
use bevy::winit::WinitWindows;
use winit::window::Icon;

fn set_window_icon(
    windows: Res<WinitWindows>,
) {
    let primary = windows.get_window(WindowId::primary()).unwrap();

    // here we use the `image` crate to load our icon data from a png file
    // this is not a very bevy-native solution, but it will do
    let (icon_rgba, icon_width, icon_height) = {
        let image = image::open("my_icon.png")
            .expect("Failed to open icon path")
            .into_rgba8();
        let (width, height) = image.dimensions();
        let rgba = image.into_raw();
        (rgba, width, height)
    };

    let icon = Icon::from_rgba(icon_rgba, icon_width, icon_height).unwrap();

    primary.set_window_icon(Some(icon));
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(set_window_icon)
        .run();
}

注意:你需要把 winit 添加到你的项目的依赖项中,而且它必须和 Bevy 使用的版本相同。你可以用 cargo tree 来显示依赖关系树,看看哪个版本是正确的。从 Bevy 0.6 开始,应该是 winit = "0.26"