Не удается заставить работать свойство centerRect SKSpriteNode

Это просто. Я установил centerRect моего спрайта, как описано в документации Apple, но отображаемое им изображение искажается (поскольку я не определил свойство centerRect). Мой код:

let sprite = SKSpriteNode()
sprite.texture = SKTexture(imageNamed: "ImageName")
sprite.centerRect = CGRect(x: 0.49, y: 0.49, width: 0.02, height: 0.02)
sprite.scale(to:CGSize(width: myCustomWidth, height: myCustomHeight))
//sprite.size = CGSize(width: myCustomWidth, height: myCustomHeight)

Я не знаю, где я сделал ошибку или чего-то не хватает в моем коде.

Вот как это выглядит

Это то, что я хочу

Заранее спасибо.


person Rube    schedule 14.10.2018    source источник


Ответы (2)


В зависимости от того, какая ширина и высота, контрагент должен искажаться. Центральная часть составляет всего 2% * 2% изображения и является основной частью масштабирования во время операций масштабирования.

Вы можете отобразить четыре угла без изменений, поэтому центральная часть может сильно исказиться, если масштабировать до (2X * 2X) исходного изображения, то есть от (0,02 * 0,02 -> 1,02 * 1,02), это более чем в 2500 раз искажение в центре изображения.

В вашем коде нет проблем.

Пока концепция верна. Если вы не можете получить то, что хотите, возможно, это размер вашего исходного изображения.

sprite.texture = SKTexture(imageNamed: "ImageName")
print (sprite.texture?.size()) // If size is very large here, then you cannot get what you want. The size of image should be small than target.  Actually only when you zoom in the texture, i.e, the current size is smaller than CGSize(width: myCustomWidth, height: myCustomHeight), you may get the result.

sprite.centerRect = CGRect(x: 0.49, y: 0.49, width: 0.02, height: 0.02)
sprite.scale(to:CGSize(width: myCustomWidth, height: myCustomHeight))
sprite.size = CGSize(width: myCustomWidth, height: myCustomHeight)

Последняя часть — мой тестовый код.

 class TestViewController: UIViewController{


        @IBOutlet weak var skview: SKView!

        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            let sprite1 = SKSpriteNode()
            sprite1.texture = SKTexture(imageNamed: "round.png")
            print (sprite1.texture?.size())
            sprite1.centerRect = CGRect(x: 0.49, y: 0.49, width: 0.02, height: 0.02)
            print (sprite1.size)
            sprite1.scale(to:CGSize(width: 300, height:100))
            sprite1.size = CGSize(width: 300, height: 100)
            print (sprite1)
            skview.scene?.addChild(sprite1)
        }}

введите здесь описание изображения

person E.Coms    schedule 14.10.2018
comment
Моя проблема в углах, которые искажены (извините, если я не ясно выразился). Изображение однотонное, поэтому искажения в центре не заметны. - person Rube; 14.10.2018
comment
В четырех углах не должно быть никаких изменений. Но одно измерение приближается к середине четырех сторон. Вы можете назвать это искажением. - person E.Coms; 14.10.2018
comment
Лучше покажите картинку. Чтобы люди могли знать, что такое искажение - person E.Coms; 14.10.2018
comment
То, что я получаю, похоже на образец изображения в документации разработчика Apple, поскольку centerRect не применялся, но изменил масштаб. Мое изображение представляет собой квадрат с закругленными углами. - person Rube; 14.10.2018
comment
Это должно быть так. Если оригинал круглой формы - person E.Coms; 15.10.2018
comment
Я думаю, ты меня неправильно понял - person Rube; 18.10.2018
comment
Я думаю, что нашел ваше ожидание и причину, почему это не то, что вы хотите. - person E.Coms; 18.10.2018
comment
Дело не в размере изображения, я его уменьшил, но без изменений. Несмотря на то, что это не сработало, я обнаружил, что должен использовать свойство масштаба вместо размера. - person Rube; 18.10.2018
comment
В моем случае, если мое изображение 1800x1800 пикселей, я получил тот же неверный результат. Затем я уменьшаю изображение до 60 х 60. Теперь все растягивается так, как вы хотите. - person E.Coms; 18.10.2018
comment
Мое первое изображение было 512 пикселей, и я уменьшил его до 28 пикселей, но без изменений. - person Rube; 18.10.2018
comment
myCustomWidth и myCustomHeight должны быть больше 28, может быть, 100. - person E.Coms; 18.10.2018
comment
Я добавил свой тестовый код. Дайте мне знать, если он все еще не работает. - person E.Coms; 18.10.2018

Наконец-то я нашел решение проблемы. На самом деле речь шла о том, как работает метод scale(to:) и свойство size.

Моя проблема заключалась в том, как myCustomWidth и myCustomHeight были определены из свойства размера. Эти значения принадлежат интервалу ((0,0),(0,0)) до ((1,1),(1,1)) поэтому я сказал компьютеру уменьшить изображение. Поэтому свойство centerRect нельзя было применить, так как изображение не было увеличено. Таким образом, со значениями, превышающими размер изображения в функции масштабирования, и установкой свойства фактического размера для получения желаемого размера на экране проблема была решена.

Теперь я объясню это подробно:

Свойство size изменяет размер вашего спрайта, искажая изображение, если вы не сохраняете ту же пропорцию между высотой и шириной.

Метод scale(to:) использует свойство centerRect для масштабирования узла. Если результат после применения масштабирования больше исходного изображения, он будет использовать centerRect для масштабирования без искажения углов. В противном случае он мог бы изменить размер спрайта без применения centerRect вообще!

Если ваше изображение больше, чем пространство, которое вы хотите покрыть спрайтом, вы можете сначала применить масштаб, а затем изменить размер (свойство размера), сохраняя пропорцию.

При возникновении любых сомнений (или исправлений) я буду рад помочь вам.

person Rube    schedule 19.12.2019