Bevyで2048
をやってみる
しかしこの記事はBevy 0.6 時代のものなので、1.3に修正しながら追っていく
しかも途中で更新が終わってた...
も使えそう
Step.1
WindowDescriptor は Window になった
WindowDescriptor が行っていた設定は WindowPlugin 構造体の primary_window: Option<Window>が受け持つ
bevy::input::system::exit_on_esc_system は bevy::window::close_on_esc になった
add_system (a) は add_systems( Uptade, a )に吸収された
Step. 2
spawn_bundle(a) は spawn(a) になった
OrthographicCameraBundle::new_2d() は Camera2dBundle::default()
add_startup_system(a) -> add_systems( Starup, a )
const にしたかったけど、だめだった
いくつかをconstにまとめた
Step. 3
derive Event
Input -> ButtonInput
EventWriter::sendは EventId<E> を返すようになったので、返り値がいらないなら; をつけるように
KeyCodeで Left -> ArrowLeft etc.
cartesian_product のかわりに iproduct!
EventReader::iter -> EventReader::read
Step. 4
App::add_state -> init_state
初期値を与えるかわりに
Default States トレイトを設定
#[default]により初期値を設定
add_system_set も add_systemsに
code:rs
.add_systems(
Update,
(move_tiles_system, send_move_event_from_keyboard).run_if(in_state(GameState::Move)),
)
Stateの移行はNextStateを用いるようになった
Step. 5
関数を使い回すためにtransmute_lensを使ってみる
create_tileを修正して使い回す
module を分割した
Step. 6
今のところバグってないのでそれは後回し
ここからは自力で構成する
Step. 7
パネルに数字を表示したい
Text::from_sectionでTextをつくる
create_tileに.insert(Text2DBundle {})を追加する
code:rs
commands
.spawn_empty()
.insert(Text2dBundle {
text,
transform: position.to_transform(20.0),
text_2d_bounds: Text2dBounds {
size: Vec2 {
x: TILE_FONT_SIZE,
y: TILE_FONT_SIZE,
},
},
..default()
});
フォントを指定したい
/assets/fonts/にフォントファイルを追加
Res<AssetServer>をつかってロードする
code:rs
let font = asset_server.load("fonts/Kenney Space.ttf");
let text = Text::from_section(
tile.to_string(),
TextStyle {
font: font.clone(),
font_size: TILE_FONT_SIZE,
color: Color::GRAY,
},
);
Tileのmergeを実装したい
States と system をきれいに分割したい
State 移行の system を切り分けたい
↑ではできないと言っているが
code:rs
impl GameState {
pub fn set_next(self) -> impl FnMut(ResMut<NextState<GameState>>) {
return move |mut next: ResMut<NextState<GameState>>| {
dbg!(self);
next.set(self);
};
}
}
Step. 8
Tileの色
code:rs
impl From<Tile> for Color {
fn from(Tile(num): Tile) -> Self {
// num = 2 -> r = 0.0, num >= 2048 -> r = 1.0
let r: f32 = (u64::BITS - num.leading_zeros() - 2).min(10) as f32 / 10.0;
return TILE_COLOR_0 * (1.0 - r) + TILE_COLOR_1 * r;
}
}
数字の大きさの調整
Componentsを整理して、TextだけScale
State と Plugin を整備する
System の条件分岐にはrun_ifをつかう
Conditionとしてboolを返すSystemを使える
Tile(num)をもたせるのは無駄なので、指数だけ持たせる
Step. 9
スコアの表示
スコアを Resource として保持する
Text::with_justify などで設定するJustifyTextは1行のテキストには効果がない
UIとしてNodeのflexboxを使えば綺麗に並ぶけど
今度はSpriteとかとの相性が悪い
bevy::spriteとbevy::uiは連携させるものじゃなさそう
メインメニューの作成
enum MenuAction すべてを iterate したい
ゲームオーバー時に最初に戻る
フリック入力対応