SKPhysicsBody和[SKNode setScale:]

mpr*_*vat 8 ios7 sprite-kit

在我目前使用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];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意蓝色精灵(按比例缩小)如何位于红色精灵之上,但你可以告诉它的物理体仍然具有我告诉它的尺寸,并且它没有缩放.

很明显,缩小节点不会缩小物理体.所以我的问题是如果我必须手动完成它,我该怎么做呢?

我尝试在缩放时用一个合适的尺寸交换身体,但是如果旧的身体有关节等,那么事情会变得非常复杂......如果我能以某种方式扩展现有的身体,那就简单多了.

小智 7

使用SKAction或更新循环,您可以SKPhysicsBody使用适当的比例创建新的并将其应用于对象.但是,通过这样做,您将失去速度.要解决此问题,您可以执行以下操作:

SKPhysicsBody *newBody = [SKPhysicsBody bodyWithRectangleOfSize:boxObject.size];
newBody.velocity = boxObject.physicsBody.velocity;

boxObject.physicsBody = newBody;
Run Code Online (Sandbox Code Playgroud)


Lea*_*s2D 5

物理身体形状无法缩放.绝对不是Box2D内部使用的Sprite Kit.

除了内部优化之外,扩展物理机构也会产生深远的影响.例如,缩放身体的形状可能会使身体陷入碰撞.它会影响关节的相互作用.它肯定会改变身体的密度或质量,从而改变它的行为.

你可以使用一个SKNode,你没有物理主体添加精灵,然后添加额外的SKNode与给定大小的物体.然后,您可以在开始缩放精灵时启用或禁用实体.如果你正确计时,玩家将不会注意到碰撞形状只是从全尺寸变为半尺寸,而精灵会动画缩放过渡.

你必须根据它的大小来计算身体的密度和其他属性.


Chr*_*rri 5

对于阅读此答案的其他任何人,我相信现在物理体与 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
Run Code Online (Sandbox Code Playgroud)

Game 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

物理边界随精灵节点缩放。

  • 我也注意到了这一点:http://stackoverflow.com/a/33572073/3402095 (2认同)

Dog*_*fee 3

我遇到了完全相同的问题,我认为这是精灵套件中的错误。

尝试使用动作来缩放,这适用于整个场景。

[self runAction:[SKAction scaleTo:0.5 duration:0]];
Run Code Online (Sandbox Code Playgroud)

我原来的问题

这是你想要发生的吗

- (void) anthoertest
{
    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:n1.size];
    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:n2.size];
    n2.physicsBody.affectedByGravity = YES;
    [self addChild:n2];

    [self shrinkMe:n1];
}

- (void) shrinkMe:(SKSpriteNode *) s
{
    [s setScale:0.5];
    s.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:s.size];
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这不是一个错误。缩放在视图上起作用,但物理体的形状无法缩放。Box2D 不允许缩放形状,除非您删除并添加一个新的(缩放的)形状,这是相当低效的。缩放物理体将产生深远的影响,例如缩放物体的形状可能会使物体陷入碰撞。 (2认同)