在精灵图像中移动 SKPhysicsBody

Moving an SKPhysicsBody inside a sprite image

我有一只鸟 class 在 MyScene(主游戏场景)中调用。这只鸟是随机移动的 NPC。它有一个向左看的图像,当它向右飞行时,该图像会水平翻转。它没有向上或向下飞行的图像。与整个 body 相比,鸟 class 有一个圆形且非常小的 SKPhysicsBody。这是因为稍后我想使用 SKPhysicsJointPin 将其他小的 SKPhysicsBodies 附加到它上面——它们将是小蠕虫。我将鸟的 SKPhysicsBody 制作成喙的粗略大小(使其保持圆形)并将其放置在图像上绘制喙的位置。我是这样做的:

minDiam = MIN(self.size.width, self.size.height);
minDiam = MAX(minDiam - 16, 4);
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:minDiam/3.0 center:CGPointMake(-9, -2)];

在我的 MyScene class 中,在游戏过程中,当鸟向右飞行时,我试图改变 physicsBody 的位置,当鸟的左脸图像翻转到右侧时。当鸟再次向左飞时,还要将其改回 CGPointMake(-9, -2) 。 physicsBody 的坐标不只是从 CGPointMake(-9, -2) 变为 CGPointMake(9, 2),但实际上 move/shift 可能像 [SKAction moveToX:9 ] duration:0.01]。以后我有一个游戏开发的原因。我无法做到这一点。请帮忙。

编辑:鸟 class 被 function/method 调用,就像在 MyScene 中一样:

-(void)addBirdy
{
    _birdy = [Birdy node];
    _birdy.position = CGPointMake(self.size.width/2, self.size.height/2);
    [self addChild:_birdy];
}

编辑 2:这是朝向代码:

if (_birdy.physicsBody.velocity.dx < fX)
{
    BIRDYASFacingDirection facingDir = _birdy.facingDirection;
    facingDir = BIRDYfacingRight;
    _birdy.facingDirection = facingDir;
    //PhysicsBody movement to the right.
    self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:/*HOW TO RETAIN ORIGINAL VALUE?*/ center:/*HOW TO MOVE TO CGPointMake(9, 2)*/];
 }
 else
 {
     BIRDYASFacingDirection facingDir = _birdy.facingDirection;
     facingDir = BIRDYfacingLeft;
     _birdy.facingDirection = facingDir;
     //PhysicsBody movement back to the left.
     self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:/*HOW TO RETAIN ORIGINAL VALUE?*/ center:/*HOW TO MOVE TO CGPointMake(-9, -2)*/];
 }

PhysicsBody 没有位置 属性 所以它不能像节点一样移动。您可以通过使用块来模拟运动来消除当前的 physicsBody 并逐步或一次性创建一个新的。

SKAction *wait0 = [SKAction waitForDuration:0.5]; // set to whatever time required

SKAction *block0 = [SKAction runBlock:^{
    myNode.physicsBody = nil;
    myNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(10, 10) center:CGPointMake(0, 0)];
    // complete physicsBody setup
}];

SKAction *block1 = [SKAction runBlock:^{
    myNode.physicsBody = nil;
    myNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(10, 10) center:CGPointMake(2, 0)];
    // complete physicsBody setup
}];
[self runAction:[SKAction sequence:@[wait0, block0, wait0, block1]]];