Обнаружение столкновений довольно просто в Swift - но в этом конкретном проекте, столкновение тела не вызывает событие didBeginContact
, как обычно.Обнаружение столкновения между двумя объектами в Swift
Вот мой список для двух тел, сталкивающихся (с помощью солдат и пули):
- Добавить
SKPhysicsContactDelegate
к классу. - установить физический мир соответственно, обычно:
self.physicsWorld.contactDelegate = self
- Создайте категории для каждой группы узлов, которые у вас будут. Например.
let bulletCategory = 0x1 << 0
- Создайте SKNodes для каждой пули и солдата.
- Дайте каждой пуле и солдату физическое тело с соответствующей формой.
- Установите каждую категорию Bullet categoryBitMask на
bulletCategory
(солдаты настроены на солдатскую категорию). - Установите каждую контактную карту пули на
soldierCategory
(солдаты настроены на bulletCategory). - Определить
didBeginContact()
обработчик.
Ниже приводится мой полный код. Это минимальная ~ 20 строк «Hello World» для столкновения.
Если вы создадите новую «Игру» и скопируйте ее в GameScene.swift, она будет запущена, только никакие события столкновения не будут запущены.
//
// GameScene.swift
// Thesoldier
//
// Created by Donald Pinkus on 12/19/14.
// Copyright (c) 2014 Don Pinkus. All rights reserved.
//
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
var soldier = SKShapeNode(circleOfRadius: 40)
let soldierCategory:UInt32 = 0x1 << 0;
let bulletCategory:UInt32 = 0x1 << 1;
override func didMoveToView(view: SKView) {
self.physicsWorld.contactDelegate = self
// THE soldier
soldier.fillColor = SKColor.redColor()
soldier.position = CGPoint(x: CGRectGetMidX(self.frame), y: 40)
soldier.physicsBody = SKPhysicsBody(circleOfRadius: 20)
soldier.physicsBody!.dynamic = false
soldier.physicsBody!.categoryBitMask = soldierCategory
soldier.physicsBody!.contactTestBitMask = bulletCategory
soldier.physicsBody!.collisionBitMask = 0
// bulletS
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("makeBullet"), userInfo: nil, repeats: true)
self.addChild(soldier)
}
func makeBullet() {
var bullet = SKShapeNode(rect: CGRect(x: CGRectGetMidX(self.frame), y: self.frame.height, width: 10, height: 40), cornerRadius: CGFloat(0))
bullet.fillColor = SKColor.redColor()
bullet.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 10, height: 40))
bullet.physicsBody?.dynamic = false
bullet.physicsBody?.categoryBitMask = bulletCategory
bullet.physicsBody?.contactTestBitMask = soldierCategory
bullet.physicsBody?.collisionBitMask = soldierCategory
var movebullet = SKAction.moveByX(0, y: CGFloat(-400), duration: 1)
var movebulletForever = SKAction.repeatActionForever(movebullet)
bullet.runAction(movebulletForever)
self.addChild(bullet)
}
func didBeginContact(contact: SKPhysicsContact) {
println("CONTACT")
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}
Подождите секунду. Если физическое устройство не является «динамическим», оно не может столкнуться ни с чем? –