我有一个图像网格,就像2D图块集。当我给出瓦片索引时,这个方法应该给我来自瓦片组的图像。
谁能看到我的数学搞砸了?目前,此功能只为n
和n.(random decimal)
提供了x
和y
。
- (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;
}
答案 0 :(得分:1)
我认为你有一个简单的单位错误。目前,您将表示索引的数字除以表示坐标的数字;因此,你最终得到的单位是“每个坐标的索引”。*你想要的只是坐标单位。
因此,point.x
的分配应为:
point.x = fmodf(fGid * kTileWidth, tileSource.size.width);
也就是说,瓦片索引(单位:“索引”)乘以一个瓦片的宽度(单位:“每个索引的坐标”),如果这是一行瓦片,则给出它的位置(单位:“坐标“)。在除以一行瓷砖的实际宽度后取余数,可得到正确的x坐标。
对于point.y
,您需要相同计算的商:
point.y = trunc(fGid * kTileWidth / tileSouce.size.width) * kTileHeight;
索引乘以磁贴的宽度除以行的宽度,告诉您在该索引处完成了多少行;乘以瓷砖的高度来获得坐标。
对于一个更加常量的kNumTilesInRow
:
point.x = (gid % kNumTilesInRow) * kTileWidth;
point.y = (gid / kNumTilesInRow) * kTileHeight;
*您不断回复n
,因为abs(n) < abs(m)
,n % m
始终等于n
。
答案 1 :(得分:0)
我认为你需要移动一个括号。
假设3 x 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;