在Xcode Spritekit中缩放物理实体

4

我最近遇到了一个问题:我想扩大一个节点的大小,但是物理体仍然保持原来的大小。我试图寻找解决方案,但没有成功。那么我该怎样才能使物理体与节点的大小同步扩大呢?

CGPoint location = CGPointMake(randX, -self.frame.size.height - expander.size.height);

SKAction *moveAction = [SKAction moveTo:location duration:randDuration];

SKAction *expandAction = [SKAction resizeToWidth:(expander.size.width * 1.4) height:(expander.size.width * 1.4) duration:1.0];

SKAction *collapseAction = [SKAction resizeToWidth:(expander.size.width) height: (expander.size.height) duration:1.0];

SKAction *doneAction = [SKAction runBlock:(dispatch_block_t)^() {
    expander.hidden = YES;
}];

SKAction *expandCollapseAction = [SKAction repeatActionForever:[SKAction sequence:@[expandAction, collapseAction]]];

SKAction *moveExpandAction = [SKAction group:@[moveAction, expandCollapseAction]];

SKAction *moveExpanderActionWithDone = [SKAction sequence: @[moveExpandAction, doneAction ]];
[expander runAction:moveExpanderActionWithDone withKey: @"expanderMoving"];

2
简短回答:你不能,物理形状不会缩放。更长的回答是:在缩放期间,您必须每帧重新创建身体,并使用连续更新和适当缩放的身体形状。然而,这种方法效率非常低下。不过,我不确定iOS 8是否可以,可能在那里可以工作,至少我模糊地记得与缩放物理体有关的某些内容。 - CodeSmile
@LearnCocos2D 这完全出乎意料,因为我记得这没起作用。但是我现在尝试了一下,看起来好像可以了。你能否请检查我的答案并给出你的想法? - Whirlwind
2个回答

5

我以为这个方法不会奏效,但似乎物理引擎确实可以缩放。以下是代码示例,可在iOS8上重现物理引擎的缩放:

- (void)didMoveToView:(SKView *)view {
  /* Setup your scene here */

    SKSpriteNode *s = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(100,100)];
    s.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame)+100);
    s.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:s.size];

    s.physicsBody.dynamic = YES;
    
    s.physicsBody.affectedByGravity = NO;

    [self addChild:s];
    
    [s runAction:[SKAction scaleTo:0.3f duration:5]];

    [s.physicsBody applyImpulse:CGVectorMake(0,30)];
  
}

如果我没记错的话,这之前是不起作用的,但我刚试了一下,看起来它工作了。不过,这还没有经过完全测试,我不确定这是否会破坏物理模拟。但是,接触检测可能会起作用。我只是想展示当精灵缩放时,实际的物理体也会被缩放。以下是结果:scaling physics body从上面的gif中可以看出,物理体随着精灵一起缩放(而无需重新创建另一个不同大小的物理体)。蓝色边框围绕精灵是精灵物理体的视觉表示(在视图控制器中使用skView.showsPhysics = YES启用);

1
如果一个物理体可以与其节点一起缩放,我想知道苹果是否会让我们独立地缩放物理体而不改变其精灵节点的大小。 - peacetype
@peacetype 没有尝试过,但我非常肯定目前在SKPhysicsBody类上没有类似的方法或属性。 - Whirlwind
2
没错,我现在正在查看文档,但没有相关内容。我已向苹果提交了一份报告请求添加该功能。 - peacetype

-1

这很奇怪,您可以在将物理体添加到SKNode或SKScene之前先添加它。

SKTexture  *texture=[_gameTexture textureNamed:@"mysprite"];
SKSpriteNode *bubble=[SKSpriteNode spriteNodeWithTexture:texture];
bubble.anchorPoint=CGPointMake(0.5,0.5);
//_bubble.name=[@"bubble" stringByAppendingFormat:@"%d ",index];
bubble.name=newcolor;

// _bubble.userInteractionEnabled=YES; _bubble.position=CGPointMake(newPosition.x, newPosition.y);

// _bubble.userInteractionEnabled=YES; _bubble.position=CGPointMake(newPosition.x, newPosition.y);

//
bubble.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:60];
bubble.physicsBody.dynamic=NO;
bubble.physicsBody.linearDamping=0;
bubble.physicsBody.restitution=0;


bubble.physicsBody.density=1;
bubble.physicsBody.allowsRotation=NO;
bubble.physicsBody.affectedByGravity=NO;
//_bubble.physicsBody.velocity=CGVectorMake([self getRandomNumberBetween:-10 to:7], [self getRandomNumberBetween:-10 to:7]);
//  _bubble.physicsBody.usesPreciseCollisionDetection=YES;


bubble.physicsBody.categoryBitMask=ballCategory;
bubble.physicsBody.collisionBitMask=ballCategory | pathCategory ;
bubble.physicsBody.contactTestBitMask=ballCategory | pathCategory ;

[self addChild:_bubble];


bubble.xScale=_bubble.yScale=2;
bubble.alpha=0.5;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接