Obj-c坐标数组 - 最佳实践?

时间:2014-04-09 13:37:16

标签: ios objective-c arrays

我最近开始自学Obj-c并开展了一个大项目,以便在他们出现时学习语言的原理。我正在用14块瓷砖板制作游戏。现在放置这些我觉得最好将每个瓷砖的坐标放在.plist中,访问此信息然后返回每个坐标。所以plist看起来像这样:

root --->船上的位置--->项目0 ---> TileX(数字(4)),Tile y(数字(12))--->第1项......等等。最多13个。

现在在代码中我将其作为

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"WheelData.plist"];
NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath];
NSArray *positionOnBoard = [NSArray arrayWithArray:[plistData objectForKey:@"Position On Board"]];

int numberOfPositions = [positionOnBoard count];

NSMutableArray *PositionX;
NSMutableArray *PositionY;
NSMutableArray *arrayOfPositionsX = [[NSMutableArray alloc] initWithCapacity:numberOfPositions];
NSMutableArray *arrayOfPositionsY = [[NSMutableArray alloc] initWithCapacity:numberOfPositions];
for (int d = 0; d < numberOfPositions; d++) {
    [arrayOfPositionsX addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile X"]];
    [arrayOfPositionsY addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile Y"]];
    PositionX = [NSMutableArray arrayWithArray:arrayOfPositionsX];
    PositionY = [NSMutableArray arrayWithArray:arrayOfPositionsY];

    if (d == 0) {
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 1) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 2) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 3) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 4) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 5) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 6) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 7) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 8) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 9) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 10) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 11) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else if (d == 12) {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    }

}
return PositionX;
return PositionY;

现在很明显,我现在正在对此进行nslogging,因此我让每个磁贴都返回其X值和Y值。我最终会将其绘制到某种CGRectMake网格上,然后使用图像在viewcontroller上显示它。正如我所说,我是新手,仍然在学习。有更简单的方法吗?更好的方法?我非常感谢您的反馈,谢谢!

2 个答案:

答案 0 :(得分:5)

您只需在{10,10}格式的plist文件中添加一系列位置即可.... 所以你的plist结构看起来像这样;

<plist version="1.0">
<array>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
    <string>{10,10}</string>
</array>
</plist>

然后,访问如下数据;

NSArray *positionsArray = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Page" ofType:@"plist"]];

上面的数组将以NSString格式保存所有位置。您可以从这些NSStrings生成CGPoint。 您可以直接使用这些CGPoints来定位瓷砖,或者您甚至可以根据需要分离X和Y坐标。请在下面找到代码段

int count = 0;
for(NSString *strPos in positionsArray)
{
    count++;
    CGPoint position = CGPointFromString(strPos);
    NSLog(@"Position %d -> X:%f Y:%f",count,position.x,position.y);
}

答案 1 :(得分:0)

继续上述评论:

我假设网格也是六边形,所以它将是2,3,4,3和2行等于14个图块。如果它是一个网格,并且图块的物理位置将始终是网格中的一个离散位置,我认为您不需要存储每个图块的X和Y坐标。您可以将它们的位置存储在网格中的二维数组中,并使用一种方法绘制板并将切片放在网格中的相应位置。除此之外,存储每个图块的中心X和Y坐标没有多大意义(除非您出于某种原因需要)。由于绘图坐标从左下角开始,您应该将每个六边形视为存在于矩形内并存储左下角的X和Y坐标。显然,矩形行需要重叠一点才能让瓷砖贴合在一起(如果我对网格的假设是正确的话)。

至少,您应该重新考虑代码中的for循环。每次迭代都有一个if语句会失败for循环的目的,考虑到每个else if语句完全相同,完全没有必要。你可以清理它看起来像这样:

for (int d = 0; d < numberOfPositions; d++) {
    [arrayOfPositionsX addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile X"]];
    [arrayOfPositionsY addObject:[[positionOnBoard objectAtIndex:d] objectForKey:@"Tile Y"]];
    PositionX = [NSMutableArray arrayWithArray:arrayOfPositionsX];
    PositionY = [NSMutableArray arrayWithArray:arrayOfPositionsY];

    if (d == 0) {
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    } else {
        [arrayOfPositionsX removeObjectAtIndex:0];
        [arrayOfPositionsY removeObjectAtIndex:0];
        NSLog(@"%i %@ %@", d, arrayOfPositionsX, arrayOfPositionsY);
    }
}