用sprite-kit恢复弹跳球

时间:2014-01-19 19:02:16

标签: sprite-kit

使用sprite-kit

恢复弹跳球

我对恢复弹跳球的最佳方法有疑问。使用Ray Wenderlich关于构建一个分组游戏的教程作为参考,我有许多圆形节点,它们在无重力环境中不断反弹。当用户触摸其中一个时,它以屏幕为中心,停止移动,并转换为其他内容。当用户再次触摸它时,它应该转换回圆形节点,然后继续在屏幕周围反弹。

除了让球恢复正常外,我还能按照自己喜欢的方式工作。我停止动画的方式就是将physicsBody设置为nil。一旦我想恢复,我就会调用为该节点设置physicsBody的方法,并对它施加一个冲动。但令人沮丧的是,冲动并没有我认为应该产生的影响。显然,我的期望是不正确的。

以下是相关代码:

- (void)applyPhysics
{
    // Set physics properties
    self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.frame.size.width/2];
    self.physicsBody.friction = 0.0f;
    self.physicsBody.restitution = 1.0f;
    self.physicsBody.linearDamping = 0.0f;
    self.physicsBody.allowsRotation = NO;
    self.physicsBody.collisionBitMask = wallCategory;
    self.physicsBody.categoryBitMask = bubbleCategory;
}

- (void)morphPicker
{
    BOOL check = NO;
    if (check) NSLog(@"morphPicker called.");

    [self runAction:[SKAction fadeAlphaTo:0.0 duration:.5]];

    if (self.flipped) {

        if (check) NSLog(@"The information side is showing.");
        self.fillColor = bubbleColors[self.index % bubbleColors.count];
        self.alpha = .9;

        // Resume physics:
        [self applyPhysics];
        [self.physicsBody applyImpulse:CGVectorMake(10.0f, -10.0f)];

    } else {

        // stop physics:
        self.physicsBody = nil;

        if (check) NSLog(@"The statistic side is showing.");
        self.fillColor = [SKColor blackColor];
        self.alpha = .9;
        [self transformToPickerNode];
        [self removeAllChildren];

    }

    self.flipped = !self.flipped;

}

所以我的问题是这些:

  1. 如果对它施加冲动不是正确的方法,我应该如何恢复球?

  2. 是否有一种更优雅的方法可以在节点居中后停止动画,而不是将physicsBody设置为nil?即使对我的新手本能,这感觉就像一种野蛮的方法。

1 个答案:

答案 0 :(得分:0)

经过我所有的考验并寻找答案后,我坚信没有优雅的方法可以为精灵施加新的冲动并期望它在物理世界中移动。因此,我的答案必须是“此时无法完成”。但是,我从场景中删除所有动画精灵并重新创建它们的解决方案被证明是完全不同原因的最佳解决方案。我的物理世界的本质导致我的“浮动气泡”最终落在他们仍然不动的场景的角落。偶尔删除并重新创建它们会让他们愉快地再次在场景中弹跳:)