Как очистить линии тетриса в игре Unity? - PullRequest
0 голосов
/ 26 июня 2019

Я делаю простую игру Тетрис в 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;
}

заранее спасибо.

1 Ответ

0 голосов
/ 26 июня 2019

Добавьте CheckForLines () в конец метода Update. В настоящее время вы не используете его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...