我尝试使用SpriteKit创建一个迷宫,我创建的迷宫会像这样打印到控制台:
###########
# # # #
# ### # # #
# # #
######### #
# # # #
# # # ### #
# # # # #
# # ### # #
# # #
###########
看起来很好,但屏幕上的迷宫看起来像这样:
我的代码如下:
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");
}
我知道将数组打印到屏幕上真的很简单,但是接缝就像我错过了一些东西...... 谢谢你的帮助:)
答案 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坐标。
你基本上有两个选择。
您可以在for
循环之间交换变量:
for (int b = 0; b < size * 2 + 1; b++) {
for (int a = 0; a < size * 2 + 1; a ++) {
...
您可以在计算单元格坐标时交换变量:
cell.position = CGPointMake(startPoint.x+(16*b), startPoint.y+(16*a));
在迭代二维网格时,将外环视为y迭代循环是很常见的。所以我的建议是你做出这些改变:
a
重命名为y
。b
重命名为x
。因此:
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的回答中)。