繁体   English   中英

OBJ-C坐标数组-最佳做法?

[英]Obj-c Arrays for coordinates - best practices?

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

根--->板上位置--->项目0 ---> TileX(number(4)),Tile y(number(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;

现在很明显,现在我只是在将此日志记录在日志中,所以我让每个图块都返回其X值和Y值。 我最终将其绘制到某种CGRectMake网格上,然后使用图像在ViewController上显示它。 正如我所说,我对此并不陌生,仍然在学习。 有更简单的方法可以做到这一点吗? 更好的方法? 我非常感谢您的反馈,谢谢!

您可以简单地以{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格式保存所有位置。 您可以从这些NSString生成CGPoint 您可以直接使用这些CGPoint来定位瓷砖,或者甚至可以根据需要分离出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);
}

继续以上您的评论:

我假设网格也是六角形的,所以它将是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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM