ぬるーむ

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

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


スポンサードリンク

ゴーストとハードドロップ

ゴーストの表示は落下地点を求めてそこにゴーストを表示すればよい。
ハードドロップは落下地点を求めてテトリミノをそこまで落下させればよい。
落下地点を求める部分は共通なので、ゴーストを表示するときに求めた落下地点をハードドロップのときに利用するようにする。

ゴーストの表示

public class Ghost : MonoBehaviour
{
    public Vector3 RotatePosition;
    private Mover mover;

    public void Setup(Transform[,] field)
    {
        mover.Setup(field);
    }

    //引数はテトリミノの位置。戻り値は落下地点
    public Vector3 Move(Vector3 pos)
    {
        transform.position = pos;
        //落下できるまで落とす
        mover.HardDrop();

        return transform.position;
    }

    //引数はテトリミノの位置。戻り値は落下地点
    public Vector3 TurnLeft(Vector3 pos)
    {
        transform.position = pos;
        mover.TurnLeft(RotatePosition);

        return Move(pos);
    }

    //引数はテトリミノの位置。戻り値は落下地点
    public Vector3 TurnRight(Vector3 pos)
    {
        transform.position = pos;
        mover.TurnRight(RotatePosition);

        return Move(pos);
    }

    private void Awake()
    {
        mover = GetComponent<Mover>();
    }
}
private static readonly float dropSpeed = 0.9f;

//落下できる地点まで落下させる
public void HardDrop()
{
    var vec = new Vector3(0, -dropSpeed);

    do
    {
        transform.position += vec;
    } while (CanMove());

    AdjustToAbove();
}

ハードドロップ

//落下地点
private Vector3 dropPoint;

private void CheckInput()
{
    KeyInputReceiver.Update();

    if (KeyInputReceiver.GetKeyLongDown(KeyCode.LeftArrow))
    {
        mover.MoveLeft();
        //落下地点を更新
        dropPoint = ghost.Move(transform.position);
    }
    else if (KeyInputReceiver.GetKeyLongDown(KeyCode.RightArrow))
    {
        mover.MoveRight();
        //落下地点を更新
        dropPoint = ghost.Move(transform.position);
    }
    else if (Input.GetKeyDown(KeyCode.DownArrow))
    {
        if (isDelaying) delayCount = -1;
        else speed = maxSpeed;

        //落下地点を更新
        dropPoint = ghost.Move(transform.position);
    }
    else if (Input.GetKeyUp(KeyCode.DownArrow))
    {
        speed = levelSpeed;
    }
    else if (Input.GetKeyDown(KeyCode.UpArrow))
    {
        //ハードドロップ
        //固定の遅延処理中でなければ落下地点に移動
        if (!isDelaying) transform.position = dropPoint;

        delayCount = -1;

        //落下地点を更新
        dropPoint = ghost.Move(transform.position);
    }
    else if (Input.GetKeyDown(KeyCode.Z))
    {
        mover.TurnLeft(RotatePosition);
        //落下地点を更新
        dropPoint = ghost.TurnLeft(transform.position);
    }
    else if (Input.GetKeyDown(KeyCode.X))
    {
        mover.TurnRight(RotatePosition);
        //落下地点を更新
        dropPoint = ghost.TurnRight(transform.position);
    }
}

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