回転するブロックを置く処理を実装してみました~

最近、パズルゲーム作りにはまっているcacaponです~

今回は、作っているときに結構大変だった、
「回転するブロックをステージに置く」作り方について
まとめていきたいと思います~

ブロックの形は ■■■■ みたいのが降ってくる某有名落ちものパズルゲームを
想定してください~

さて、早速実装の仕方ですが、
正直言ってもっと良いやり方はありそうな気はします~

もしかしたらスマホだと見にくいかもしれませんがすみません~

①ステージ用の行列を用意する。
まずは、ブロックが動き回れるようなステージを用意しました~
表現の仕方としては、
[
  ['無','無','無','無','無','無','無','無'],
  ['無','無','無','無','無','無','無','無'],
  ['無','無','無','無','無','無','無','無'],


  ['無','無','無','無','無','無','無','無']

]

みたいな感じな行列を作りました~
ブロックが固定されると、
['青','青','青','青','無','無','無','無',]←■■■■ を固定したとき

という感じにします~

②ブロック用の行列を用意する
ステージとは別にブロック用の行列も用意しました。
どのブロックを回しても、高さと幅が4までなので、
4 x 4 の行列ですね~

[

 [
  ['青','青','青','青'],
  ['無','無','無','無'],
  ['無','無','無','無'],
  ['無','無','無','無'],

 ],

 [
  ['青','無','無','無'],
  ['青','無','無','無'],
  ['青','無','無','無'],
  ['青','無','無','無'],

 ] 

 こんな感じに、それぞれの向きの行列を一つずつ用意しました~

③ボタンを押したら回る動きを作る
ボタンを押したら回るようにします~
ここは、ボタンを押した数を4で割った余りで制御しました~
そうすると、012301230123...となるので、
0だったらこの向き~みたいな感じでセッティングすることができます~

④ステージと動かせるブロックを表示する。
ステージ自体は行列の値と表示するブロックを結び付けて表示してました~
例えば、青だったら青のブロック画像を表示させる…みたいな感じですね♪

動かせるブロックに関しては、ブロックの座標を管理して、
ステージの画像の上に上書きするように
その座標にブロックの画像を表示させていました~

⑤固定させるときの処理を作る
いよいよブロックの固定ですね~
実は今回作ったパズルゲームは「落ちる」のではなく、
マウスでブロックを自由に動かして決定ボタンを押したときに、
おけるのなら置く、という形をとっていました~

そのため、実際の落ちものパズルみたいに自由落下はないのですが、
動く範囲を制限したりはみ出たりしないようにしなければいけません。

こちらに関しては完全には達成できませんでしたが、
以下のような処理をして対応しました。

  1. 左右は②で作ったブロックの左上を基準にして、
    その基準がステージを超えないように制限しました
  2. ステージの行列に3幅分見えないバッファ行列を作りました
    例:['無','無','無','無','無','無','無','無','bf','bf','bf'] (bf =バッファ)
  3. ステージの下にも3段分バッファを作りました
    例:['bf','bf','bf','bf','bf','bf','bf','bf','bf','bf','bf']
  4. 決定ボタンを押した時、ブロックの座標から左に4つ、下に四つ、
    計16分の行列をチェックします。
    ブロックの個所が、ステージ側に既に置かれていないかチェックしたいので
    ブロック側の行列とステージ側の行列を見て、
    置く予定の場所が無以外があったら警告音を出して固定させないようにします。
    イメージとしてはこんな感じ…伝わるかなぁ

    f:id:cacapon:20190927155540p:plain

2,3に関しては、4を行うための保険ですね~
これやっとかないと右端や下で置いたときに行列の外に出ちゃうのです~
上のイメージ図下側、13~16でエラーを起こさない為に必要になりました~

さて、こんな感じで実装を進めていきましたら、
なんとか置けるところまで行きました~

固定の処理とかブロック用の行列の用意とか…
もっとスマートなやり方がありそうなのですが、
こんなやり方がありますよ~と知っている方がいたら、
ぜひ教えてくれると嬉しいです♪