You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bevy 0.10.1窗口自适应与Window结构体尺寸更新问题咨询

在Bevy 0.10.1中解决窗口自动适配与尺寸更新问题

一、窗口创建时自动适配屏幕

根据需求选择以下两种方案:

1. 启动时直接全屏或最大化窗口

初始化App时通过WindowPlugin配置窗口模式,直接全屏启动或最大化窗口(非全屏占满屏幕):

use bevy::prelude::*;
use bevy::window::{WindowMode, WindowPlugin};

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            window: WindowDescriptor {
                // 直接全屏启动
                mode: WindowMode::Fullscreen,
                // 或者最大化窗口(保留窗口边框)
                // mode: WindowMode::Maximized,
                ..default()
            },
            ..default()
        }))
        .run();
}

2. 根据屏幕分辨率自定义窗口大小

如果需要窗口模式下按比例适配屏幕,可先获取主显示器分辨率,再动态设置窗口尺寸:

use bevy::prelude::*;
use bevy::window::{WindowDescriptor, WindowPlugin};

fn main() {
    // 获取主显示器分辨率
    let primary_monitor = bevy::window::Monitor::primary().unwrap();
    let monitor_size = primary_monitor.size();

    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            window: WindowDescriptor {
                width: monitor_size.width as f32 * 0.8, // 取屏幕宽度的80%
                height: monitor_size.height as f32 * 0.8,
                ..default()
            },
            ..default()
        }))
        .run();
}

二、全屏切换后更新窗口宽高参数

窗口切换全屏或调整尺寸时,Bevy会触发WindowResized事件,监听该事件即可同步更新依赖窗口尺寸的游戏对象:

1. 监听尺寸变化事件更新游戏对象

use bevy::prelude::*;

// 标记需要随窗口尺寸更新的游戏对象
#[derive(Component)]
struct ResponsiveGameObject;

// 监听窗口尺寸变化并更新对象
fn update_on_window_resize(
    mut resize_events: EventReader<WindowResized>,
    mut query: Query<&mut Transform, With<ResponsiveGameObject>>,
    window: Query<&Window, With<PrimaryWindow>>,
) {
    // 仅处理最新的尺寸变化事件
    if resize_events.iter().last().is_some() {
        let window = window.single();
        for mut transform in query.iter_mut() {
            // 示例:将对象缩放至窗口宽高的1/4
            transform.scale.x = window.width() / 4.0;
            transform.scale.y = window.height() / 4.0;
        }
    }
}

// 初始化示例对象
fn spawn_responsive_object(mut commands: Commands) {
    commands.spawn((
        SpriteBundle {
            sprite: Sprite { color: Color::BLUE, ..default() },
            transform: Transform::from_xyz(0.0, 0.0, 0.0),
            ..default()
        },
        ResponsiveGameObject,
    ));
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(spawn_responsive_object)
        .add_system(update_on_window_resize)
        .run();
}

2. 手动强制更新窗口尺寸(按需使用)

如果需要主动修改窗口参数,可通过ResMut<PrimaryWindow>操作,但通常无需手动触发——Bevy会自动同步窗口状态:

fn force_set_window_size(mut primary_window: ResMut<PrimaryWindow>) {
    // 手动设置窗口分辨率
    primary_window.set_resolution(1920.0, 1080.0);
}

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:52:56