9

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];

ここに画像の説明を入力

青いスプライト (縮小された) が赤いスプライトの上に置かれていることに注意してください。ただし、その物理体は、私が伝えた寸法のままであり、スケーリングされていないことがわかります。

したがって、明らかに、ノードを縮小しても物理ボディは縮小されません。私の質問は、手動で行う必要がある場合、どうすればよいですか?

スケーリングの際に適当なサイズのボディに差し替えてみたのですが、古いボディに関節などがあると大変なことになってしまいます…。

4

6 に答える 6

7

または Update ループを使用して、適切なスケールでSKAction新しいSKPhysicsBodyを作成し、それをオブジェクトに適用できます。ただし、そうすると速度が落ちます。これを修正するには、次の手順を実行します。

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

boxObject.physicsBody = newBody;
于 2014-01-09T20:46:17.857 に答える
3

私はまったく同じ問題を抱えていました。スプライトキットのバグだと思います。

アクションを使用してスケーリングしてみてください。これはシーン全体で機能します。

[self runAction:[SKAction scaleTo:0.5 duration:0]];

私の元の質問

これはあなたがしたいことですか

- (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];
}

ここに画像の説明を入力

于 2013-10-10T20:33:55.467 に答える
1

物理体は SKNode の CGPath に依存します。何らかの方法で変更する必要があります。次のような方法で CGPath をスケーリングしてみてください。

//scale up

CGFloat scaleFactor = 1.1;
CGAffineTransform scaleTransform = CGAffineTransformIdentity;
scaleTransform = CGAffineTransformScale(scaleTransform, scaleFactor, scaleFactor);
CGPathRef scaledPathRef = CGPathCreateCopyByTransformingPath(exampleNode.path, &scaleTransform);
exampleNode.path = scaledPathRef;

ただし、これは既に SKScene にあるノードの外観を更新しないことに注意してください。CGPath のサイズ変更と、ノードをスケーリングする SKAction を組み合わせる必要がある場合があります。

于 2013-12-09T06:34:23.617 に答える