Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个对象之间的Swift/SpriteKit碰撞检测_Swift_Sprite Kit_Collision Detection_Collision_Skspritenode - Fatal编程技术网

多个对象之间的Swift/SpriteKit碰撞检测

多个对象之间的Swift/SpriteKit碰撞检测,swift,sprite-kit,collision-detection,collision,skspritenode,Swift,Sprite Kit,Collision Detection,Collision,Skspritenode,所以我有两个物体在碰撞时会失去生命点 func addPlayer(xPos: CGFloat, yPos: CGFloat){ playerNode = SKSpriteNode(imageNamed: "player") playerNode.physicsBody = SKPhysicsBody(circleOfRadius: width/2) playerNode.physicsBody!.affectedByGravity = false player

所以我有两个物体在碰撞时会失去生命点

func addPlayer(xPos: CGFloat, yPos: CGFloat){
    playerNode = SKSpriteNode(imageNamed: "player")

    playerNode.physicsBody = SKPhysicsBody(circleOfRadius: width/2)
    playerNode.physicsBody!.affectedByGravity = false
    playerNode.physicsBody!.categoryBitMask = PhysicsCategory.Player
    playerNode.physicsBody!.contactTestBitMask = PhysicsCategory.Wall | PhysicsCategory.Zombie
    playerNode.physicsBody!.collisionBitMask = PhysicsCategory.Wall | PhysicsCategory.Zombie
    playerNode.name = "Player"

    player = Player(node: playerNode, healthPoints: 100, attack: 10)
    playerNode.position.x = xPos
    playerNode.position.y = yPos
    playerNode.size = CGSize(width: width, height: width)
    addChild(playerNode)
}

func addZombie(xPos: CGFloat, yPos: CGFloat){

    zombieNode = SKSpriteNode(imageNamed: "zombie")

    zombieNode.physicsBody = SKPhysicsBody(circleOfRadius: width/2)
    zombieNode.physicsBody!.affectedByGravity = false
    zombieNode.physicsBody!.categoryBitMask = PhysicsCategory.Zombie
    zombieNode.physicsBody!.contactTestBitMask = PhysicsCategory.Zombie | PhysicsCategory.Player | PhysicsCategory.Wall
    zombieNode.physicsBody!.collisionBitMask = PhysicsCategory.Zombie | PhysicsCategory.Player | PhysicsCategory.Wall
    zombieNode.name = "Zombie"

    zombie = Zombie(node: zombieNode, healthPoints: 50, attack: 5)
    Zombies.append(zombie!)
    zombieNode.position.x = xPos
    zombieNode.position.y = yPos
    zombieNode.size = CGSize(width: width, height: width)
    addChild(zombieNode)
}
出现碰撞时,此功能将被激活:

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA.node as! SKSpriteNode
    let secondBody = contact.bodyB.node as! SKSpriteNode
    if(firstBody.name == "Player" && secondBody.name == "Zombie"){
        changeHealthPointsForZombieWithNode(secondBody, points: player!.attack)
    } else if(firstBody.name == "Zombie" && secondBody.name == "Player"){
        changeHealthPointsForPlayer(secondBody, points: zombie!.attack)
        print(player!.healthPoints)
    }
}

func changeHealthPointsForZombieWithNode(node: SKSpriteNode, points: Int) {
    for zombie in Zombies {
        if zombie.node == node {
            zombie.healthPoints -= points
            print(zombie.healthPoints)
            if(zombie.healthPoints <= 0){
                zombieNode.removeFromParent()
            }
            return
        }
    }
}

func changeHealthPointsForPlayer(node: SKSpriteNode, points: Int) {
    player!.healthPoints -= points
    if(player!.healthPoints <= 0){
        playerNode.removeFromParent()
        gameOver = true
    }
}
func-didBeginContact(联系人:skphysiccontact){
让firstBody=contact.bodyA.node为!SKSpriteNode
让secondBody=contact.bodyB.node作为!SKSpriteNode
if(firstBody.name==“Player”&&secondBody.name==“Zombie”){
将HealthPoints更改为ZombieWithNode(第二个主体,点数:player!.attack)
}else if(firstBody.name==“僵尸”&&secondBody.name==“玩家”){
changeHealthPointsForPlayer(第二个主体,点:僵尸!.attack)
打印(播放器!.healthPoints)
}
}
func ChangeHealthPoints for ZombieWithNode(节点:SKSpriteNode,点:Int){
僵尸中的僵尸{
如果zombie.node==节点{
zombie.healthPoints-=点数
打印(zombie.healthPoints)

如果(zombie.healthPoints请记住,contact参数中描述的两个物理实体不是按保证的顺序传递的。在
委托
函数中,没有“a是与B碰撞的一个,而不是另一个”。只有“a和B碰撞”.也就是说,根据您的游戏机制,您至少有两种选择:

  • 使玩家和僵尸在每次碰撞时互相造成伤害
  • 为玩家和僵尸创建一个
    SKSpriteNode
    的子类,其属性为
    isAttacking
    ,一个布尔值,用于确定实体在检测到与之接触时应何时造成伤害。对于玩家,此布尔值可能会被“激活”每按一次按钮/轻触按一次。对于僵尸,每隔一段时间,如果离玩家足够近的话

此外,您实施的方式将获得双倍的联系通知。
SpriteKit
将通过玩家联系掩码和僵尸类别掩码检测玩家是否与僵尸有联系,以及僵尸是否通过僵尸联系掩码和玩家类别掩码与玩家有联系。您通常会这样做不希望发生这种情况。你应该只让他们中的一个检测到它。我建议玩家。这样就不需要设置僵尸接触面具。只要你在玩家的接触面具和僵尸类别面具中设置僵尸,你就已经有了检测(和一次).

我有点困惑,我们是说如果玩家击中僵尸,僵尸会失去生命,如果僵尸击中玩家,玩家会失去生命,但玩家和僵尸绝不会同时碰撞?@Knight0fDragon为什么他们要同时碰撞?总有人不知怎的在碰撞。如果玩家是在僵尸中奔跑的人,那么僵尸应该会失去生命。如果僵尸是在玩家中运行的,那么玩家应该会失去生命。你需要像机器一样思考,我不认为精灵套件足够聪明来确定谁与谁相撞,只是它们都相撞了,所以你可能会错过呼叫,因为你用户将其视为玩家撞上了僵尸,但是代码将其视为僵尸命中玩家processing@Knight0fDragon这可能是因为碰撞和谁与谁碰撞存在一些问题,但这仍然不能解释问题。总有至少一个僵尸无法获得伤害,只是攻击玩家。所有其他僵尸都可以失去生命,但不会攻击玩家。这整个游戏是在绿足中预编的。在那里你无法清楚地看到谁攻击了谁,所以玩家在攻击时由于随机移动而失去了生命。如果你感兴趣,我可以给你我当前的项目来体验这个bug。我说的spritekit是对的,它不聪明,它无法知道谁在攻击谁,所以你是必须添加一个检查来确定谁是进行攻击的人。我如何知道超级僵尸是什么?我看不出有任何地方可以这样做。此外,您应该将僵尸设为SKSpriteNode的子类,然后您可以对节点变量进行elinate,并消除在每次检查中执行的可怕for循环