• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Rust: 如何用bevy画2d图形及使用按键控制移动

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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();
}

运行效果:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab中取模(mod)与取余(rem)的区别发布时间:2022-07-18
下一篇:
matlab中取模(mod)与取余(rem)的区别 - 鸳都学童发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap