2016-04-13 17 views
1

Ich baue mein erstes Sprite-Kit-Spiel und habe kürzlich einen Artikel gelesen, der SektextureAtlas verwendet, um die Leistung zu verbessern.SpriteKit: Die Verwendung von SKTextureAtlas verursacht einen fehlerhaften Physikkörper

Also habe ich alle meine Sprite-Bilder in organisierte .atlas Ordner migriert und den Code entsprechend aktualisiert. Aber jetzt haben meine Sprites seltsame Physik Körper (hauptsächlich über-vergrößert).

Zum Beispiel hat mein Spieler Sprite drei Zustände: Fliegen (flach), fliegende und fliegende. Die drei Bilder sind ziemlich ähnlich, mit leichten Variationen (Arme zeigen flach, oben, unten).

Vor der Migration zu Textur Atlanten, war der Physikkörper ziemlich genau mit dem Bild. Jetzt ist es jedoch viel größer als das Bild und leicht gestreckt auf der y-Achse.

Hier ist meine player.atlas Dateistruktur:

Spieler-Fliegen-iphone.atlas:

Hier ist ein Beispiel von meinem Code: (Player ist ein subclassed 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

Obwohl Sie bereits eine Antwort erhalten haben, würde ich vorschlagen, Xcode Asset-Katalog für SKtextures zu verwenden. Ab Xcode 7 können Sie den Asset-Katalog für Texturbilder verwenden und Apple sagt sogar, dass dies der beste Weg ist. Ich denke daher, dass diese Artikel, die über Atlas-Ordner sprechen, veraltet sind. – crashoverride777

Antwort

1

(Kredit geht für die Hilfe @Whirlwind) für mich

So endete die fix up ist, dass ich ändern müssen dies:

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

..um dieses ..

Offensichtlich hat die SKTextureAtlas-Methode, die beim Erzeugen eines Physikkörpers verwendet wird, Probleme, herauszufinden, was genau zuzuschneiden ist. Daher schien das Einstellen des AlphaThreshold explizit zu funktionieren.

Offensichtlich hängt dieser Wert von Ihrem eigenen Bild ab und welche Art von Transparenz Sie haben. Aber wenn Sie harte Kanten wie ich haben, sollten Sie in der Lage sein, dies auf einen beliebigen Wert einzustellen und gut zu gehen.

1

Sie stellen Ihre Texturgröße wie folgt ein:

CGSize(widht:100, height:100)

die offensichtlich nicht die richtigen Dimensionen Ihrer Textur sind.

Statt die reale Texturgröße verwenden:

yourTexture.size()

+0

Ich habe den Code aktualisiert, und jetzt bekomme ich diesen Fehler, wenn es versucht, den Physikkörper zu erstellen: PhysicsBody: Konnte Physikkörper nicht schaffen. – JimmyJammed

+0

@NitWitStudios Können Sie zeigen, welchen Code Sie verwenden (der aktualisierte Code, der den Fehler erzeugt)? Dieser Fehler ist auch nicht so beschreibend. Kannst du bitte den ganzen Fehler kopieren? – Whirlwind

+0

, dass der ganze Fehler ist .. Hier ist der aktualisierte Code: flyingTextureAtlas = SKTextureAtlas lassen (mit dem Namen: "Spieler-Fliegen-iPhone") lassen Textur = self.flyingTextureAtlas.textureNamed ("Spieler-Fliegen") let Spieler = Player (Textur: Textur, Farbe: SKColor.clearColor(), size: texture.size()) lassen physicsBody = SKPhysicsBody (Textur: Textur, Größe: texture.size()) player.physicsBody = PhysikBody – JimmyJammed

0

Dieses Problem besteht auf dem iPad 3 (iOS 9.3.5 & Xcode 8.1) und in meiner Situation, alphaThreshold hat das Problem mit falschen PhysicsBody nicht lösen.

Ich musste zu "New Sprite Atlas" statt "Textur Atlas" wechseln, was das Problem magisch behoben.