このブログはPower Apps でローコーディングな勉強会 #14の資料その8になります。
このブログではボムを爆発させて爆炎でブロックを破壊させる方法についてご紹介致します。
ボムを置いた箇所のマップの各方向の状態の取得方法
(なんだか日本語変な感じもしますが...)
ボムを置いた箇所から見て、上下左右の方向のステージの状態を取得する方法について説明します。
まず結論からいうと上下左右それぞれ下記の式で取得可能です。
// 上方向 Filter(stage, X = _bombX, Y < _bombY / 48 * 34, Y >= _bombY / 48 * 34 - 1 * 34); // 下方向 Filter(stage, X = _bombX, Y > _bombY / 48 * 34, Y <= _bombY / 48 * 34 + 1 * 34); // 右方向 Filter(stage, Y = _bombY / 48 * 34, X > _bombX, X <= _bombX + 1 * 48); // 左方向 Filter(stage, Y = _bombY / 48 * 34, X < _bombX, X >= _bombX - 1 * 48);
なにをしているか、上方向を例にとって説明します。
まず上方向なので、X軸は固定なので、"X = bombX"となっています。
Y座標については自身の座標より小さく、また、炎の範囲以上でフィルターすればいいので上記式となっています。
"/ 48 * 34"としているのはbombYとstageのY座標の調整のためですね。
他の方向についても理論は同じです。
上記式を利用して、stageの内容を更新していこうと思います。
爆炎によってブロックを破壊する
上記式でフィルターした結果、type = 1の場合(ブロックの場合)、type = 2に更新(床に更新)すればいいですね。
一応おさらいとして、stageのtypeは下記に対応しています。
type | イメージ |
---|---|
0 | ステージ内にある破壊不能ブロック |
1 | ブロック |
2 | 床 |
3 | ステージ外にある破壊不能ブロック |
上記を踏まえてブロックを破壊する処理を記載すると、下記のようになります。
FireTimer.OnTimerEnd
// ブロックを壊す判定 // 上方向 UpdateIf(Filter(stage, X = _bombX, Y < _bombY / 48 * 34, Y >= _bombY / 48 * 34 - 1 * 34), type = 1, {type:2});
※上方向の処理しか記載していません!
残りの処理については、自分で記載してみましょう!
トラブルシューティング
ブロックを破壊する処理を記載したのに、ブロックが破壊されない!!
という場合、ギャラリーの更新が行われていないかもしれません。。。
試しに破壊したはずのブロックへプレイヤーを移動させてみて下さい。
処理が正しければ恐らく通り抜けられるかと思います。
(もしくは試しにLookUp() などで対象のtype をみてみるといいかもしれません。)
このような現象になった場合、ギャラリーのItemsを再度ギャラリーに取得させてあげれば解決することができます。
例えばStageGalleryのItemsを以下のように設定してみて下さい。
StageGallery.Items
If(_fireStart, stage, stage)
これで恐らく解決できるかと思います。
もっといい方法があるよ!という場合は教えて頂けますと幸いです。