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
コメント