gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:55:01 25 4
gpt4 key购买 nike

所以我有两个物体在碰撞时应该失去生命值。

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
}
}

我想根据玩家的攻击和其他方式减去僵尸的生命值。当玩家击中僵尸时,僵尸会失去生命值。当僵尸击中玩家时,玩家应该失去生命值。每个玩家/僵尸都有生命值和攻击值。问题是有些僵尸是可杀死的并会失去生命值,而其他僵尸(通常是 1-3 个)则无法失去生命值。这些无法失去生命值的僵尸是唯一能够杀死玩家的僵尸。失去生命值的僵尸无法造成伤害(为什么?)?所以他们只能做一件事(攻击或失去生命值),尽管他们应该能够做两件事(攻击和失去生命值)。

最佳答案

请记住,接触参数中描述的两个物理体并不是按保证的顺序传递的。在 delegate 函数内部,不存在“A 是与 B 碰撞的那个,而不是相反”这样的事情。只有“A和B正在碰撞”。也就是说,您至少有两个选择,具体取决于您的游戏机制:

  • 让玩家和僵尸每次碰撞时都会互相造成伤害。
  • 为玩家和僵尸创建一个带有属性 isAttackingSKSpriteNode 子类,这是一个 bool 值,用于确定实体在检测到与其接触时何时应造成伤害。对于玩家来说,这个 bool 值可能会在每次按下按钮/点击时被“激活”。对于僵尸来说,每隔一段时间,如果距离玩家足够近的话。

此外,您实现的方式将收到双倍的联系人通知。 SpriteKit 将通过玩家接触掩码和僵尸类别掩码检测玩家与僵尸接触,并通过僵尸接触掩码和玩家类别检测僵尸与玩家接触面具。您通常不希望这种情况发生。您应该只让其中一个检测到它。我会推荐播放器。这样就不需要设置僵尸接触蒙版。只要您在玩家的接触掩码和僵尸的类别掩码中设置僵尸,您就已经进行了检测(并且一次)。

关于Swift/SpriteKit 许多对象之间的碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com