swift - didBegin(contact) 只被调用一次
问题描述
我正在制作一个游戏,并且我多次调用一个向场景添加节点的函数。
我需要知道节点是否接触到玩家。问题是该didBegin(contact)
方法仅在节点的第一个实例接触播放器节点时被调用,但在被调用的其他实例接触它时不会被调用。
这是我正在使用的代码:
class GameScene: SKScene, SKPhysicsContactDelegate {
let circlePlayer = SKSpriteNode(imageNamed: "Player")
self.physicsWorld.contactDelegate = self
circlePlayer.position = CGPoint(x: self.frame.midX, y:
self.frame.minY + circlePlayer.size.height * 3)
circlePlayer.zPosition = 2
//Physics for player
circlePlayer.physicsBody = SKPhysicsBody(circleOfRadius:
circlePlayer.size.height / 2)
circlePlayer.physicsBody?.categoryBitMask = PhysicsNumbering.player
circlePlayer.physicsBody?.contactTestBitMask =
PhysicsNumbering.star
//Star node is called multiple times
let star = SKAction.sequence([SKAction.run(starEmitter), SKAction.wait(forDuration: 3)])
}
这是星节点功能:
func starEmitter(){
let star = SKSpriteNode(imageNamed: "15")
//Physics World
star.physicsBody = SKPhysicsBody(circleOfRadius: star.size.height / 2)
star.physicsBody?.categoryBitMask = PhysicsNumbering.star
star.physicsBody?.contactTestBitMask = PhysicsNumbering.player
star.physicsBody?.affectedByGravity = false
star.physicsBody?.isDynamic = true
star.physicsBody?.collisionBitMask = 0
star.zPosition = 0
let tooMuch = self.frame.maxX
let point1 = UInt32(tooMuch)
star.position = CGPoint(x: CGFloat(arc4random_uniform(point1 * 2)) - CGFloat(point1) ,y: self.frame.maxY )
let move = SKAction.moveTo(y: self.frame.minY + 100, duration: 1.4)
let removeNode = SKAction.removeFromParent()
let sequence = SKAction.sequence([move,removeNode])
star.run(sequence)
addChild(star)
}
这是didBeginContact
方法:
func didBegin(_ contact: SKPhysicsContact) {
var BodyOne = SKPhysicsBody()
var BodyTwo = SKPhysicsBody()
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask{
BodyOne = contact.bodyA
BodyTwo = contact.bodyB
}
else{
BodyOne = contact.bodyB
BodyTwo = contact.bodyA
}
//------------------------------------
if BodyTwo.categoryBitMask == PhysicsNumbering.player && BodyOne.categoryBitMask == PhysicsNumbering.star{
let scaleUp = SKAction.scale(by: 1.3, duration: 0.5)
let fadeOut = SKAction.fadeOut(withDuration: 1)
let removeNode = SKAction.removeFromParent()
BodyOne.node?.removeAllActions()
let group = SKAction.group([scaleUp,fadeOut])
BodyOne.node?.run(SKAction.sequence([group,removeNode]))
print("star touched")
}
}
我试图在网上搜索它,但找不到可能发生这种情况的原因。有人可以告诉我我做错了什么吗?
先感谢您!
解决方案
推荐阅读
- java - 在 selenium java 上读取 text/javascript 中的 var
- html - asp.net mvc 5 表单帖子不起作用
- c - 如何在没有内存分配的情况下将指针从 CUDA 返回到 C?
- java - 在 IntelliJ 中使用 protobufs 构建 gradle 时出错
- xamarin.forms - 为什么我的 ListView 中只显示一项?
- r - 根据列名和行名替换矩阵元素
- javascript - 将父 URL 传递给 iframe 中的表单字段
- java - 动态报告 XLS、CSV
- javascript - Javascript 根据特定的类属性创建对象
- python - 分类中的目标变量是否需要数字编码?