在我的应用程序(游戏)中我需要检测与水的接触并在我的节点在水下时运行动作(withKey),即时通过didBeginContact
和Update
方法执行此操作。但是当我使用didEndContact
从水中移动我的节点(带触摸)以检测Node是否在水中并且停止先前的操作(withKey)时它可能都很好但有时didEndContact
没有停止动作并且不检测(使用print("EndContact")
)联系结束。
节点之间的联系:
func didBeginContact(contact: SKPhysicsContact)
{
if let node1 = contact.bodyA.node
{
let entityNode = node1 as! Entity
entityNode.collideWith(contact.bodyB, contact: contact)
}
if let node2 = contact.bodyB.node
{
let entityNode = node2 as! Entity
entityNode.collideWith(contact.bodyA, contact: contact)
}
}
func didEndContact(contact: SKPhysicsContact)
{
if let node1 = contact.bodyA.node
{
let entityNode = node1 as! Entity
entityNode.collideEndedWith(contact.bodyB, contact: contact)
}
if let node2 = contact.bodyB.node
{
let entityNode = node2 as! Entity
entityNode.collideEndedWith(contact.bodyA, contact: contact)
}
}
Entity
是SKSpriteNode
的子类,其中我声明了物理位掩码等等。我根据Player
获得了Enemy
课程和Entity
课程。在我的Player
课程中,我获得了在didBeginContact
和didEndContact
触发
override func collideWith(body: SKPhysicsBody, contact: SKPhysicsContact)
{
if let enemy = body.node as? Enemy
{
contactingWater = true
self.runAction(SKAction.scaleBy(1.1, duration: 0.2), withKey: "action")
}
}
override func collideEndedWith(body: SKPhysicsBody, contact: SKPhysicsContact)
{
if let enemy = body.node as? Enemy
{
contactingWater = false
self.removeActionWithKey("action")
}
}
override func update(delta: CFTimeInterval){
}
我也更新了我的玩家' on' MainScene'在Update
方法中。它似乎工作正常,但正如我所说,有时候didEndContact
不会触发
override func update(currentTime: NSTimeInterval)
{
if lastUpdateTime > 0
{
dt = currentTime - lastUpdateTime
} else {
dt = 0
}
lastUpdateTime = currentTime
player?.update(dt)
}
我注意到这个"有时"发生 当我将Node移入水中时,当向后移动时,移开我的手指ith stil认为我与水接触。我很高兴任何消化,因为我非常新的编程)thx