Всем привет!
В уроках, которых я видел, проверка кликнула ли мышь в спрайт осуществлялась как-то так:
|
sprite.getGlobalBounds().contains(screenX, screenY) |
Если большая часть спрайта прозрачна, это плохо работает (ложно положительные результаты).
Написал функцию, которая учитывает прозрачность, трансформации, TextureRect.
Заодно, возвращает цвет в данной точке.
(Image я загружаю из файла с самого начала, по нему создаю текстуру, и то и другое кэширую. Текстуру передаю спрайту, Image держу под рукой.)
Погонял, работает. Вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
bool spriteColor(const sf::Sprite& sprite, const sf::Image& image, int screenX, int screenY, sf::Color& color) { if (!sprite.getGlobalBounds().contains(screenX, screenY)) return false; auto imageSize = image.getSize(); auto& rect = sprite.getTextureRect(); auto& inverse = sprite.getInverseTransform(); auto p0 = inverse.transformPoint(float(screenX), float(screenY)); int x = round(p0.x); int y = round(p0.y); x += rect.left; y += rect.top; if (x < 0 || x > int(imageSize.x)) return false; if (y < 0 || y > int(imageSize.y)) return false; color = image.getPixel(x, y); return color.a > 0; } |