【问题标题】:How can I use a jagged array to record the x and y axes of these tiles?如何使用锯齿状数组记录这些图块的 x 轴和 y 轴?
【发布时间】:2012-12-13 04:51:47
【问题描述】:

在我正在制作的游戏中,我有一个通过 XML 文件创建的关卡。该级别是使用嵌套的 for 循环绘制的。我正在尝试制作另一个嵌套的 for 循环来获取每个图块的位置并将其分配给锯齿状数组。我想这样做,这样我就可以对每个图块进行碰撞检测。

下面示例级别的图片中的每个图块都是 20x20 像素,具有 30x30 个图块,屏幕分辨率为 600x600。该关卡是使用免费软件 Realm Factory 制作的,它缺乏文档,也没有真正的支持……但是,currentLevel.Rows 在这里等于 30,currentLevel.Columns 也是如此。

以下是我到目前为止尝试创建的内容,但并不多。无论我怎么尝试,我的大脑都拒绝理解锯齿状数组。我什至不知道如何创建它们!

int a = 0;
int b = 0;
int x = 0;
int y = 0;
int[,] size = new int[currentLevel.Rows, currentLevel.Columns]'
int[,] pos = new int[600,600];
int[] tiles = new int[600];


for (a = 0; a < 600; a += 20, x++)
{
    for (b = 0; b < 600; b += 20, y++)
    {
        size[x][y] = ;
    }
}

我要分配给tiles[x,y]的是每个tile的X和Y位置,这样我就可以为每个tile添加碰撞。

非常感谢任何可以帮助我的人。我喜欢编程,但我的数学和视觉空间技能不太好......

【问题讨论】:

  • 我能看到的第一个问题是,您将“size”声明为锯齿状数组,然后尝试将其用作二维数组(例如,“size[x,y]”是一个二维数组,并且size[x][y] 是一个锯齿状数组)。这可能会有所帮助。 msdn.microsoft.com/en-us/library/2s05feca(v=vs.80).aspx
  • 但是我应该使用两个锯齿状数组来解决这个问题,这对吗?我很难把这个概念化,所以我不完全确定。
  • 在我看来,您不需要将位置存储在另一个数组中,因为 x 和 y 位置是数组值。例如,tile[0][0] 将包含左上角的 tile 的所有数据,tile[1][0] 将是第二列顶部的 tile,依此类推。您可能会更好地创建自己的 tile 结构来存储您需要的任何信息。
  • @SeanHeiss:位置是一个点(它有一个横坐标和一个纵坐标),而不是一个整数。此外,如果你有一个矩阵(20x20 的瓦片,或 600x600 的像素),你为什么要把它存储在 jagged 数组中?这就是二维数组的用途。
  • 好问题。我不知道。我不完全理解数组,所以我不确定使用哪个。叫我白痴,但我正在尽我最大的努力。 :)

标签: c# jagged-arrays


【解决方案1】:

Position 是一个点(它有一个横坐标和一个纵坐标),而不是一个整数。 此外,如果您有一个矩阵(瓷砖为 20x20,或像素为 600x600),为什么要尝试将其存储在锯齿状数组中?这就是多维数组的用途:

        var tileSize = 20;
        var screenSizeInTiles = 30;

        // initializing multidimensional array of points
        var tilePositions = new Point[screenSizeInTiles, screenSizeInTiles];

        for (var x = 0; x < screenSizeInTiles; x++)
        {
            for (var y = 0; y < screenSizeInTiles; y++)
            {
                tilePositions[x, y] = new Point(x * tileSize, y * tileSize);
            }
        }

锯齿状数组比较:

        // initializing jagged array of points
        var tilePositions = new Point[screenSizeInTiles][];
        for (var i = 0; i < screenSizeInTiles; i++)
        {
            // each item in a jagged array is a one-dimensional array of points.
            tilePositions[i] = new Point[screenSizeInTiles];
        }

        for (var x = 0; x < screenSizeInTiles; x++)
        {
            for (var y = 0; y < screenSizeInTiles; y++)
            {
                tilePositions[x][y] = new Point(x * tileSize, y * tileSize);
            }
        }

如您所见,多维数组是一个实体,它保证每一行的大小与其他行的大小相同,列的大小也是如此。

锯齿状数组又是数组的数组,其中每个成员(数组)可以有长度,该长度与其“邻居”的长度不同。

当然,您可以将矩阵表示为锯齿状数组,这将是特殊情况(锯齿状数组的所有成员将具有相同的长度),但这不太方便使用。

附:我使用了来自herePoint 结构。

【讨论】:

  • 非常感谢!现在请给我一些时间在我的项目中实现它,我会报告它的进展情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多