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-15

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

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

(見本)Board.cs

  //2次元配列の作成
        private Transform[,] grid;

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

                if(!BoardOutCheck((int)pos.x, (int)pos.y))
                {
                    return false;
                }
                                 //追記
                if (BlockCheck((int)pos.x, (int)pos.y,block))
                {
                    return false;
                }
            }
            return true;
        }

    //移動先にブロックがないか判断する関数
    bool BlockCheck(int x, int y,Block block)
    {
        return(grid[x,y] != null && grid[x,y].parent != block.transform);
    }

    //ブロックが落ちたポジションを記録する関数
    public void SaveBlockInGrid(Block block)
    {
        foreach (Transform item in block.transform)
        {
            Vector2 pos = Rounding.Round(item.position);
            grid[(int)pos.x, (int)pos.y] = item;
        }
    }

解説

【2次元配列の作成】

        private Transform[,] grid;

宣言したモジュールの中でのみ、gridという名のTransform(2次元配列(x,y))を使用できるようにする

【移動先にブロックがある判断する関数】

 //移動先にブロックがある判断する関数
         ①bool BlockCheck(int x, int y,Block block)
    {   
        ②return(③grid[x,y] != null && ④grid[x,y].parent != block.transform);

    }

①メソッド名BlockCheck、xyとblockを引数で渡す
② 値を返しながら判定③④がどちらもtrueの時にtrue
③glid(2次元配列)が空でない時は他のブロックがある
④親が同じでない時は他のブロックがある

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

【foreach内に追記ー移移動先にブロックがあるか判断する関数の呼び出し】

        //追記
                ①if (BlockCheck((int)pos.x, (int)pos.y, block))
                {
                    ②return false;
                }

①移動先にブロックがあるのか確認(関数呼び出し)
②trueが返ってきた時(移動先にブロックがある時)に中に入る
  falseを返す=移動先にはブロックがある為移動できません。

【ブロックが落ちたポジションを記録する関数】

①public void SaveBlockInGrid(Block block)
{
    ②foreach (Transform item in block.transform)
    {
        ③Vector2 pos = Rounding.Round(item.position);
        ④grid[(int)pos.x, (int)pos.y] = item;
    }
}

①他クラスから呼び出し可能な関数 SaveBlockInGrid名前 Block block引数
②親オブジェクトの分だけ(子も含む(block.transform))繰り返しループする
③作成した関数(Rounding.cs)の呼び出して(近くの位置の数値を丸める)、Vector2 pos変数に格納する
④itemをgrid(2次元配列)のxyポジションへ格納する

voidについて
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
foreachについて
https://qiita.com/hanatan079/items/9c29d7ab61729177cbe3

【ブロックが落ちたポジションを記録する関数の呼び出し】

(Board.cs)

    //グリッドの生成
        private void ①Awake()
        {
            ②grid = new Transform[width,height];
        }

(GameManeger.cs)

    void Update()
    {
        if (Time.time > nextdropTimer)
        {
            nextdropTimer = Time.time + dropInterval;
            if (activeBlock)
            {
                activeBlock.MoveDown();
         
                    if (!board.CheckPosition(activeBlock))
                    {
                        activeBlock.MoveUp();
         //追記   
                        ③board.SaveBlockInGrid(activeBlock);

                        activeBlock = spawner.SpawnBlock();
                    }
            }
        }
    }

①スタートより先に呼ばれる
②グリッドを生成する
③ブロックが落ちたポジションを記録する関数を呼び出す
  引数にで格納されたブロックを渡す

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?