【问题标题】:C# Tetris, clear the formed rectangle instead of row or lineC#俄罗斯方块,清除形成的矩形而不是行或行
【发布时间】:2016-09-05 09:46:52
【问题描述】:

我正在开发一款具有俄罗斯方块概念的游戏,但在我的游戏中,我想要清除的是玩家形成的矩形,而不是行或线。例如,我实例化如果网格上有 4 行和 5 列填充有俄罗斯方块块,这些块将被清除。

到目前为止,这是我删除一行的代码:

using UnityEngine;
using System.Collections;

public class Grid : MonoBehaviour {

    // The Grid itself
    public static int w = 10;
    public static int h = 20;
    public static Transform[,] grid = new Transform[w, h];



    void Start () {

    }


     public static Vector2 roundVec2(Vector2 v) {
        return new Vector2(Mathf.Round(v.x),
                           Mathf.Round(v.y));
    }



    // helps to find out if a certain coordinate is in between the borders or if it's outside of the borders:

    public static bool insideBorder(Vector2 pos) {
        return ((int)pos.x >= 0 &&
                (int)pos.x < w &&
                (int)pos.y >= 0);
    }



    //The next function deletes all Blocks in a certain row. 

    public static void deleteRow(int y) {
        for (int x = 0; x < w; ++x)
        {
            Destroy(grid[x, y].gameObject);
            grid[x, y] = null;

        }
        Score.currentScore += 1;

    }




    // Whenever a row was deleted, the above rows should fall towards the bottom by one unit

    public static void decreaseRow(int y) {
        for (int x = 0; x < w; ++x)
        {
            if (grid[x, y] != null)
            {
                // Move one towards bottom
                grid[x, y - 1] = grid[x, y];
                grid[x, y] = null;

                // Update Block position
                grid[x, y - 1].position += new Vector3(0, -1, 0);
            }
        }
    }


    public static void decreaseRowsAbove(int y)
    {
        for (int i = y; i < h; ++i)
            decreaseRow(i);
    }



    // function that finds out if a row is full of blocks

    public static bool isRowFull(int y)
    {
        for (int x = 0; x < w; ++x)
            if (grid[x, y] == null)
                return false;
        return true;
    }


    //a function that deletes all full rows and then always decreases the above row's y coordinate by one.

    public static void deleteFullRows()
    {
        for (int y = 0; y < h; ++y)
        {
            if (isRowFull(y))
            {
                deleteRow(y);
                decreaseRowsAbove(y + 1);
                --y;

            }
        }
    }       
}

那么,如何清除俄罗斯方块中形成的矩形?

通常的俄罗斯方块删除行或行。但我想要的是清除一个矩形棱镜。

感谢您的回复

【问题讨论】:

  • 决定:C# 还是 Java?
  • 还有:问题是什么?你只是放弃了要求;和您当前拥有的代码。
  • C# 问题是如何清除在俄罗斯方块中形成的矩形。通常的俄罗斯方块删除行或行。但我想要的是清除一个矩形棱镜。感谢您的回复
  • @ChristophKn 不,只有在需要时才写。

标签: c# unity3d tetris


【解决方案1】:

类似这样的:

public static void deleteGrid(int startX, int startY, int width = 5, int height = 4) 
{

    // to avoid Errors, Check if indexes are in bound for grid.

    // if condition code goes here

    // then...

    for (int i = startX; i < startX + width; i++)
    {
        for (int j = startY; j < startY + height; j++) 
        {
            Destroy(grid[i, j].gameObject);
            grid[i, j] = null;
        }
    }
    Score.currentScore += 1;
}

这样称呼它:

Grid.deleteGrid(2,3); // default width = 5, height = 4 will be used here.

或者

Grid.deleteGrid(2,3,3,3); // this will delete 3X3 grid at index (2,3)

【讨论】:

  • 感谢您的回复和编辑我的问题。它有一个错误说“方法'deleteRow'没有重载需要'1'参数。抱歉,我是游戏开发的新手。我将编辑我的问题并放置我的整个脚本。谢谢
  • 我已经更新了我的答案。你在哪里调用你的deleteRow() 方法。将其更改为deleteGrid
  • 仍然对我不起作用。我认为你的代码没有问题。我真的不知道如何应用它,真的。你能考虑我上面的完整源代码吗?谢谢你帮我一个忙。
  • 好吧,你应该弄清楚在哪里使用这段代码。请标记答案正确
  • 这一切都与删除块有关。当块被清除时,上面的俄罗斯方块会掉下来。我所做的是将 deleteRow() 替换为您建议的。但它显示了一个过载错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多