2017-02-23 5 views
2

Я делаю маленькую игру, похожую на птицу. Я понятия не имею, почему объекты не «видят» самих себя. Я добавляю «Стена», «Земля» и «Призрак», и что довольно странно, «Привидение» обнаруживает Землю, и наоборот, но «Стена» по-прежнему остается невидимой. Зачем?объекты spritekit не обнаруживают друг друга

призрак должен остановиться на вертикальном прямоугольнике (стене), а не падать на землю. enter image description here

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

Можете ли вы установить showPhysics на истинный n ваш GameViewController, чтобы отображались физические тела? –

+0

didin't help :(но на самом деле физика показана, но только для земли и призрак, а не для стены. – belab

+0

Тогда я предполагаю, что стена не имеет физического тела, по какой-то странной причине. Попробуйте положить печать (" Wall's PB is \ (wall.physicsbody) ") где-то после того, как вы установили PB на стене, чтобы подтвердить это. –

ответ

4

Взгляните на это:

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

Обратите внимание на знак вопроса здесь. Он используется для указания optional chaining:

Дополнительное сцепление представляет собой процесс для запроса и вызова свойств, методов и подстрочный на факультативной, которые могут быть в настоящее время равна нулю. Если необязательное значение содержит значение, выполняется вызов свойства, метода или индекса. если необязательный параметр равен нулю, свойство, метод или вызов subscript возвращает nil.

Теперь назначение является частью дополнительной цепочки. Поэтому, если свойство равно нулю, назначение не удастся.

В вашем случае свойство physicalBody равно нулю, поэтому ни один из кода в правой части оператора = не вычисляется.

Чтобы сделать эту работу, сделайте следующее:

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

что-то не связанное с этим, но хорошая вещь, чтобы иметь в виду:

Если вы заинтересованы в обнаружении контакта между двумя телами , по крайней мере, один должен быть динамическим. Я указываю на это, потому что ваши объекты Wall и Ground являются статическими, что означает, что между ними не будет обнаружено никаких контактов независимо от того, как вы устанавливаете маски контактов.

О, да, используйте обозначения camelCase для классов, свойств и т. Д.

+0

Хорошо заметили - я пропустил добавочное «?». Но я был прав в отношении PB, который не существует :-) –

+0

@Whirlwind благодарю вас! Вероятно, я скопировал какой-то код и не заметил этого вопросительного знака. – belab

+0

@Steve Ives yup, спасибо! – belab

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