2011-11-29 56 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;