Имеется изометрическая сетка, на сетке необходимо разместить объекты. Особенность сетки в том, что каждая ее ячейка имеет подъячейки:
property int mapWidth: 6 // количество клеток по горизонтали
property int mapHeight: 6 // количество клеток по вертикали
property int cellSize: 128 // размер клетки
property int cellDivider: 2 // делитель клетки (каждая клетка имеет 4 подклетки)
// property int cellDivider: 3 // каждая клетка имеет 9 подклеток
Стандартный тайл должен занимать ровно одну клетку (ячейку), описывается он таким образом:
{
"row": 4, // строка
"col": 2, // колонка
"wsize": 2, // занимаемая ширина в "подклетках"
"hsize": 2, // занимаемая высота в "подклетках"
"wpos": 1, // позиция в строке "подклетки"
"hpos": 1, // позиция в колонке "подклетки"
"source": "/tiles/tree1.png", // путь к изображению
"width": 300, // оригинальный размер изображения
"height": 200,
}
Для размещения такого тайла на карте вывел такие жутковатые формулы:
property int tileWidth: 128 // ширина стандартного тайла
property int tileHeight: tileWidth/2 // высота стандартного тайла
function createTile(tileInfo) {
// тут нормализуется размер тайла
var tile_w = tileWidth * tileInfo.wsize / cellDivider
var tile_h = tileWidth/tileInfo.width * tileInfo.height * tileInfo.hsize / cellDivider
// tileWidth/tileInfo.width => ratio
var tile_x = (map.width/2 + tileInfo.col*tileWidth/2 - tileInfo.row*tileWidth/2 - tileWidth/2)
var tile_y = (tileInfo.row*tileHeight/2 + tileInfo.col*tileHeight/2) - tile_h + tileHeight/2
/* ... */
}
где:
- map.width - полная ширина карты: map.width = mapWidth * cellSize (6 * 128)
- tileInfo - информация о тайле
- - tile_h + tileHeight/2 - тут отнимается высота полученного изображения, чтобы разметить картинку в центре клетки
Ну вроде получилось и нарисовалось:
Но теперь нужно нарисовать маленький "тайлик" в пол клетки:
{
"row": 4, // строка
"col": 2, // колонка
"wsize": 1, // занимаемая ширина в "подклетках"
"hsize": 1, // занимаемая высота в "подклетках"
"wpos": 1, // позиция в строке "подклетки"
"hpos": 1, // позиция в колонке "подклетки"
"source": "/tiles/smalltile.png",
"width": 300,
"height": 200,
}
и вот куда он нарисовался:
Большая синяя клетка - это как бы представление координат "подклеток"
Маленькая синяя клетка под деревом - это та "подклетка", где по идее должен был разместится тайл, но представленная формула не обрабатывает параметры
wpos и xpos, потому что я не смог впихать их правильно :-) что-бы я не пытался сделать, разноразмерные тайлы начинали прыгать относительно основной клетки в разные стороны.
Собственно, сам вопрос: как правильно составить формулу по исходным данным?
И еще попутный вопрос: насколько такой подход правилен/неправилен? Может есть метод проще/лучше?