在我目前使用SpriteKit的项目中,我有一堆精灵需要在不同时间独立地放大和缩小.问题在于,当我缩放节点时,物理体不会随之缩放,因此它会破坏物理学.这是我为了这个问题而放在一起的一个小例子:
CGSize objectSize = CGSizeMake(100,100); self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0,self.size.width,self.size.height)]; SKSpriteNode *n1 = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:objectSize]; n1.position = CGPointMake(self.size.width/2,2*self.size.height/3); n1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize]; n1.physicsBody.affectedByGravity = YES; [self addChild:n1]; SKSpriteNode *n2 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:objectSize]; n2.position = CGPointMake(self.size.width/2,self.size.height/3); n2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize]; n2.physicsBody.affectedByGravity = YES; [self addChild:n2]; [n1 setScale:0.5];
注意蓝色精灵(按比例缩小)如何位于红色精灵之上,但你可以告诉它的物理体仍然有我告诉它的尺寸,它没有缩放.
很明显,缩小节点不会缩小物理体.所以我的问题是如果我必须手动完成它,我该怎么做呢?
我尝试在缩放时用一个合适的尺寸交换身体,但是如果旧的身体有关节等,那么事情会变得非常复杂……如果我能以某种方式扩展现有的身体,那就简单多了.
解决方法
使用SKAction或Update循环,您可以使用适当的比例创建新的SKPhysicsBody并将其应用于对象.但是,通过这样做,您将失去速度.要解决此问题,您可以执行以下操作:
SKPhysicsBody *newBody = [SKPhysicsBody bodyWithRectangleOfSize:boxObject.size]; newBody.velocity = boxObject.physicsBody.velocity; boxObject.physicsBody = newBody;