2017-02-23 1 views
2

Je fais un petit jeu, comme un oiseau flappy. Je n'ai aucune idée de pourquoi les objets ne "se voient" pas. J'ajoute un mur, un sol et un fantôme, et ce qui est assez étrange, Ghost détecte un sol, et vice versa, mais Wall est toujours invisible. Pourquoi? Un fantôme devrait s'arrêter sur un rectangle vertical (mur) et ne pas tomber sur le sol. enter image description hereLes objets de spritekit ne se détectent pas les uns les autres

struct PhysicsCatagory{ 
    static let Ghost : UInt32 = 0x1 << 1 
    static let Wall : UInt32 = 0x1 << 2 
    static let Ground : UInt32 = 0x1 << 3 
} 

class GameScene: SKScene{ 

    var Ground = SKSpriteNode() 
    var Ghost = SKSpriteNode() 
    var Wall = SKSpriteNode() 



    override func didMove(to view: SKView) { 

     /*******adding ground***/ 
     Ground = SKSpriteNode(imageNamed: "Ground") 
     Ground.setScale(0.7) 
     Ground.position = CGPoint(x: self.frame.midX, y: self.frame.minY) 

     Ground.physicsBody = SKPhysicsBody(rectangleOf: Ground.size) 
     Ground.physicsBody?.categoryBitMask = PhysicsCatagory.Ground 
     Ground.physicsBody?.collisionBitMask = PhysicsCatagory.Ghost 
     Ground.physicsBody?.contactTestBitMask = PhysicsCatagory.Ghost 
     Ground.physicsBody?.affectedByGravity = false 
     Ground.physicsBody?.isDynamic = false 
     Ground.zPosition = 3 
     self.addChild(Ground) 

     /*******adding wall (not working)****/ 
     Wall = SKSpriteNode(imageNamed: "Wall") 
     Wall.setScale(0.7) 
     Wall.position = CGPoint(x: self.frame.midX, y: self.frame.midY + 100) 

     Wall.physicsBody? = SKPhysicsBody(rectangleOf: Wall.size) 
     Wall.physicsBody?.categoryBitMask = PhysicsCatagory.Wall 
     Wall.physicsBody?.collisionBitMask = PhysicsCatagory.Ghost 
     Wall.physicsBody?.contactTestBitMask = PhysicsCatagory.Ghost 
     Wall.physicsBody?.affectedByGravity = false 
     Wall.physicsBody?.isDynamic = false 
     Wall.zPosition = 1 
     self.addChild(Wall) 


     /*******adding ghost***/ 
     Ghost = SKSpriteNode(imageNamed: "Ghost") 
     Ghost.size = CGSize(width: 90, height: 100) 
     Ghost.position = CGPoint(x: self.frame.midX, y: self.frame.maxY) 

     Ghost.physicsBody = SKPhysicsBody(circleOfRadius: 50) 
     Ghost.physicsBody?.categoryBitMask = PhysicsCatagory.Ghost 
     Ghost.physicsBody?.collisionBitMask = PhysicsCatagory.Wall | PhysicsCatagory.Ground 
     Ghost.physicsBody?.contactTestBitMask = PhysicsCatagory.Wall | PhysicsCatagory.Ground 
     Ghost.physicsBody?.affectedByGravity = true 
     Ghost.physicsBody?.isDynamic = true 
     Ghost.zPosition = 2 
     self.addChild(Ghost) 

    } 
+0

Pouvez-vous régler showPhysics sur true dans votre GameViewController, afin que les corps physiques soient affichés? –

+0

didin't aider :(mais en fait la physique est montré, mais seulement pour la terre et fantôme, pas pour le mur – belab

+0

Ensuite, je suppose que le mur n'a pas de corps physique, pour une raison étrange.Essayez de mettre une impression (" Le PB de Wall est \ (wall.physicsbody) ") après avoir défini le PB du mur, pour le confirmer –

Répondre

4

Jetez un oeil à ceci:

Wall.physicsBody? = SKPhysicsBody(rectangleOf: Wall.size) 

Notez la marque ici question. Il est utilisé pour spécifier optional chaining:

Enchaînement en option est un processus pour effectuer des requêtes et des propriétés d'appel, les méthodes et sur une option d'indices qui pourraient actuellement être nul. Si l'option facultative contient une valeur, la propriété, la méthode ou l'appel d'indice réussit; si l'option est nulle, la propriété, la méthode ou l'appel d'indice renvoie nil.

Maintenant, l'affectation fait également partie d'un chaînage optionnel. Donc, si une propriété est nulle, l'affectation échouera.

Dans votre cas, une propriété physicsBody est nulle, donc aucun code du côté droit de l'opérateur = n'est évalué.

Pour faire ce travail, faites ceci:

Wall.physicsBody = SKPhysicsBody(rectangleOf: Wall.size) 

Quelque chose sans rapport avec cela, mais une bonne chose à garder à l'esprit:

Si vous êtes intéressé par détection de contact entre deux corps Au moins un doit être dynamique. Je le signale parce que vos objets Wall et Ground sont statiques, ce qui signifie qu'aucun contact ne sera détecté entre eux, peu importe la façon dont vous définissez les masques de contact. Oh, et oui, utilisez la notation camelCase pour nommer les classes, les propriétés, et ainsi de suite.

+0

Bien repéré - j'ai manqué l'extra '?'. Mais j'avais raison sur le PB n'existe pas :-) –

+0

@Whirlwind merci beaucoup! J'ai probablement copié du code, et je n'ai pas remarqué ce point d'interrogation. – belab

+0

@Steve Ives yup, merci! – belab