Rust: 如何用bevy畫2d圖形及使用按鍵控制移動
阿新 • • 發佈:2021-12-14
bevy自帶的畫圖功能有點弱,得先引入bevy_prototype_lyon, Cargo.toml依賴部分如下:
[dependencies] bevy = { version = "0.5.0", features = ["dynamic"] } bevy_prototype_lyon = "0.3.1"
main.rs完整程式碼如下,已經加了詳細註釋,應該不難看懂
use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; use bevy::prelude::*; use bevy_prototype_lyon::prelude::*; #[derive(Default)] struct ExampleShape; // 速度 #[derive(Default)] struct Speed(i8); // x軸移動方向(1右,-1左,0靜止) #[derive(Default)] struct XDirection(i8); // y軸移動方向(1右,-1左,0靜止) #[derive(Default)] struct YDirection(i8); //按鍵移動 fn move_shape( input: Res<Input<KeyCode>>, mut query: Query<&mut Transform, With<ExampleShape>>, speed: Res<Speed>, mut x_direct: ResMut<XDirection>, mut y_direct: ResMut<YDirection>, ) { for mut transform in query.iter_mut() { if input.just_pressed(KeyCode::Left) { x_direct.0 = -1; } if input.just_pressed(KeyCode::Right) { x_direct.0 = 1; } if input.just_pressed(KeyCode::Down) { y_direct.0 = -1; } if input.just_pressed(KeyCode::Up) { y_direct.0 = 1; } if input.just_pressed(KeyCode::Space) { x_direct.0 = 0; y_direct.0 = 0; } transform.translation.x += speed.0 as f32 * x_direct.0 as f32; transform.translation.y += speed.0 as f32 * y_direct.0 as f32; } } /** * 初始化 */ fn setup(mut commands: Commands) { //畫圓 let shape = shapes::Circle { radius: 20., ..shapes::Circle::default() }; //宣告1個2d"物件" commands.spawn_bundle(OrthographicCameraBundle::new_2d()); commands .spawn_bundle(GeometryBuilder::build_as( &shape, ShapeColors::outlined(Color::TEAL, Color::BLACK), DrawMode::Outlined { //畫外框 fill_options: FillOptions::default(), outline_options: StrokeOptions::default().with_line_width(1.0), }, Transform::default(), )) .insert(ExampleShape); } fn main() { App::build() //防鋸齒 .insert_resource(Msaa { samples: 8 }) //設定視窗屬性 .insert_resource(WindowDescriptor { title: "make things move".to_string(), width: 400., height: 300., resizable: false, ..Default::default() }) //初始化x軸方向 .insert_resource(XDirection(0)) //初始化y軸方向 .insert_resource(YDirection(0)) //初始化速度 .insert_resource(Speed(1)) //初始化 .add_startup_system(setup.system()) //新增按鍵控制系統 .add_system(move_shape.system()) //列印幀數等資訊 .add_plugin(LogDiagnosticsPlugin::default()) .add_plugin(FrameTimeDiagnosticsPlugin::default()) //載入預設外掛 .add_plugins(DefaultPlugins) //載入畫圖外掛 .add_plugin(ShapePlugin) .run(); }
執行效果:
作者:菩提樹下的楊過出處:http://yjmyzz.cnblogs.com
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。