rust bevyでこっそりゲーム作りの事始め

bevy

rustにはbevyっていうゲーム用クレート(ゲームエンジン)があります。

クロスプラットフォームで開発ができて、wasmもできちゃうっていう優れもの

まぁよくわかってないけどECSっていうのを取り入れてるらしいので、そのあたり知りたい人は、公式ページ行ってね

公式>>Bevy Engine

さてと、まぁ事始めってことで、プレーヤーを登場させて、WASDで移動できちゃうぐらいのことをやってみましょうか

完成形はこんな感じ

初期設定

まずは、cargo つかってサクッとプロジェクト作っちゃいましょう

cargo new bevykotohazime
cargo add bevy

これでcargo.tomlにbevyが組み込まれるね。

ひとまずウインドウを表示させてみる

ひとまずウインドウを表示させてみましょ

use bevy::prelude::*;

fn main(){
    App::new()
    .add_plugins(DefaultPlugins)
    .run();
}

なんかこのDefaultPluginsってのを使うことで、ウィンドウの初期化やらいろいろやってくれるみたい。

カメラ・プレーヤーを出現させる

ウィンドウができたら次は、カメラをセットして、プレーヤーを出現させましょう。

まずはカメラの設定

fn setup_camera(mut commands:Commands){
    commands.spawn(Camera2dBundle::default());
}

次にプレーヤーの出現

fn setup_player(mut commands:Commands,asset_server:Res<AssetServer>){
    commands.spawn(SpriteBundle{
        sprite:Sprite{custom_size:Some(Vec2::new(32.0,32.0)),..default()},
        transform:Transform::from_scale(Vec3::splat(6.0)),
        texture:asset_server.load("player.png"),
        ..default()
    });
}

ここでは、32*32ピクセルのpng画像を使ってます。

画像は、assetsフォルダを作ってそこに入れておけばOKよ。

使いたい人はどうぞこの画像を(笑)

main関数のところも少しいじって

fn main(){
    App::new()
    .add_plugins(DefaultPlugins)
    .add_systems(Startup, (setup_camera,setup_player))
    .run();
}

こんな感じで、systemってのを追加して、そこにスタートアップで読み込みたいものを入れていく

実行するとこんな感じ。ど真ん中にドーンと出てくるね。

WASDで移動する。

じゃぁ、今回の最終目的?のプレーヤーをWASDで移動させるところをやっていきましょう。

まずは、プレーヤーをPlayerとするためにPlayerの構造体を作ります。

今回は特に何も実装するものないから(笑)

#[derive(Component)]
struct Player;

でもって、setup_playerのなかでspawnするときにこれをスポーンするわけね

fn setup_player(mut commands:Commands,asset_server:Res<AssetServer>){
    commands.spawn((SpriteBundle{
        sprite:Sprite{custom_size:Some(Vec2::new(32.0,32.0)),..default()},
        transform:Transform::from_scale(Vec3::splat(6.0)),
        texture:asset_server.load("player.png"),
        ..default()
    },Player));
}

これでPlayerとしてスポーンできたね。

そしてこれを移動させる関数を作る

fn player_movement(key_input :Res<Input<KeyCode>>,mut query:Query<(&Player,&mut Transform)>,time:Res<Time>){
    let (player,mut transform) = query.single_mut();
    let mut direction = Vec3::ZERO;
    if key_input.pressed(KeyCode::A){
        direction += Vec3::new(-1.,0.,0.);
    }
    if key_input.pressed(KeyCode::D){
        direction += Vec3::new(1.,0.,0.);    
    }
    if key_input.pressed(KeyCode::W){
        direction += Vec3::new(0.,1.,0.);      
    }
    if key_input.pressed(KeyCode::S){
        direction += Vec3::new(0.,-1.,0.);       
    }
    if direction.length()>0.0{
        direction=direction.normalize();
    }
    transform.translation += direction*500.0*time.delta_seconds();
}

main関数に

    .add_systems(Update,player_movement)

Updateとして、systemを追加しておきます。

今回の完成形をwasmでビルドしておきましょう

今回の目標はプレーヤー表示とWASD操作できるようにしました。

最後にwasmにビルドして、ウェブで実行してみましょうよ

cargo build --release --target wasm32-unknown-unknown
wasm-bindgen --target web --out-dir . --no-typescript target/wasm32-unknown-unknown/release/bevykotohazime.wasm

あとは適当なhtmlファイル準備して

<html>
  <head>
    <meta charset="utf-8"/>
  </head>
  <script type="module">
    import init from './bevykotohazime.js'
    init()
  </script>
</html>

あとは適当なサーバー立ち上げて実行してみましょうね

python3 -m http.server 8000

コメント

タイトルとURLをコピーしました