0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【テトリス作成④】ブロックが下で止まるようにする実装について深掘る

Last updated at Posted at 2022-11-14

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
20022.11.29追記
★★★★★★★★★★★★★★★

(見本)Board.cs

    //ブロックが枠内にあるのか判定する関数を呼ぶ関数
        public bool CheckPosition(Block block)
        {
            foreach (Transform item in block.transform)
            {
                Vector2 pos = new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));

                if(!BoardOutCheck((int)pos.x, (int)pos.y))
                {
                    return false;
                }

                if (BlockCheck((int)pos.x, (int)pos.y,block))
                {
                    return false;
                }
            }
            return true;
        }

    //枠内にあるか判定する関数
    bool BoardOutCheck(int x, int y)
    {
    //x軸は0以上with未満 z軸は0以上    
        return (x >= 0 && x < width && y >= 0);
    }

解説

【(関数)ブロックが枠内にあるのか判定する関数を呼ぶ】

        ①public bool CheckPosition(Block block)
        {
            ②foreach (Transform item in block.transform)
            {
                ③Vector2 pos = new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));

                ④if(!BoardOutCheck((int)pos.x, (int)pos.y))
                {
                   ⑤return false;
                }
            }
            ⑥return true;
        }

①外から呼び出し可能、
   ブロックが枠内にあるのか判定する関数を呼ぶ=CheckPositionとする
   引数にブロックを渡す、名前はblockとする
②Blockオブジェクトにはblockが7個(子を含む)がり、その数(transform)分だけ繰り返しループする
③変数宣言、Mathf.Round→丸める
   itemのxy軸を丸めてpos変数に格納する
blockが脇からはみ出ていないかの判定
もしBoardOutCheck(枠内にあるか判定する)があればtrue
   !もしBoardOutCheckがなければtrue = 枠からはみ出ていたら

 通常ブロックが枠内にあるのか判断→!がついている為、ブロックが枠内にないのか判断
⑤~~! false~~
   ないなら、中処理へfalse(偽)を返す
⑥全部収まっていたらtrue

bool型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
Mathf.Roundとは
https://learn.microsoft.com/ja-jp/dotnet/api/system.math.round?view=net-7.0
foreach
https://qiita.com/hanatan079/items/9c29d7ab61729177cbe3

【(関数)枠内にあるか判定する】

    ①bool BoardOutCheck(int x, int y)
    {
        ②return (x >= 0 && x < width && y >= 0);
    }

①bool型、 BoardOutCheck(枠内にあるか判定する)、
②x軸は0以上with未満であり、 y軸は0以上であること。全て条件が成立していればtrue

bool,int型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
演算子について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

GameManeger.cs

//ボードのスクリプトを格納
    ①Board board;    

 //ボードを変数に格納(スタート)
   ②board = GameObject.FindObjectOfType<Board>();

 //Boardクラスの関数を呼び出してボードからはみ出ていないか確認(アップデート)
   ③if (!board.CheckPosition(activeBlock))
   {
   ⑥activeBlock.MoveUp();
   ⑦activeBlock = spawner.SpawnBlock();
   }

①Board型 名前board
②全てのオブジェクトからBoardコンポーネントを探してboard変数へ格納する
FindObjectOfTypeは全てのコンポーネントの中から<>を探すため重い処理。乱用注意。
③もしactiveBlockがはみ出ていなかったら。
   !否定false(偽)の時に中に入る。
   すなわち、もしactiveBlockがはみ出ていたら。
⑥MoveUp=一つ上に戻る。→下にはみでたら上に戻す=枠からはみ出なくなる。
⑦新しいブロックを生成してactiveBlockに格納する
①〜⑦activeBlockがはみ出たら、1つ上に戻してね。
そしたら下にブロックが着いたから次の新しいブロックをactiveBlock内に生成してね。

if文、!否定について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?