У меня есть массив объектов Bullets and Enemies. Я хочу, чтобы игра проверяла каждый элемент в массивах, чтобы увидеть, произошло ли столкновение между ними или нет. Если было какое-либо столкновение, то повредите этого врага и удалите пулю. Прямо сейчас, каждый раз, когда пуля попадает в противника, она уменьшает здоровье ВСЕХ врагов в массиве, тем самым убивая их всех сразу. Как я могу сделать это так, чтобы он только уменьшал здоровье врага, на который я стреляю?Как обнаружить столкновение между двумя объектами в массиве (комплект Sprite)
//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!!!!")
}
}
}
}
Вы также можете спросить себя, почему вы держите массивы пуль и врагов. У вас может быть очень реальная причина, но есть и другие способы доступа к этим узлам - свойство children [] для SKScene и функции enumerateChildNodesWithName(), которые можно назвать, но 2. –
Эй, спасибо за ваш ответ! Я очень ценю это! Теперь я знаю, почему мои столкновения происходили только в половине случаев! Тем не менее, я до сих пор не понимаю эту часть: «Все, что вам нужно сделать, это извлечь конкретного противника из объекта SKPhysicsContact и нанести урон этому конкретному противнику». Как мне это сделать без итерации, хотя мой массив? В вашем примере у вас есть «enemy.setHitPoints» (setPoints: enemy.getHitPoints() - pistol.getDamage()) ». Итак, как мне сказать, что такое «враг» или что я говорю? –
@SamTrent Контакт SKOhysics имеет 2 свойства - bodyA и bodyB. Эти устройства SKOhysicsBodies и каждый из них имеют свойство «node», которое является узлом, связанным с этим физическим телом. Таким образом, строка fo code 'let враг = contact.bodyA.categoryBitMask == enemyCategory? contact.bodyA .... 'создает временный SKNode, равный фактическому врагу, участвующему в столкновении. –