[Day 28] Bevy 游戏引擎 (Part 2)

那今天继续来讲昨天的 Bevy 专案
而进度是创建可以控制的角色

先讲昨天没讲到的部份

pub struct ArrowsPlugin;
impl Plugin for ArrowsPlugin {
    fn build(&self, app: &mut AppBuilder) {
        app.init_resource::<ArrowMaterial>()
            .insert_resource(SpawnTimer(Timer::from_seconds(1.5, true)))
            .add_system(spawn_arrow_up.system())
            .add_system(spawn_arrow_down.system())
            .add_system(spawn_arrow_left.system())
            .add_system(spawn_arrow_right.system())
            .add_system(up_arrows.system())
            .add_system(down_arrows.system())
            .add_system(left_arrows.system())
            .add_system(right_arrows.system())
    }
}

这是昨天增加上下左右後的 Plugin
也就是说他可以去将 system 整合起来
那可以看到上面的部份 insert_resource 这个基本上就是初始化某个物件的值

好 OK 接下来就继续前面的内容
首先一如往常的还是要先定义出 角色的结构体

pub struct Main;
pub struct MainMaterial {
    main: Handle<ColorMaterial>,
}

然後引入模型

impl FromWorld for MainMaterial {
    fn from_world(world: &mut World) -> Self {
        let world = world.cell();
        let mut material = world.get_resource_mut::<Assets<ColorMaterial>>().unwrap();
        let asset_server = world.get_resource::<AssetServer>().unwrap();
        let character = asset_server.load("./main.png");
        MainMaterial {
            main: material.add(character.into()),
        }
    }
}

这边应该都是昨天就学会的操作了
那麽这边我们先生成我们主要的角色

fn spawn_main(mut command: Commands, material: ResMut<MainMaterial>) {
    command
        .spawn_bundle(SpriteBundle {
            material: material.main.clone(),
            sprite: Sprite::new(Vec2::new(100., 100.)),
            ..Default::default()
        })
        .insert(Main);
}

至於位置是正中央所以就不设定
那麽接下来这边是今天的关键

fn movement(key_input: Res<Input<KeyCode>>, mut positions: Query<&mut Transform, With<Main>>) {
    for mut transform in positions.iter_mut() {
        if key_input.just_pressed(KeyCode::W) {
            transform.rotation = Quat::from_rotation_z(0.5 * PI);
        }
        else if key_input.just_pressed(KeyCode::A) {
            transform.rotation = Quat::from_rotation_z(1. * PI);
        }
        else if key_input.just_pressed(KeyCode::S) {
            transform.rotation = Quat::from_rotation_z(1.5 * PI);
        }
        else if key_input.just_pressed(KeyCode::D) {
            transform.rotation = Quat::from_rotation_z(0. * PI);
        }
    }
}

重点是引入的部份 这边的引入就是
Query<&mut Transform, With>
那 With 会绑定该物件
而 Transform 是他的各种数值 像是座标之类的
那这边我使用 PI 来转向
那麽 key_input 就是让他即时去抓他的 Input

pub struct CharacterPlugin;
impl Plugin for CharacterPlugin {
    fn build(&self, app: &mut AppBuilder) {
        app.init_resource::<MainMaterial>()
            .add_startup_stage("game_setup", SystemStage::single(spawn_main.system()))
            .add_system(movement.system());
    }
}

那麽要注意的地方是 要使用 startup 来弄出 main 这个物件 因为他要作为预设去生成

那麽 明天来讲消失的部份 可能记分板也会讲吧


<<:  Day 17 Dockerfile 和 Docker-Compose 的差异

>>:  [Day-23] 小练习二进制转十进制

[2020铁人赛] Day30 - .net core第一阶段结束,感谢IT邦!

完赛了,下次再出现决定要写进阶/实务上的内容,再分享给各位 :) 刚刚看完後觉得文章内容还可以再补...

Day 02 HTML/CSS 点击超连结会经历的伪类选取器(Pseudo-classes)

根据 MDN,目前 CSS 的伪类选取器有以下这些: 今天要介绍到的是关於点击超连结後会经历的五种伪...

Visual Studio连线MySQL问题_解决办法

问题描述: 使用Visual Studio连线MySQL出现报错 错误讯息如下 「System.IO...

[Day 23] Mattermost - ChatOps

ChatOps with Mattermost chatops好处 成本低 互动性佳 即时反应提高效...

Git push

今天上班看一下github的纪录,发现最近只有commit没push,所以都没上到github上,现...