Почему для одних спрайтов значение пикселя RGBA равно 0, для других - нет - PullRequest
0 голосов
/ 09 июля 2020

В настоящее время я пишу приложение iOS на Swift, и я создал функцию, которая возвращает значения RGBA для затронутого пикселя на SKSpriteNode. Он работает большую часть времени, но для некоторых спрайтов он возвращает 0 для всех значений RGBA, и я не могу понять, почему. Изображения создаются таким же образом и сохраняются в том же формате.

Вот функция, которую я использую для получения значения пикселя. Я сделал его расширением класса CGImage, поэтому он называется так: (node.texture.cgImage()).getAlphaForPixel(atX: x, atY: y)

    func getAlphaForPixel(atX x: Int, atY y: Int) -> Int {
        let cfData = self.dataProvider!.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(cfData)
        let pixelNumber = (Int(self.height / 2) - y) * Int(self.width) + (x + Int(self.width / 2))

        let byteBlockPosition = pixelNumber * 4

        return Int(data[byteBlockPosition + 3]) // alpha value for pixel
    }

Вот пример некоторых отладочных операторов, которые я напечатал для спрайта, который не работает:

frame w: 340.0 h: 170.0
texture w: 340.0 h: 170.0
CGImage: w: 1020 h: 510
texture width scale: 3.0, height scale: 3.0
touched image:  width: 1020, height: 510, 
touch location (on image): x: 195, y: -10
r:0, g:0, b:0, a:0

и вот другой спрайт на том же устройстве, который действительно работает:

frame w: 213.0 h: 163.0
texture w: 213.0 h: 163.0
CGImage: w: 639 h: 489
texture width scale: 3.0, height scale: 3.0
touched width: 639, image height: 489
touch location (on image): x 144, y: -110
r:232, g:217, b:203, a:255

Значения x и y уже масштабированы в соответствии с соотношением размеров cgImage и текстуры. Для любого данного устройства другой набор спрайтов возвращает 0 для всех значений RGBA (т. Е. Набор спрайтов, который не работает на iPhone 11 Pro, отличается от набора, который не работает на iPhone 11 Pro. Максимум). Это заставляет меня думать, что это как-то связано с разрешением / размером, но я не могу понять этого, поскольку масштабирование кажется правильным, и только некоторые спрайты не работают. Есть идеи, что может вызвать проблему?

...