ぬるーむ

Unity初心者が誰もが知っているゲームの模倣をしています。個人的な備忘録ですが、入門書を読み終えたばかりの初心者の方は「こんなへなちょこでもいいのか!」「俺の方がうまく作れる」と作成意欲がわいたりするかもしれません。

Unityでテトリスを作ってみた 2


スポンサードリンク

テトリミノの固定に猶予を持たせる

接触後、すぐに固定すると操作がしづらい。固定するまでに猶予時間を与えることにする。

  1. 落下判定。
  2. 落下判定が偽なら、遅延フラグを真にする。真なら、遅延フラグを偽にする。遅延カウントはそのまま。

    • 遅延フラグが真の間は遅延カウントを1ずつ減らす。また、落下キーを押されたら、遅延を終了にする。

      • 遅延カウントが正なら、再び落下判定に戻る。負なら遅延を終了する。
    • 遅延フラグが偽なら、再び落下判定に戻る。

f:id:Nullsuke:20201031002306p:plain
固定に猶予を持たせる

//最大猶予
private static readonly int delayLimit = 50;
//遅延カウント
private int delayCount;
//キー入力で遅延を終了する為のフラグ
private bool isDelaying;

private void Update()
{
    CheckInput();
    mover.Fall(speed);

    if (!mover.CanMove())
    {
        isDelaying = true;
        delayCount--;        

        //固定位置修正
        mover.AdjustToAbove();

        if (delayCount < 0)
        {
            //操作をできなくする
            enabled = false;

            //位置固定
            field.Fix();
            //列消去
            int cnt = field.DeleteLines();

            //スコア、レベルなど更新
            if (cnt > 0) UpdatePlayData(cnt);
            
            //落下終了イベント
            OnFalled();
        }
    }
    else
    {
        isDelaying = false;
    }
}

private void CheckInput()
{
    //長押し入力処理
    KeyInputReceiver.Update();

    if (Input.GetKeyDown(KeyCode.DownArrow))
    {
        //遅延中にキー入力があったら即、遅延を終了する
        if (isDelaying) delayCount = -1;
        else speed = maxSpeed;
    }
}

Unityでテトリスを作ってみた 3