2011-11-29 79 views
0

我有一个网格的图像,就像一个2D瓦片集。当我给出瓦片索引时,这种方法应该给我从瓦片集中的图像。算术索引转换为坐标只是返回索引

任何人都可以看到我的数学被搞砸了吗?目前这个功能只给我nn.(random decimal)xy

- (CGImageRef)tileFromTileset:(int)gid { 
    CGImageRef tile; 
    CGPoint point; 
    CGFloat fGid = (CGFloat)gid; 
    point.x = fmodf(fGid, tileSource.size.width); 
    point.y = (fGid - (fmod(fGid, tileSource.size.width))/(tileSource.size.width) + 1); 
    NSLog(@"%@", NSStringFromCGPoint(point)); 
    tile = CGImageCreateWithImageInRect([tileSource CGImage], CGRectMake(point.x, point.y, kTileWidth, kTileHeight)); 
    return tile; 
} 

回答

1

我认为你有单位的一个简单的错误。此刻,您将表示索引的数字除以表示坐标的数字;你最终得到的单位是“每个坐标的索引”。*你想要的,只是坐标单位。

分配到point.x因此应该:

point.x = fmodf(fGid * kTileWidth, tileSource.size.width); 

即,瓦片指数(单位:“索引”),再乘以的一个图块的宽度(单位:“每个索引坐标”),如果这是一排瓷砖(单位:“坐标”),则为您提供其位置。除以一排瓷砖的实际宽度后的余数为您提供正确的x坐标。

对于point.y,你需要同样的计算的商:

point.y = trunc(fGid * kTileWidth/tileSouce.size.width) * kTileHeight; 

指数,再乘以一个瓷砖的宽度,通过一排的宽度分割,告诉你多少行完成该指数;乘以瓦片的高度以获得坐标。 *您不断收到n回来,因为,对于abs(n) < abs(m)n % m总是等于n

point.x = (gid % kNumTilesInRow) * kTileWidth; 
point.y = (gid/kNumTilesInRow) * kTileHeight; 

这可能是即使有一个较为恒定,kNumTilesInRow清晰。

+0

虽然我不认为我可以制作kNumTilesInRow,因为我希望它是灵活的。不过谢谢。 – Weston

0

我想你需要移动括号。

假设一个3×3的布局如下:

1 2 3 
4 5 6 
7 8 9 

而且你把这种传递7,这是我看到:

- (CGImageRef)tileFromTileset:(int)gid { // 7 
    CGImageRef tile; 
    CGPoint point; 
    CGFloat fGid = (CGFloat)gid; // 7 
    point.x = fmodf(fGid, tileSource.size.width); // x= 7 % 3, so x=1 

    // y= (7 - 1/3 + 1), so y= 7.6666666 
    point.y = (fGid - (fmod(fGid, tileSource.size.width))/(tileSource.size.width) + 1); 

    // Try this instead of the above 
    // y = ((7 - 1)/3 + 1), so y=3 
    // point.y = ((fGid - fmod(fGid, tileSource.size.width))/(tileSource.size.width) + 1); 

    NSLog(@"%@", NSStringFromCGPoint(point)); 
    tile = CGImageCreateWithImageInRect([tileSource CGImage], CGRectMake(point.x, point.y, kTileWidth, kTileHeight)); 
    return tile;