我已经在这工作了大约一个星期了,我需要帮助。请弄清楚为什么这不起作用!
(P.S。我的GameScene中有SKPhysicsContactDelegate。另外,我的didMoveToView中有self.physicsWorld.contactDelegate = self
。)
这是我的代码:
这不在didMoveToView:
之外let squareGroup: UInt32 = 1
let obstacleGroup: UInt32 = 2
这是我的didMoveToView:
square.position = CGPointMake(self.size.width/2, self.size.height/1.5)
square.zPosition = 35
square.size = CGSize(width: 40, height: 40)
square.physicsBody = SKPhysicsBody(rectangleOfSize: square.size)
square.physicsBody?.affectedByGravity = false
square.physicsBody?.dynamic = true
square.physicsBody?.allowsRotation = false
square.physicsBody?.categoryBitMask = squareGroup
square.physicsBody?.collisionBitMask = obstacleGroup
square.physicsBody?.contactTestBitMask = obstacleGroup
square.name = "Square"
self.addChild(square)
这也在我的didMoveToView中:* AND:当方形和障碍物触摸时没有任何反应。它不打印联系或任何东西。
func didBeginContact(contact: SKPhysicsContact) {
print("contact")
let newScene = GameplayScene(size: self.size)
_ = SKTransition.fadeWithDuration(1)
self.view?.presentScene(newScene)
}
最后,这是我的障碍代码,它位于didMoveToView之外: 请注意:我现在只是尝试使用障碍物2来让它工作。
func addObstacles() {
let obstacle1 = SKSpriteNode(imageNamed: "Obstacle")
let obstacle2 = SKSpriteNode(imageNamed: "Obstacle")
obstacle1.xScale = 2
obstacle2.xScale = 2
func randInRange(range: Range<Int>) -> Int {
return Int(arc4random_uniform(UInt32(range.endIndex - range.startIndex))) + range.startIndex
}
let random = randInRange(205...470)
let moveDown1 = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
let repeatAction1 = SKAction.repeatActionForever(moveDown1)
let removeObstacle1 = SKAction.removeFromParent()
let moveAndRemove1 = SKAction.sequence([repeatAction1, removeObstacle1])
obstacle1.position = CGPointMake(CGFloat(random), self.frame.size.height * 2)
obstacle1.zPosition = 40
obstacle1.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle1.size)
obstacle1.physicsBody?.affectedByGravity = false
obstacle1.physicsBody?.dynamic = false
obstacle1.runAction(moveAndRemove1)
self.addChild(obstacle1)
let moveDown2 = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
let repeatAction2 = SKAction.repeatActionForever(moveDown2)
let removeObstacle2 = SKAction.removeFromParent()
let moveAndRemove2 = SKAction.sequence([repeatAction2, removeObstacle2])
obstacle2.position = CGPointMake(CGFloat(random) + 460, self.frame.size.height * 2)
obstacle2.zPosition = 40
obstacle2.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle2.size)
obstacle2.physicsBody?.affectedByGravity = false
obstacle2.physicsBody?.dynamic = false
obstacle2.physicsBody?.categoryBitMask = obstacleGroup
obstacle2.name = "Obstacle2"
obstacle2.runAction(moveAndRemove2)
self.addChild(obstacle2)
}
func repeatObstacles() {
let generateObstacles = SKAction.sequence([SKAction.runBlock(self.addObstacles), SKAction.waitForDuration(1.3)])
let endlessAction = SKAction.repeatActionForever(generateObstacles)
runAction(endlessAction)
}
我已经坚持了一段时间了。如果您需要更多信息,请问我!我需要帮助。
答案 0 :(得分:2)
categoryBitMask
应该像这样定义:
let squareGroup: UInt32 = 0x1 << 1
let obstacleGroup: UInt32 = 0x1 << 2
还定义障碍collisionBitMask
obstacle2.physicsBody?.collisionBitMask = obstacleGroup
你的障碍contactTestBitMask
obstacle2.physicsBody?.contactTestBitMask = squareGroup
检查联系方式:
func didBeginContact(contact: SKPhysicsContact) {
if ((contact.bodyA.categoryBitMask == squareGroup && contact.bodyB.categoryBitMask == obstacleGroup) ||
(contact.bodyA.categoryBitMask == obstacleGroup && contact.bodyB.categoryBitMask == squareGroup)) {
// Handle Contact
}
}
答案 1 :(得分:1)
首先:将您的联系人代码更改为
func didBeginContact(contact: SKPhysicsContact) {
print("contact")
if ((contact.bodyA.categoryBitMask == squareGroup && contact.bodyB.categoryBitMask == obstacleGroup) ||
(contact.bodyA.categoryBitMask == obstacleGroup && contact.bodyB.categoryBitMask == squareGroup)) {
NSNotificationCenter.defaultCenter().postNotificationName("Gameover",object:nil,userInfo:nil);
}
}
在当前场景中分配一个新场景是不好的做法,这是你应该告诉视图要做的事情。在这里开始与我聊天,我将在你的视图中讨论如何设置它,因为这不是当前答案的一部分。有更好的方法来处理这个问题,发布通知是让您开始传达视图的最简单方法,让我们开始工作,然后您可以研究如何创建代理。
其次,将接触和碰撞组添加到障碍物2对象:
obstacle2.physicsBody?.collisionBitMask = obstacleGroup
obstacle2.physicsBody?.contactTestBitMask = squareGroup
正如@Darvydas指出的那样
第三,将障碍物2动态切换为true,因为您希望它与其他项目进行交互:
obstacle2.physicsBody?.dynamic = false
现在你应该进入didBeginContact方法,在print("contact")
上放一个断点,看看你是否进入那里。
第四,从didMoveToView中取出didBeginContact
函数,否则永远不会被调用。 (如果我们在问题中正确看到了这段代码,它就会被解决了)