【发布时间】: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 行(俄罗斯方块)可以一次删除。检查最后放置的瓦片所在的行也足够了,因为这些行是该步骤中唯一更改的行。