objective-c - SpriteKit 通过关节对 body 施加两个力

标签 objective-c swift sprite-kit skphysicsbody

问题:我想让气球升到空中。它们可以相互碰撞并且可以旋转。在垂直方向的重力下效果很好。

但现在我想为每个气球连接一个篮子。这样做会导致篮子像气球一样“飞”起来。但在现实生活中,篮子应该比气球“重”,所以它总是指向地面。

我该如何实现这一目标?

最佳答案

模拟带有篮子的气球的一种方法是将重力设置为向下方向,将篮子拉向场景底部,并向气球施加浮力以产生升力。以下是如何执行此操作的示例:

定义常量

#define kRandMax        0x7fffffff
#define kNumBalloons    5

创建气球和篮子

self.physicsWorld.gravity = CGVectorMake(0, -3);

for (int i=0;i<kNumBalloons;i++) {

    // Create a balloon near the bottom of the scene with a random x position
    SKShapeNode *balloon = [SKShapeNode shapeNodeWithCircleOfRadius:16];
    balloon.fillColor = [SKColor redColor];
            balloon.name = @"balloon";
    balloon.physicsBody.allowsRotation = NO;
    CGFloat rand1 = arc4random_uniform(kRandMax) / (double)kRandMax;
    // A value in (-view.frame.size.width/2, view.frame.size.width/2)
    CGFloat xOffset = (rand1 - 0.5) *  view.frame.size.width / 2;
    balloon.position = CGPointMake (CGRectGetMidX(view.frame)+xOffset,
                                    CGRectGetMinY(view.frame)+50);
    balloon.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16];
    [self addChild:balloon];

    // Create the basket        
    SKSpriteNode *basket = [SKSpriteNode spriteNodeWithColor:[SKColor brownColor] size:CGSizeMake(8, 8)];
    basket.position = CGPointMake(balloon.position.x, balloon.position.y-24);
    basket.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:basket.size.width/2];
    [self addChild:basket];

    // Connect the balloon and basket with an SKPhysicsJointPin
    SKPhysicsJointPin *joint = [SKPhysicsJointPin jointWithBodyA:balloon.physicsBody
                                bodyB:basket.physicsBody anchor:balloon.position];
    [self.physicsWorld addJoint:joint];
}

在更新方法中,向每个气球施加力以产生升力

-(void)update:(CFTimeInterval)currentTime {
    // Apply buoyant force to all balloons in the scene
    [self enumerateChildNodesWithName:@"//balloon" usingBlock:^(SKNode *node, BOOL *stop){
        // Adjust force as needed
        [node.physicsBody applyForce:CGVectorMake(0, 17.2)];
    }];
}

关于objective-c - SpriteKit 通过关节对 body 施加两个力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562083/

相关文章:

ios - UIButton 没有出现在 SKScene 中

iOS 应用程序二进制文件在 Xcode 5 中的大小增加了一倍

objective-c - 无法从 iOS 中删除今日 View 扩展

swift - 如何将 Binding 变量传递给 ObservableObject?

ios - 在 api 调用 Swift 上显示事件指示器

ios - SKShapeNode 消耗太多内存并减慢动画 - Spritekit iOS

ios - NSMutableDictionary内容与allValues的输出不一致

ios - 如何在 iOS 中创建侧面板位于中心面板之上的滑出式导航面板?

ios - NSObject 和 AnyObject 有什么区别?什么时候用这两个?

iOS7 SKScene 如何让 Sprite 从屏幕边缘反弹?