2016-10-22 9 views
0

Я пытался выяснить, почему мой метод didBeginContact не работает. У меня треугольник, падающий с верхней части экрана на дно, и у меня есть линия внизу, которая, если она сталкивается с ней. Мой счет должен увеличиваться. Вот код, ответственный за это.Тесты на столкновение, не работающие в SpriteKit Swift 2

func createScene(){ 

    physicsWorld.contactDelegate = self 

    slider = SKSpriteNode(imageNamed: "Slider") 
    slider.setScale(0.20) 
    slider.position = CGPoint(x: self.frame.width/2, y: 0 + slider.frame.height/2) 


    slider.physicsBody = SKPhysicsBody(rectangleOfSize: slider.size) 
    slider.physicsBody?.categoryBitMask = PhysicsCatergory.slider 
    slider.physicsBody?.collisionBitMask = PhysicsCatergory.coin | PhysicsCatergory.greenTriangle | PhysicsCatergory.orangeHexagon | PhysicsCatergory.purpleOctagon | PhysicsCatergory.redSquare 
    slider.physicsBody?.contactTestBitMask = PhysicsCatergory.coin | PhysicsCatergory.greenTriangle | PhysicsCatergory.orangeHexagon | PhysicsCatergory.purpleOctagon | PhysicsCatergory.redSquare 
    slider.physicsBody?.affectedByGravity = false 
    slider.physicsBody?.dynamic = false 

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("SpawnShapes"), userInfo: nil, repeats: true) 
    self.addChild(slider) 


} 

func didBeginContact(contact: SKPhysicsContact) { 
    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 

    if firstBody.categoryBitMask == PhysicsCatergory.greenTriangle && secondBody.categoryBitMask == PhysicsCatergory.Score{ 
     score++ 
     print(score) 

    } 
    else if firstBody.categoryBitMask == PhysicsCatergory.Score && secondBody.categoryBitMask == PhysicsCatergory.greenTriangle{ 
     score++ 
     print(score) 
    } 



} 

override func didMoveToView(view: SKView) { 

     createScene() 
    invisibleBounderies() 


} 

func invisibleBounderies(){ 

    let scoreNode = SKSpriteNode() 
    scoreNode.size = CGSize(width: 5, height: 600) 
    scoreNode.position = CGPoint(x: self.frame.width/2, y: self.frame.height/10) 
    scoreNode.physicsBody = SKPhysicsBody(rectangleOfSize: scoreNode.size) 
    scoreNode.physicsBody?.affectedByGravity = false 
    scoreNode.physicsBody?.dynamic = false 
    scoreNode.physicsBody?.categoryBitMask = PhysicsCatergory.Score 
    scoreNode.physicsBody?.collisionBitMask = PhysicsCatergory.greenTriangle 
    scoreNode.physicsBody?.contactTestBitMask = PhysicsCatergory.greenTriangle 
    scoreNode.zRotation = CGFloat(M_PI/2.0) 
    scoreNode.color = SKColor.blueColor() 


    self.addChild(scoreNode) 



} 



func SpawnShapes(){ 

    greenTriangle = SKSpriteNode(imageNamed:"greenTriangle") 
    purpleOctagon = SKSpriteNode(imageNamed: "purpleOctagon") 
    redSquare = SKSpriteNode(imageNamed: "redSquare") 
    coin = SKSpriteNode(imageNamed: "coin") 

    greenTriangle.physicsBody = SKPhysicsBody(rectangleOfSize: greenTriangle.size) 
    greenTriangle.physicsBody?.categoryBitMask = 0 
    greenTriangle.physicsBody?.collisionBitMask = PhysicsCatergory.Score 
    greenTriangle.physicsBody?.contactTestBitMask = PhysicsCatergory.Score 
    greenTriangle.physicsBody?.affectedByGravity = false 
    greenTriangle.physicsBody?.dynamic = false 

    var MinValue = self.size.width/8 
    var MaxValue = self.size.width - 150 
    var SpawnPoint = UInt32(MaxValue - MinValue) 

    let action = SKAction.moveToY(-30, duration: 2.0) 


    slider.zPosition = 1 
    coin.zPosition = 2 
    greenTriangle.zPosition = 3 
    orangeHexagon.zPosition = 4 
    purpleOctagon.zPosition = 5 
    redSquare.zPosition = 6 



    greenTriangle.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height) 
    self.addChild(greenTriangle) 
    greenTriangle.runAction(SKAction.repeatActionForever(action)) 



} 

ответ

0

physicsBody с dynamic свойством false не могут быть вовлечены в столкновения; установить dynamic истина .

+0

за все, что связано с столкновениями? – cuber

+0

Я изменил динамические свойства 'greenTriangle' и' scoreNode' равными true, и оценка не увеличивается. и когда greenTriangle попадает в строку scoreNode, он отстает от него. – cuber

+0

@SteveIves, нединамические элементы могут иметь на них физические тесты, они просто не могут вызывать вызовы физики. – Knight0fDragon

1
  • Вам нужно установить только greenTriangledynamic свойство true.
  • Вы установили greenTriangle.physicsBody?.categoryBitMask = 0, поэтому вы не обнаруживаете контакт. greenTriangle.physicsBody?.categoryBitMask = PhysicsCatergory.greenTriangle может сделать трюк.

Если вы все еще не обнаруживаете контакт после этих изменений, проверьте, соответствует ли ваш physicsCatergory. Было бы хорошо, чтобы реализовать enum типа UInt32 где значения являются все единичные биты, или, как это, если вы предпочитаете:

enum PhysicsCatergory : UInt32{ 
    case slider = 1 
    case coin = 2 
    case greenTriangle = 4 
    case purpleOctagon = 8 
    case redSquare = 16 
    case orangeHexagon = 32 
    case Score = 64 
} 

Делать, как это потребует, чтобы добавить .rawValue в каждом обращении к одному из этих перечислений , Пример: greenTriangle.physicsBody?.categoryBitMask = PhysicsCatergory.greenTriangle.rawValue

Я знаю, что это не связано с вопросом, но я бы порекомендовал вам не использовать SKAction для движения в этом случае, потому что он будет игнорировать столкновение с физикой, поскольку вы «заставляете» его положение. Используйте свойство physicsBody.velocity, чтобы физика работала. Вы заметите, что при использовании позже блок столкнется с линией счета, так как вы также установили его collisionBitMask. Таким образом, вы можете правильно управлять тем, с чем сталкивается. Установите physicsBody.linearDamping на ноль, если вы не хотите, чтобы блок теряет скорость во время движения (трение воздуха).

+0

Спасибо за ответ, я хотел присвоить 'categoryBitMask' его' PhysicsCatergory', но я сделал ошибку, которую я не имел в виду. Я новичок в разработке игр, поэтому не знаю многого за дополнительные советы. Я добавлю изменения, которые вы предложили программе :) @Pietro Pepe – cuber

+0

и для объектов, которые я сделал это 'struct PhysicsCatergory { статический пусть слайдер: UInt32 = 0x1 << 1 статической пусть монета: UInt32 = 0x1 << 2 статических пусть greenTriangle: UInt32 = 0x1 << 3 статических пусть orangeHexagon: UInt32 = 0x1 << 4 статических пусть purpleOctagon: UInt32 = 0x1 << 5 статических пусть RedSquare: UInt32 = 0x1 << 6 статических пусть Стена: UInt32 = 0x1 << 7 статической пусть Оценка: UInt32 = 0x1 << 8 } ' – cuber

+0

Добро пожаловать, не стесняйтесь связывать мне любые другие проблемы, которые могут возникнуть у вас. Эта структура реализована в порядке. Удачи! –