2016-04-13 2 views
1

Я создаю свою первую игру с комплектом спрайтов и недавно прочитал статью, в которой говорится, что для повышения производительности используется SKTextureAtlas.SpriteKit: Использование SKTextureAtlas вызывает неправильный физический корпус

Итак, я перенес все изображения спрайтов в упорядоченные папки .atlas и обновил код соответствующим образом. Тем не менее, теперь у моих спрайтов странные физические тела (в основном сверхразмерные).

Например, у моего игрового спрайта есть три состояния: Летающий (плоский), Полет и Полет вниз. Три изображения довольно похожи, с небольшими вариациями (стрелки, направленные вверх, вверх, вниз).

Прежде чем перейти на текстурные атласы, физическое тело было красивым пятном на изображении. Однако теперь он намного больше изображения и слегка растягивается по оси y.

Вот моя структура player.atlas файл:

игрок летящих-iphone.atlas:

Вот пример моего кода: (Player является подклассы SKSpriteNode)

let textureAtlas = SKTextureAtlas(named: "player-iphone") 
let playerFlyingTexture = textureAtlas.textureNamed("player-flying") 
let player = Player(texture: playerFlyingTexture, color: UIColor.clearColor(), size: CGSizeMake(100.0, 100.0)) 

let physicsBody = SKPhysicsBody(texture: playerFlyingTexture, size: CGSizeMake(100.0, 100.0)) 
physicsBody.dynamic = true 
physicsBody.affectedByGravity = true 
physicsBody.usesPreciseCollisionDetection = false 
physicsBody.categoryBitMask = CollisionCategories.Player 
physicsBody.contactTestBitMask = CollisionCategories.Enemy 
physicsBody.collisionBitMask = CollisionCategories.EdgeBody 
physicsBody.allowsRotation = false 
player.physicsBody = physicsBody 
+0

Хотя у вас уже есть ответ, я бы предложил использовать каталог активов Xcode для SKtextures. Начиная с Xcode 7 вы можете использовать каталог активов для текстурных изображений, и Apple фактически говорит, что это лучший способ сделать это. Поэтому я думаю, что эти статьи, которые говорят о папках .atlas, устарели. – crashoverride777

ответ

1

(Заслуга @Whirlwind за помощь)

Так что для меня, исправить заканчивал тем, что мне нужно изменить это:

let physicsBody = SKPhysicsBody(texture: self.texture, size: self.size) 

..разработать это ..

let physicsBody = SKPhysicsBody(texture: self.texture, alphaThreshold: 0.3, size: self.size) 

По-видимому, метод обрезки SKTextureAtlas, используемый при создании физического тела, имеет проблемы с выяснением того, что нужно обрезать, поэтому установка alphaThreshold явно затрудняла его.

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

1

Вы настраиваете размер текстуры следующим образом:

CGSize(widht:100, height:100)

которые, очевидно, не соответствуют размерам вашей текстуры.

Вместо этого используйте реальный размер текстуры:

yourTexture.size()

+0

Я обновил код, и теперь я получаю эту ошибку, когда пытается создать физическое тело: PhysicsBody: Не удалось создать физическое тело. – JimmyJammed

+0

@NitWitStudios Можете ли вы показать, какой код вы используете (обновленный код, который вызывает ошибку)? Кроме того, эта ошибка не так описательна. Не могли бы вы скопировать всю ошибку. – Whirlwind

+0

Вот и вся ошибка .. Вот обновленный код: let flyingTextureAtlas = SKTextureAtlas (названный: «player-flying-iphone») let texture = self.flyingTextureAtlas.textureNamed («player-flying») let player = Player (текстура: текстура, цвет: SKColor.clearColor(), размер: texture.size()) let physicalBody = SKPhysicsBody (текстура: текстура, размер: texture.size()) player.physicsBody = физикаBody – JimmyJammed

0

Эта проблема существует на iPad 3 (iOS 9.3.5 & xcode 8.1), и в моей ситуации alphaThreshold не решила проблему с неправильным PhysBody.

Мне пришлось переключиться на «Атлас нового спрайта» вместо «Texture Atlas», который волшебным образом устранил проблему.

Смежные вопросы