我有一个Bullets和Enemies对象的数组。我希望游戏检查数组中的每个元素,看看两者之间是否有碰撞。如果发生任何碰撞,则伤害敌人并删除子弹。现在每次子弹击中敌人时,它都会降低阵列中所有敌人的健康,从而一次杀死所有敌人。我怎么能这样做,它只会减少我射击的敌人的健康状况?如何检测阵列中两个对象之间的碰撞(Sprite Kit)
//This function handles our collision detection
func didBegin(_ contact: SKPhysicsContact) {
//print("COLLISIONS!")
// If contact is with another object
if contact.bodyA.categoryBitMask == pickupCategory && contact.bodyB.categoryBitMask == playerCategory
{
displayText(text: "Picked up Pistol")
player.setHasPistol(gotPistol: true)
pistol.removeFromParent()
}
//Bullet hits an object
if contact.bodyA.categoryBitMask == objectCategory && contact.bodyB.categoryBitMask == bulletCategory
{
bulletCleanup(killNow: true)
//print("BULLET HAS HIT THE PIPE!")
}
//Do collisions between bullets and enemies...
for bullet in bulletList
{
for enemy in enemyList
{
//if the enemy was hit have them take damage.
if contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == bulletCategory
{
//deletes the bullet after hitting an object
bulletCleanup(killNow: true)
//apply damage
enemy.setHitPoints(setPoints: enemy.getHitPoints() - pistol.getDamage())
// print("BULLET HAS HIT THE enemy!!!!")
}
}
}
}
你可能也想问自己为什么你要保持子弹和敌人的阵列。您可能有一个非常真实的原因,但有其他方法来访问这些节点 - SKScene的children []属性和enumerateChildNodesWithName()函数来命名,但是2. –
嘿,人感谢您的回应!对此,我真的非常感激!现在我知道为什么我的碰撞只发生在一半的时间!然而,我仍然不理解这个部分,“你只需要从SKPhysicsContact对象中提取特定的敌人并对该特定的敌人施加伤害。”我怎么做,而不是迭代通过我的数组?在你的例子中,你有“enemy.setHitPoints(setPoints:enemy.getHitPoints() - pistol.getDamage())”。那么,我如何告诉函数“敌人”是什么或者我正在谈论哪一个。 –
@SamTrent SKOhysics联系人有2个属性 - bodyA和bodyB。这些是物理体,每一个都有一个属性“节点”,它是与该物理体相关的节点。因此,代码行'let enemy = contact.bodyA.categoryBitMask == enemyCategory? contact.bodyA ....'会创建一个与冲突中涉及的实际敌人相同的临时SKNode。 –