Определете коя плочка е щракната в прозорец

Чертая tilemap върху прозорец за рендиране на 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 на 2d масив от Tiles: tilemap[x][y]. Също така ще приема, че tilemap[0][0] е горната лява плочка.

Трябва да има много по-лесен начин да разберете върху коя плочка се кликва, вместо да тествате всяка една плочка.

Ако сте на 100 100 и плочките са 32x32, тогава можем да получим x и y на плочката в tilemap, като направим нещо толкова просто като:

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