我的场景中有两个节点。一个是球,一个是背景。两者都作为孩子添加到场景中。
当球被撞到墙上时,我正试图旋转球。
if (!firstNode.physicsBody.resting) {
//first node gets the reference of ball node
[firstNode runAction:[SKAction rotateToAngle:degToRad(5.0f) duration:1.0]];
}
调试器抛出错误:
SKScene:动画SKScene的旋转无效。
我不想轮换SKScene
。我正在尝试轮换SKSpriteNode
,但为什么我会收到错误?
令人惊讶的是,我为其他节点做了同样的事情,并没有给出任何错误。
SKAction *rotateAction = [SKAction rotateByAngle:degToRad(180.0f) duration:2.0];
[_ringNode runAction:[SKAction repeatActionForever:rotateAction]];
那为什么我的第一种情况会发生错误?
我使用didBeginContact
来检测节点之间的冲突:
并在此方法中:
-(void)didBeginContact:(SKPhysicsContact *)contact
{
SKSpriteNode * firstNode = (SKSpriteNode*)contact.bodyA.node;
SKSpriteNode * secondNode = (SKSpriteNode *)contact.bodyB.node;
}
此处第一个节点返回为SKScene
,但我尝试将其转换为SKSpriteNode
。不知何故,墙被视为SKScene
。所以我无法为第一个节点设置动画,因为它是SKScene
。
我可以设置secondNode
SKSpriteNOde
的动画。
答案 0 :(得分:1)
当检测SpriteKit中的接触和碰撞时,无法保证哪个对象将成为bodyA,哪个将成为bodyB。您应该使用我假设您已分配给他们的类别来确定什么是什么。
if (contact.bodyA.categoryBitMask == myBallCategoryBitMask) {
//Do Stuff to the ball
} else {
//first node is the wall so do something to the secondNode
}
答案 1 :(得分:1)
当你说“墙”时,你可能做过这样的事情:
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
self.physicsBody.categoryBitMask = WallCategory
在这里,self
是一个场景(可能是GameScene
),它是SKScene的子类...
来自physics body's node property的文档:
此主体连接的节点。 (只读)
在这种情况下,contact.bodyA.node
将为您提供场景,因为代表墙的物理体连接到场景(请记住场景是一个节点)。