iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Software Development

Rust的多方面運用系列 第 28

[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 27] Bevy 遊戲引擎 (Part 1)
下一篇
[Day29] Bevy 遊戲引擎 (Part 3) 收工
系列文
Rust的多方面運用30

尚未有邦友留言

立即登入留言