Rust Bevy を使ってみたメモ オブジェクトの移動

Rust Bevy を使ってみたメモ オブジェクトの移動

前回(Rust Bevy を使ってみたメモ 2Dオブジェクトの生成)はスプライトを生成できたので、今回は動かしてみようと思ったのですが、おそらく前回のやり方だと動かすことはできないっぽいですね…

どうやら、前回生成したのはただのスプライトであってオブジェクトではないっぽい??ので位置を取得することができなさそうでした。
なので、コンポーネントを作成して…バンドルを作成して…という順序でオブジェクトを作成する…っぽいです。

先駆者様のコードを公式ドキュメントを見ながらなんとか理解することができました…疲れた…
bevyのバージョン:0.12.1

参考:List of all items in this crate (docs.rs)
   RustのゲームエンジンBevyでスプライトアニメーションをしてみた #Rust – Qiita

use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "Test".into(),
                resolution: (600.0, 600.0).into(),
                resizable: false,
                ..default()
            }),
            ..default()
        }))
        .add_systems(Startup, setup)
        //フレームごとに実行
        .add_systems(Update, update)
        .run()
}


//コンポーネントとデフォルトをderive(デフォルトがあると..default()宣言ができるっぽいです(ないとできなかった))
#[derive(Component, Default)]

//構造体TestObjectを作成(作成するオブジェトの目印的な感じ)
struct TestObject;


#[derive(Bundle, Default)]
//TestObjectとSpriteBundleをまとめたバンドルを作成
struct TestObjectBundle {
    object: TestObject,
    sprite: SpriteBundle,
}


//カメラとテストオブジェクトをスポーン
fn setup(
    mut commands: Commands
)
{
    commands.spawn(Camera2dBundle::default());
    commands.spawn(TestObjectBundle {
        sprite: SpriteBundle {
            sprite: Sprite {
                color: Color::rgba_u8(255, 255, 255, 255),
                ..default()
            },
            transform: Transform {
                translation: (240.0, 240.0, 0.0).into(),
                scale: (100.0, 100.0, 0.0).into(),
                ..default()
            },
            ..default()
        },
        ..default()
    });
}


//フレームごとに実行したい動作
fn update(
    //Queryを使ってオブジェクトの位置を取得する
    mut object_query: Query<&mut Transform, With<TestObject>>
)
{
    //TestObjectは一つしかないからできるっぽい
    let mut transform = object_query.single_mut();

    let x = transform.translation.x;
    let y = transform.translation.y;

    //速度
    let v: f32 = 5.0;

    if x > -240.0 && y == 240.0 {
        transform.translation.x -= v;
    } else if x == -240.0 && y > -240.0 {
        transform.translation.y -= v;
    } else if x < 240.0 && y == -240.0 {
        transform.translation.x += v;
    } else if x == 240.0 && y < 240.0 {
        transform.translation.y += v;
    } else {
        transform.translation.x = 240.0;
        transform.translation.y = 240.0;
    }
}

結果は動画を張るのが面倒なので張りませんが、白い正方形が四隅を移動する動作になっています。

おそらく、この要領でたくさんオブジェクトを生成して制御していくって感じなのかなぁ?と思っています。

次回はキーボードで動きを操作できるようにでもしようかなぁ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です