以钻石形状以编程方式布置对象

时间:2014-05-06 13:55:04

标签: ios objective-c layout sprite-kit

我知道这不是严格意义上的Objective-C问题,而是我所知道的,我想我也可以利用这个网站上的一些神奇人才解决这个问题。

我正在尝试以菱形格式(参见图片)为Sprite Kit游戏制作物体。我正在努力想办法做到这一点。

中心区块(13)将与屏幕(self.size.width/2), (self.size.height/2)

的中心对齐

Object Layout

我使用以下定义作为布局的基础

#define kLevel_01_GridSize 5
#define kLevel_01_SpacingX 75
#define kLevel_01_SpacingY 32

以下代码就是我现在所拥有的全部内容。它放置了第一个块(1)

-(void)layoutLevel {

    int gridCentre = (kLevel_01_GridSize - 1) / 2;
    int totalObjects = kLevel_01_GridSize * kLevel_01_GridSize;


    CGPoint objectPosition;

    for (int x = 1; x < totalObjects; x++)
    {

        objectPosition = CGPointMake(self.size.width / 2 , (self.size.height /2 ) + (x * gridCentre) * kLevel_01_SpacingY);

        SKNode *block = [self makeBlockOfType:LevelBlock];
        block.position = objectPosition;
        [self addChild:block];
    }
}

请记住,我希望按照图片中的数字顺序放置对象。这将有助于维护其图层顺序。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

这是一个基本的三角和几何问题 - 计算机图形的基本要点

您可以使用trig来计算每个x和y的步长值(它将是sqrt(2)/ 2 * square_side_length),然后通过x和y编写代码循环,将位置偏移该量,< / p>

或者您可以根据非旋转的方形计算您的位置,然后在绘制它们之前对坐标应用45度(pi / 2)变换矩阵。

计算出数字的位置需要花一些时间。

当你说“我不妨利用这个网站上的一些神奇人才来解决这个问题。”这听起来很像“我想我可能会试着让其他人免费为我做我的工作。”

不。

我很高兴为您编写此代码 - 以我通常的咨询费用。否则我会提供建议和帮助,但我不会为你工作。

考虑如何处理数字,这就是我想出的。逆时针旋转矩形45度,使1位于左上角。然后标记从0开始的每个单元格的x和y坐标。因此,其中1的单元格为0,0。其中3个的单元格为1,0。

您可以创建一个查找表,为您提供任何给定单元格的x / y坐标。像这样的东西

define cellWidth  50.0
#define gridSize 5

  typedef struct
  {
    int x;
    int y;
  } gridPosition;

  //For all the cells, here are the values at each x/y position
/*
    x   0  1  2  3  4
    |  -- -- -- -- --
y   |
0   |  01 03 06 10 15
1   |  02 05 09 14 19
2   |  04 08 13 18 22
3   |  07 12 17 21 24
4   |  11 16 20 23 25
 */

  //Then  create an array of 25 gridPosition objects and populate each one with the grid coordinates of that
  //value

  gridPosition positions[25] = {
    {.x= 0, .y= 0},  //Value 1 at (0,0)
    {.x= 0, .y= 1},  //Value 2 at (0,1)
    {.x= 1, .y= 0},  //Value 3 at (1,0)
    {.x= 0, .y= 2},  //Value 4 at (0,2)
    //and so on for all 25 entries..
  };


  CGPoint cellCenter;
  int x, y;
  int cellIndex;
  gridPosition cellPosition;
  for (y = 0; y < gridSize; y++)
    for (x = 0; x < gridSize; x++)
    {
      cellIndex = y*gridSize + x;
      cellPosition = positions[cellIndex];
      cellCenter = CGPointMake(
                               cellWidth/2.0 + cellPosition.x*cellWidth,
                               cellWidth/2.0 + cellPosition.y*cellWidth);
    }