在我目前使用SpriteKit的项目中,我有一堆精灵需要在不同的时间独立地放大和缩小。问题是,当我缩放节点时,物理体并没有随之缩放,所以它搞砸了物理。下面是我为这个问题准备的一个小例子:
CGSize objectSize = CGSizeMake(100, 100);
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 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];

注意到蓝色的精灵(缩小了)坐在红色的上面,但你可以看出它的物理实体仍然有我告诉它的尺寸,但它没有缩放。
因此,很明显,缩小节点并不会缩小physicsBody。所以我的问题是,如果我必须手动完成,我该如何去做呢?
我试着在缩放时将身体换成合适的大小,但如果旧身体有关节,事情就会变得非常复杂,等等。如果我能以某种方式缩放现有的身体,那就简单多了。
发布于 2014-01-10 04:46:18
使用SKAction或更新循环,可以创建具有适当比例的新SKPhysicsBody并将其应用于对象。但是,通过这样做,您将失去速度。要解决此问题,可以执行以下操作:
SKPhysicsBody *newBody = [SKPhysicsBody bodyWithRectangleOfSize:boxObject.size];
newBody.velocity = boxObject.physicsBody.velocity;
boxObject.physicsBody = newBody;发布于 2013-10-17 07:00:35
物理身体形状不能缩放。当然不是在雪碧包内部使用的Box2D中。
除了内部优化,缩放一个物理体将具有深远的影响。例如,放大物体的形状可能会使物体陷入碰撞。它会影响关节的交互方式。它肯定会改变物体的密度或质量,从而改变它的行为。
您可以使用SKNode,在其中添加不带物理实体的精灵,然后添加具有给定大小的实体的附加SKNode。然后,可以在开始缩放精灵时启用或禁用实体。如果你选择了正确的时间,玩家不会注意到碰撞形状只是从全尺寸变成了半尺寸,而精灵却在动画中进行缩放转换。
不过,你必须根据它的大小来计算物体的密度,也许还有其他属性。
发布于 2017-03-26 11:30:06
对于其他阅读这个答案的人来说,我相信现在物理体可以与SKNode一起扩展。我使用的是Xcode 8.2.1和Swift 3.0.2。我开始一个新的项目,选择游戏,填写详细信息。更改2个文件:
GameViewController.swift (添加一行)
view.showsFPS = true
view.showsNodeCount = true
// add this to turn on Physics Edges
view.showsPhysics = true游戏Scene.swift (将sceneDidLoad())函数替换为:
override func sceneDidLoad() {
var found = false
self.enumerateChildNodes(withName: "testSprite") {
node, stop in
found = true
}
if !found {
let testSprite = SKSpriteNode(color: UIColor.white, size: CGSize(width: 200.0, height: 200.0))
testSprite.physicsBody = SKPhysicsBody(polygonFrom: CGPath(rect: CGRect(x: -100.0, y: -100.0, width: 200.0, height: 200.0), transform: nil))
testSprite.physicsBody?.affectedByGravity = false
testSprite.name = "testSprite"
let scaleAction = SKAction.repeatForever(SKAction.sequence([
SKAction.scale(to: 2.0, duration: 2.0),
SKAction.scale(to: 0.5, duration: 2.0)
]))
testSprite.run(scaleAction)
self.addChild(testSprite)
}
}物理边界使用精灵节点进行缩放。
https://stackoverflow.com/questions/19305653
复制相似问题