ぬるーむ

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

Unityでぷよぷよを作ってみた 7


スポンサードリンク

壁蹴り

壁が邪魔でぷよが回転できないとき、1列ずれてから回転するようにする。

f:id:Nullsuke:20201028224716p:plain
壁蹴り

private enum PuyoDirection { Top = 0, Right = 1, Bottom = 2, Left = 3 }

public void TurnLeft(Vector3 rotatePosition)
{
    transform.RotateAround(transform.TransformPoint(rotatePosition),
            new Vector3(0, 0, 1), 90);
    
    if (!CanMove())
    {
        var dir = GetDirection();

        if (!KickWall(dir))
        {
            transform.RotateAround(transform.TransformPoint(rotatePosition),
                new Vector3(0, 0, 1), -90);
        }
    }
}

public void TurnRight(Vector3 rotatePosition)
{
    transform.RotateAround(transform.TransformPoint(rotatePosition),
            new Vector3(0, 0, 1), -90);
    
    if (!CanMove())
    {
        var dir = GetDirection();

        if (!KickWall(dir))
        {
            transform.RotateAround(transform.TransformPoint(rotatePosition),
                new Vector3(0, 0, 1), 90);
        }
    }
}

//壁蹴り
private bool KickWall(PuyoDirection puyoDir)
{
    if (puyoDir == PuyoDirection.Left)
    {
        if (!CanMoveTo(Vector3.right)) return false;

        MoveRight();
    }
    else if (puyoDir == PuyoDirection.Right)
    {
        if (!CanMoveTo(Vector3.left)) return false;

        MoveLeft();
    }
    else if (puyoDir == PuyoDirection.Bottom)
    {
        if (!CanMoveTo(Vector3.up)) return false;

        transform.position += Vector3.up;
    }

    return true;
}

//移動判定後元の位置に戻す
private bool CanMoveTo(Vector3 dir)
{
    bool canMove;

    transform.position += dir;
    canMove = CanMove();
    transform.position -= dir;

    return canMove;
}

//子ぷよの方向を取得
private PuyoDirection GetDirection()
{
    var a = transform.rotation.eulerAngles.z;

    if (a == 90) return PuyoDirection.Left;

    if (a == 270) return PuyoDirection.Right;

    if (a == 180) return PuyoDirection.Bottom;

    return PuyoDirection.Top;
}