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
相关产品推荐
相关产品推荐

