SpriteKit创建迷宫

时间:2014-04-29 07:30:15

标签: ios sprite-kit maze

我尝试使用SpriteKit创建一个迷宫,我创建的迷宫会像这样打印到控制台:

###########
# #     # #
# ### # # #
#     #   #
######### #
# #     # #
# # # ### #
# # #   # #
# # ### # #
#     #   #
###########

看起来很好,但屏幕上的迷宫看起来像这样:

enter image description here

我的代码如下:

for (int a = 0; a < size * 2 + 1; a++)
{
    for (int b = 0; b < size *2 + 1; b++)
    {
        MazeCell* cell;
        NSNumber* number = [[arrayMaze objectAtIndex:a]objectAtIndex:b];

        if (number.integerValue == 1)
        {
            cell = [[MazeCell alloc]initWithType:1 sort:0];
        }
        else
        {
            cell = [[MazeCell alloc]initWithType:0 sort:1];
        }

        if (number.integerValue == 1)
            printf("#");
        else
            printf(" ");

        cell.position = CGPointMake(startPoint.x+(16*a), startPoint.y+(16*b));
        [self addChild:cell];
    }
    printf("\n");
}

我知道将数组打印到屏幕上真的很简单,但是接缝就像我错过了一些东西...... 谢谢你的帮助:)

2 个答案:

答案 0 :(得分:2)

是。您正在顺时针旋转90度。也许解决方案是补偿这种轮换:

cell.position = CGPointMake(startPoint.x+16*b, size*2-startPoint.y+16*(size*2-a));

答案 1 :(得分:2)

以这种方式思考:每次增加a时都会打印换行符。因此,我们可以推断,用于打印a表示y坐标,b表示x坐标。

另一方面,当您计算单元格的位置时,您正在使用a来计算单元格的坐标,并且您正在使用b来计算单元格&# 39; sy坐标。

你基本上有两个选择。

  1. 您可以在for循环之间交换变量:

    for (int b = 0; b < size * 2 + 1; b++) {
        for (int a = 0; a < size * 2 + 1; a ++) {
            ...
    
  2. 您可以在计算单元格坐标时交换变量:

    cell.position = CGPointMake(startPoint.x+(16*b), startPoint.y+(16*a));
    
  3. 在迭代二维网格时,将外环视为y迭代循环是很常见的。所以我的建议是你做出这些改变:

    1. a重命名为y
    2. b重命名为x
    3. 计算单元格坐标时交换变量。
    4. 因此:

      for (int y = 0; y < size * 2 + 1; y++) {
          for (int x = 0; x < size *2 + 1; x++) {
              MazeCell* cell;
              NSNumber* number = arrayMaze[y][x];
      
              if (number.integerValue == 1) {
                  cell = [[MazeCell alloc] initWithType:1 sort:0];
              } else {
                  cell = [[MazeCell alloc] initWithType:0 sort:1];
              }
      
              if (number.integerValue == 1) {
                  printf("#");
              } else {
                  printf(" ");
              }
      
              cell.position = CGPointMake(startPoint.x+(16*x), startPoint.y+(16*y));
              [self addChild:cell];
          }
          printf("\n");
      }
      

      此外,您的打印输出将原点放在顶部并向下增加y坐标。但是,SpriteKit将原点放在左下方并向上增加y坐标。 (请参阅“Using the Anchor Point to Position the Scene’s Coordinate System in the View” in Sprite Kit Programming Guide。如果您希望Y轴在图形中与打印输出中的方向相同,请将场景的锚点设置在其左上角并设置yScale为-1。或者,你可以从父亲的高度减去每个y坐标(如在Horvath的回答中)。