【问题标题】:How to clear Tetris lines in Unity game?Unity游戏中如何清除俄罗斯方块线?
【发布时间】:2019-06-26 23:32:12
【问题描述】:

我正在 Unity 中制作一个简单的俄罗斯方块游戏。一切正常,除了我无法清除线条而且我不知道为什么。

在我输入的代码中,我检查了已完成的行。如果它是一条完整的线,它应该清除该线并且所有块都应该向下移动一排。不幸的是,我的代码不起作用。

public Vector3 rotationPoint;
private float previousTime;
public float fallTime = 0.8f;
public static int height = 20;
public static int width = 10;
private static Transform[,] grid = new Transform[width, height];

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if (Input.GetKeyDown (KeyCode.LeftArrow)) {
        transform.position += new Vector3 (-1, 0, 0);
        if (!ValidMove ())
            transform.position -= new Vector3 (-1, 0, 0);
    }  else if (Input.GetKeyDown (KeyCode.RightArrow)) {
        transform.position += new Vector3 (1, 0, 0);
        if (!ValidMove ())
            transform.position -= new Vector3 (1, 0, 0);
    }  else if (Input.GetKeyDown (KeyCode.UpArrow)) {
        transform.RotateAround (transform.TransformPoint(rotationPoint), new Vector3 (0, 0, 1), 90);
        if (!ValidMove ())
            transform.RotateAround (transform.TransformPoint(rotationPoint), new Vector3 (0, 0, 1), -90);
    }

    if (Time.time - previousTime > (Input.GetKey (KeyCode.DownArrow) ? fallTime / 10 : fallTime)) {
        transform.position += new Vector3 (0, -1, 0);
        if (!ValidMove ()){
            transform.position -= new Vector3 (0, -1, 0);
            AddToGrid ();
            this.enabled = false;
            FindObjectOfType<SpawnTetromino> ().NewTetromino ();
        }
        previousTime = Time.time; 
    }
}

void CheckForLines(){
    for (int i = height-1; i >= 0; i--){
        if(HasLine(i)){
            DeleteLine(i);
            RowDown(i);
        }
    }
}

bool HasLine(int i){
    for(int j = 0; j< width; j++){
        if(grid[j, i] == null)
            return false;
    }
    return true;
}

void DeleteLine(int i){
    for (int j = 0; j < width; j++){
        Destroy(grid[j, i].gameObject);
        grid[j, i] = null;
    }
}

void RowDown(int i){
    for (int y = i; y < height; y++){
        for (int j = 0; j < width; j++){
            if(grid[j,y] != null){
                grid[j, y - 1] = grid[j,y];
                grid[j, y] = null;
                grid[j, y - 1].transform.position -= new Vector3(0, 1, 0);
            }
        }
    }
}


void AddToGrid(){
    foreach (Transform children in transform) {
        int roundedX = Mathf.RoundToInt (children.transform.position.x);
        int roundedY = Mathf.RoundToInt (children.transform.position.y);

        grid [roundedX, roundedY] = children;
    }
}

bool ValidMove(){
    foreach (Transform children in transform) {
        int roundedX = Mathf.RoundToInt (children.transform.position.x);
        int roundedY = Mathf.RoundToInt (children.transform.position.y);

        if (roundedX < 0 || roundedX >= width || roundedY < 0 || roundedY >= height) {
            return false;
        }
        if (grid [roundedX, roundedY] != null)
            return false;
    }

    return true;
}

提前致谢。

【问题讨论】:

  • “我的代码不起作用”不幸的是不是很具体。也许您可以更详细地描述什么不起作用/您尝试了什么?你试过自己调试吗?它不编译吗?它是错误的吗?现在,您基本上希望有人阅读您的 100 行代码并在不知道发生了什么的情况下为您调试它,老实说,这有点过分。
  • 欢迎来到 StackOverflow! Christian 想说的是:请减少您的代码,只向我们展示重现错误所需的最少内容。例如。如果与问题无关,我们不在乎GetKeyDown 的处理方式。最好告诉我们确切的位置,例如CheckForLine 被调用了,它的行为与您期望的行为有何不同?
  • 实际上为了正确的俄罗斯方块行为,您的代码应该检查是否有 1 到 4 行(俄罗斯方块)可以一次删除。检查最后放置的瓦片所在的行也足够了,因为这些行是该步骤中唯一更改的行。

标签: c# unity3d


【解决方案1】:

将 CheckForLines() 添加到 Update 方法的末尾。目前你没有使用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多