Ios 使用SkPhysicsBody接触

Ios 使用SkPhysicsBody接触,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,下面是我的代码,这是一个游戏的一部分,现在有一些事情是错误的,当游戏进行。首先,子弹从英雄物理形状的底部射出,而不是从形状的中心射出。另一个原因是英雄和敌人之间的碰撞检测并不总是有效的,它会让英雄飞船做一些随机的事情。类别位掩码和接触位的哪一部分我有错 import UIKit import SpriteKit import CoreMotion class hero: SKSpriteNode { var width: CGFloat = 0.0 var height: CG

下面是我的代码,这是一个游戏的一部分,现在有一些事情是错误的,当游戏进行。首先,子弹从英雄物理形状的底部射出,而不是从形状的中心射出。另一个原因是英雄和敌人之间的碰撞检测并不总是有效的,它会让英雄飞船做一些随机的事情。类别位掩码和接触位的哪一部分我有错

import UIKit
import SpriteKit
import CoreMotion

class hero: SKSpriteNode {
    var width: CGFloat = 0.0
    var height: CGFloat = 0.0

    func createShip() {

        self.anchorPoint = CGPointMake(1.0, 0.5)
        self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)

        self.zPosition = 1.0
        self.physicsBody?.mass = 0.02
        self.physicsBody?.dynamic = true
        self.physicsBody?.affectedByGravity = false
        self.physicsBody?.categoryBitMask = ObjectCategory.collisionHeroCategory.rawValue
        self.physicsBody?.contactTestBitMask = ObjectCategory.sceneCategory.rawValue | ObjectCategory.collisionEnemyCategory.rawValue
        self.physicsBody?.collisionBitMask = ObjectCategory.sceneCategory.rawValue | ObjectCategory.collisionEnemyCategory.rawValue
        self.position = CGPointMake(width, height)

    }
}

class enemy:SKSpriteNode {

    func createEnemyShip(heroShipSize:CGSize,viewFrame:CGRect) -> SKSpriteNode{
        let enemyShip = SKSpriteNode(imageNamed: "enemyShip")
        enemyShip.position = CGPointMake(viewFrame.maxX + enemyShip.size.height, CGFloat(arc4random_uniform(UInt32(viewFrame.maxY) - UInt32(enemyShip.size.width))))
        enemyShip.name = "enemyShip"
        enemyShip.zPosition = 1.0
        enemyShip.anchorPoint = CGPointMake(0.5, 0.5)
        enemyShip.physicsBody = SKPhysicsBody(rectangleOfSize: heroShipSize)
        enemyShip.physicsBody?.mass = 5
        enemyShip.physicsBody?.dynamic = true
        enemyShip.physicsBody?.affectedByGravity = false
        enemyShip.physicsBody?.categoryBitMask = ObjectCategory.collisionEnemyCategory.rawValue
        enemyShip.physicsBody?.contactTestBitMask = ObjectCategory.collisionBulletCategory.rawValue | ObjectCategory.collisionHeroCategory.rawValue
        enemyShip.physicsBody?.collisionBitMask = ObjectCategory.collisionBulletCategory.rawValue | ObjectCategory.collisionHeroCategory.rawValue
        return enemyShip
    }
}

class bullet:SKSpriteNode{
    func createBullet(heroShipPosition:CGPoint) -> SKSpriteNode{
        let bullet = SKSpriteNode(imageNamed: "bullet")
        bullet.position = CGPointMake(heroShipPosition.x, heroShipPosition.y)
        bullet.zPosition = 1.0
        // Add physics body for collision detection
        bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.frame.size)
        bullet.physicsBody?.dynamic = true
        bullet.physicsBody?.affectedByGravity = false
        bullet.physicsBody?.categoryBitMask = ObjectCategory.collisionBulletCategory.rawValue
        bullet.physicsBody?.contactTestBitMask = ObjectCategory.collisionEnemyCategory.rawValue
        bullet.physicsBody?.collisionBitMask = ObjectCategory.collisionEnemyCategory.rawValue
        return bullet
    }
}

enum ObjectCategory:UInt32{
    case collisionBulletCategory  =  0
    case collisionHeroCategory =  1
    case sceneCategory =  2
    case collisionEnemyCategory =  3

}
下面是我的场景中的联系人功能

func didBeginContact(contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask == ObjectCategory.collisionBulletCategory.rawValue && contact.bodyB.categoryBitMask == ObjectCategory.collisionEnemyCategory.rawValue{
    score++
    }

    if contact.bodyB.categoryBitMask == ObjectCategory.collisionEnemyCategory.rawValue && contact.bodyA.categoryBitMask == ObjectCategory.collisionHeroCategory.rawValue{
        endGame()
    }
}

如果你在另一篇帖子上读过我的回答,我已经回答了你关于物理体接触的问题。它是从物理体的底部射出子弹,然后从我船的中心射出,我希望他们射出倾斜的物体。你的子弹是从你的锚点射出的,这是你的建议吗?当我回答你的其他问题时,你删除了这篇文章,所以我不得不评论这个老问题。这是一个重复的评论来回答一些问题:你的其他问题是bodyA永远不能保证是bullet,所以你需要考虑bodyA是bullet和bodyB是bullet的两种情况,你的类别必须是2的幂,这些是位掩码标志,所以3实际上意味着sceneCategory和CollisionHero,因为在二进制中,3是0011(因此有2个类别),但您需要将其二进制设置为0100,以给它一个唯一的类别。这在枚举上吗?