Определить, какая плитка щелкнута в окне

Я рисую тайловую карту в окне рендеринга SFML. Я хочу определить, какая плитка нажата пользователем, но я просто не могу найти решение. Прежде всего, каждая плитка имеет 32 ширины и высоты. Что я пытаюсь сделать на данный момент: получить позицию клика. Прокручивайте тайловую карту до тех пор, пока не будет найден тайл, позиция которого находится между 100. Поэтому, если я нажму (100,100), тайл должен начинаться с (96,96), но это, похоже, не работает.

Плитки

Вот мой фрагмент кода из функции getTile(mousepos x,mousepos y)

Tile* TileMap::getTile(int x, int y)
{
    Tile *t = NULL;
    for(int i = 0; i < tilemap.size(); i++)
    {
        for(int j = 0; j < tilemap[i].size(); j++)
        {
            if(x > tilemap[i][j].sprite.getPosition().x
            && x < (tilemap[i][j].sprite.getPosition().x+32))
            {
                if(y > tilemap[i][j].sprite.getPosition().y
                && y < (tilemap[i][j].sprite.getPosition().y+32))
                {
                    t = &tilemap[i][j];
                    break;
                }
            }
        }
    }

    return t;
}

person Amazonasmann    schedule 06.09.2013    source источник


Ответы (1)


Основываясь на вашем коде, я собираюсь предположить, что вы основываете свою тайловую карту на двумерном массиве тайлов: tilemap[x][y]. Я также предполагаю, что tilemap[0][0] — это верхняя левая плитка.

Должен быть гораздо более простой способ узнать, на какую плитку нажимают, вместо того, чтобы проверять каждую плитку.

Если у вас 100 100, а тайлы имеют размер 32x32, то мы можем получить x и y тайла в тайловой карте, выполнив что-то простое, например:

x = 100 / 32 = 3

y = 100 / 32 = 3

Таким образом, плитка в вашей карте плиток, соответствующая положению мыши (100,100), называется tilemap[3][3].

person charzoc    schedule 06.09.2013
comment
100 % 32 = 4, потому что оператор по модулю возвращает остаток от деления. 30 % 32 = 30 - person Amazonasmann; 07.09.2013
comment
Упс. Виноват. Да, вам нужен оператор деления не по модулю. Пока вы используете целочисленное деление, вы должны быть в безопасности. Я считаю, что большинство, если не все, используемые единицы должны быть целыми (координата мыши, индексы 2d-массива, размеры плитки) - person charzoc; 07.09.2013
comment
Это уравнение должно работать, если ваша карта не смещена видом или чем-то еще. Вам придется добавить коэффициент перевода в формулу, но это не намного сложнее. Просто кое-что, о чем следует помнить, когда вы развиваете свою карту тайлов! - person charzoc; 08.09.2013