我知道这不是严格意义上的Objective-C问题,而是我所知道的,我想我也可以利用这个网站上的一些神奇人才解决这个问题。
我正在尝试以菱形格式(参见图片)为Sprite Kit游戏制作物体。我正在努力想办法做到这一点。
中心区块(13)将与屏幕(self.size.width/2), (self.size.height/2)
我使用以下定义作为布局的基础
#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];
}
}
请记住,我希望按照图片中的数字顺序放置对象。这将有助于维护其图层顺序。
任何帮助将不胜感激:)
答案 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);
}