那今天繼續來講昨天的 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 這個物件 因為他要作為預設去生成
那麼 明天來講消失的部份 可能記分板也會講吧