Я думаю, у вас есть простая ошибка единиц. В данный момент вы делите число, представляющее индекс, на число, представляющее координату; поэтому единица измерения, которую вы в конечном итоге получите, - это «индекс на координату». * Однако вам нужны только единицы измерения координат.
Поэтому присвоение point.x
должно быть:
point.x = fmodf(fGid * kTileWidth, tileSource.size.width);
То есть индекс плитки (единицы измерения: «индекс»), умноженный на ширину одной плитки (единицы измерения: «координаты на индекс»), дает вам местоположение, если это был один ряд плиток (единицы измерения: « координаты"). Взятие остатка после деления на фактическую ширину ряда плиток дает правильную координату х.
Для 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
.