iOS SpriteKit не в состоянии масштабировать правильно текстурированный SKSpriteNode - PullRequest
0 голосов
/ 17 октября 2018

Я пишу приложение для iOS, используя SpriteKit и Objective-C с Xcode 9.3 для iPhone 6 iOS 11.2.6.Есть несколько объектов SKSpriteNode, добавленных к SKScene в иерархии, которая в итоге должна отображать сетку из 4х4 элементов. Моя цель - чтобы все 16 выглядели одинаково .Мне нужна ваша помощь в достижении этой цели.

Все узлы SKSpriteNode текстурированы, для узлов внизу SKTexture создается во время выполнения из UIBezierPath, который работает нормально, другие узлы, расположенные сверху, будут загружать текстуруиз изображения .png и вот где у меня проблемы.

.png - это степень двух, изначально изображение размером 512 x 512 px с 24 битами, отображающее синий квадрат с некоторым эффектом скоса / тиснения.Я не использовал mip-карты и думал, что более крупная текстура должна быть правильно уменьшена / уменьшена при применении к узлу меньших размеров.

Вот пример .png:

enter image description here

Вот пример сетки 4 x 4.Вы также должны наблюдать, как край синего квадрата продолжает растеризоваться по-разному от квадрата к другому.Обратите внимание, что все элементы SKSpriteNode имеют точно такие же одинаковые размеры , после создания SKSpriteNode с текстурой мы применяем масштабирование с помощью scaleToSize , а режим фильтрации - SKTextureFilteringNearest .

enter image description here

Вот изображение в деталях, вы видите, как отличаются края, где они должны были быть одинаковыми: enter image description here

Соответствующий код, использованный для создания выше:

    SKTexture *tex = [SKTexture textureWithImageNamed:filename];
    tex.filteringMode = SKTextureFilteringNearest;

    SKSpriteNode *nd = [SKSpriteNode spriteNodeWithTexture:tex];
    [nd scaleToSize:parent.size];

    [parent addChild:nd]; 

Есть несколько способов сделать это изменение размера - уже пытались безуспешно:

1) [nd scaleToSize:parent.size];
2) [nd setSize:parent.size];
3) SKSpriteNode *nd = [SKSpriteNode spriteNodeWithTexture:tex size:parent.size];

Также пытались другие вещи, такие как:

  • , имеющие разные размеры в файле .png, продолжали подавать изображение размером 64 x 64 px в качестве текстуры, которая требует увеличения масштаба, но это не дало лучших результатов
  • имеющий родительский скнод целых размеров - пол или потолок до ближайшего

Что я узнал, так это то, что если я вообще не изменяю размер SKSpriteNode, и текстура применяетсяed в его родном размере, проблема исчезает .Однако это не удобно для моего приложения.

Здесь 128 x 128 px .png используется в качестве текстуры без дальнейшего масштабирования контейнера SKSpriteNode.Обратите внимание, что поля скопированы по всей доске:

enter image description here

И деталь:

enter image description here

Есть мысли?Спасибо!

...