【问题标题】:How may i detect contact and collision correctly? Swift iOS SKScene如何正确检测接触和碰撞? Swift iOS SKScene
【发布时间】:2014-10-22 03:40:51
【问题描述】:

问题是我无法以我在互联网上找到的任何方式检测到碰撞//或接触

这是我的代码:

我的面具声明:

private let ballCategory : UInt32 = 0x1 << 0
private let holeCategory : UInt32 = 0x1 << 1

洞和球的加法:

func addHole(#size : CGSize) {

    let actionMoveDown = SKAction.moveToY(CGRectGetMidY(self.frame)-500, duration: 4.7)
    let hole = shapedHoles()
    let UT = UTIL()
    var position:CGFloat


    let randomPosition = UT.randomNumberWith(Min: 1, Max: 3)

    switch randomPosition{
    case 1:
        position = CGRectGetMidX(self.frame)
    case 2:
        position = CGRectGetMidX(self.frame)+size.width

    default:
        position = CGRectGetMidX(self.frame)-(size.width)

    }



    var createdHole = hole.createHoleAtPosition(position: CGPointMake(position ,CGRectGetMaxY(self.frame) + (size.height/2)),size: size )//CGSizeMake(CGRectGetMaxX(self.frame)/3 - 10, 70)

    createdHole.physicsBody = SKPhysicsBody(rectangleOfSize: createdHole.frame.size)
    createdHole.physicsBody?.categoryBitMask = holeCategory
    createdHole.physicsBody?.collisionBitMask = 0
    createdHole.physicsBody?.contactTestBitMask = ballCategory
    createdHole.physicsBody?.affectedByGravity = false
    createdHole.physicsBody?.dynamic = false


    lastHolePosition = randomPosition

    createdHole .runAction(actionMoveDown)

    self.addChild(createdHole)



}

func addSphere(){
    let mainCharacterController = circle()
    let character: (SKNode) = mainCharacterController.createCircleAtPosition(position: CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame)+100))


    character.physicsBody = SKPhysicsBody(circleOfRadius: character.frame.size.height/2)
    character.physicsBody?.categoryBitMask = ballCategory
    character.physicsBody?.collisionBitMask = 0
    character.physicsBody?.contactTestBitMask = holeCategory
    character.physicsBody?.affectedByGravity = false
    character.physicsBody?.dynamic = false


    self.addChild(character)


}    func addHole(#size : CGSize) {

    let actionMoveDown = SKAction.moveToY(CGRectGetMidY(self.frame)-500, duration: 4.7)
    let hole = shapedHoles()
    let UT = UTIL()
    var position:CGFloat


    let randomPosition = UT.randomNumberWith(Min: 1, Max: 3)

    switch randomPosition{
    case 1:
        position = CGRectGetMidX(self.frame)
    case 2:
        position = CGRectGetMidX(self.frame)+size.width

    default:
        position = CGRectGetMidX(self.frame)-(size.width)

    }



    var createdHole = hole.createHoleAtPosition(position: CGPointMake(position ,CGRectGetMaxY(self.frame) + (size.height/2)),size: size )//CGSizeMake(CGRectGetMaxX(self.frame)/3 - 10, 70)

    createdHole.physicsBody = SKPhysicsBody(rectangleOfSize: createdHole.frame.size)
    createdHole.physicsBody?.categoryBitMask = holeCategory
    createdHole.physicsBody?.collisionBitMask = 0
    createdHole.physicsBody?.contactTestBitMask = ballCategory
    createdHole.physicsBody?.affectedByGravity = false
    createdHole.physicsBody?.dynamic = false


    lastHolePosition = randomPosition

    createdHole .runAction(actionMoveDown)

    self.addChild(createdHole)



}

func addSphere(){
    let mainCharacterController = circle()
    let character: (SKNode) = mainCharacterController.createCircleAtPosition(position: CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame)+100))


    character.physicsBody = SKPhysicsBody(circleOfRadius: character.frame.size.height/2)
    character.physicsBody?.categoryBitMask = ballCategory
    character.physicsBody?.collisionBitMask = 0
    character.physicsBody?.contactTestBitMask = holeCategory
    character.physicsBody?.affectedByGravity = false
    character.physicsBody?.dynamic = false


    self.addChild(character)


}

最后但并非最不重要的是 didBeginContactMethod

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody!
    var secondBody: SKPhysicsBody!

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    }
    else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if (firstBody.categoryBitMask & holeCategory) != 0 &&
        (secondBody.categoryBitMask & ballCategory) != 0 {
        println("HO")
    }
}

谢谢你,希望你知道发生了什么,如果你需要任何额外的代码,请评论它

【问题讨论】:

  • 请注意,当 collisionBitMask = 0 时,您只会收到联系回调,但身体会相互通过,即没有碰撞响应

标签: ios swift sprite-kit ios7.1 skscene


【解决方案1】:

您必须确保您使用的SKScene 子类也实现了SKPhysicsContactDelegate 协议。例如,它看起来像这样。

class MyScene : SKScene, SKPhysicsContactDelegate

然后你必须将你的物理世界联系人代理设置为你自己。

override init() {
    self.physicsWorld.contactDelegate = self;
}

告诉我这是怎么解决的,但它应该可以解决问题并成功地让您监听碰撞。

【讨论】:

    【解决方案2】:
    There is a couple things it might be. First you can try using an enum for the contact categories.
    
    enum collisionBodies:UInt32 {
        case ballCategory = 1
        case holeCategory = 2
    }
    
    func Collisions() {
       character.physicsBody.categoryBitMask = collisionBodies.ballCategory.rawValue
       character.physicsBody.contactTestBitMask = collisionBodies.holeCategory.rawValue
       character.physicsBody.collisionBitMask = 0
    
       createdHole.physicsBody.categoryBitMask = collisionBodies.holeCategory.rawValue
       createdHole.physicsBody.contactTestBitMask = collisionBodies.ballCategory.rawValue
       createdHole.physicsBody.collisionBitMask = 0
    }
    
    Also try setting one of your physics bodies to dynamic = true or collisions will likely not work.
    
    A better way to test for collisions in the didBeginContact function is to use a switch statement.
    
    func didBeginContact(contact: SKPhysicsContact) {
       let categoryMask = contact.BodyA.categoryBitMask | contact.BodyB.categoryBitMask
    
       switch (categoryMask) {
       case collisionBodies.holeCategory.rawValue | collisionBodies.ballCategory.rawValue:
            //code to run when contact is detected
       default:
         return
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多