[英]Detect collision between two objects in Swift
Swift 中的碰撞检测非常简单——但在这个特定项目中,身体碰撞并没有像往常一样触发didBeginContact
事件。
这是我的两个物体碰撞的清单(使用士兵和子弹):
SKPhysicsContactDelegate
添加到类中。self.physicsWorld.contactDelegate = self
let bulletCategory = 0x1 << 0
bulletCategory
(士兵设置为soldierCategory)。soldierCategory
(soldiers 设置为bulletCategory)。didBeginContact()
处理程序。下面是我的完整代码。 它是用于碰撞的最小约 20 行“Hello World”。
如果您创建一个新的“游戏”并将其复制粘贴到 GameScene.swift 中,它将运行,只是不会触发任何碰撞事件。
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) {
print("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 */
}
}
以下是您的清单中缺少的一些项目:
对于(2),您通过使用SKAction
随时间改变其位置来移动每个子弹。
对于 (3),每个子弹的位置从 (0, 0) 开始,而形状绘制在场景的顶部中心。 由于物理体以形状节点的位置为中心,因此形状和物理体的位置不匹配; 子弹的物理体永远不会与士兵接触。 要解决此问题,请尝试
var bullet = SKShapeNode(rectOfSize: CGSizeMake(10, 40))
bullet.position = CGPointMake(self.size.width/2.0, self.size.height)
此外,士兵的物理身体是其形状半径的一半。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.