簡體   English   中英

SpriteKit - 制作精靈無視重力(如氣球)

[英]SpriteKit - Making a sprite defy gravity (like a balloon)

有誰知道如何讓我的SKSpriteNode無視重力? 我想過反轉默認的引力但是意識到我也需要掉下來的東西!

看起來應該很容易,但通過文檔閱讀我看不出我會怎么做!

謝謝

更新:在iOS 8 / OS X Yosemite(10.10)中,物理領域為這些問題提供了一個優雅的解決方案。 這里可以快速使用它們為場景添加浮力(針對特定的節點集)。

  1. 使用linearGravityFieldWithVector構造函數創建SKFieldNode ,提供與重力相反的向量,並將字段節點添加到場景中。
  2. 將氣球上的fieldBitMask設置為唯一的。
  3. 將字段上的categoryBitMask設置為與氣球的fieldBitMask重疊,但不與任何其他fieldBitMask重疊。

現在,氣球會上升或保持穩定,但其他物體會下降。 調整場地的strength將讓你調整氣球的浮力是否完美地平衡重力(使它們漂浮在原位,但在被觸摸時受到干擾),或稍微多於或少於重力(使它們緩慢上升或下降)。

默認情況下,一個字段是無限的,覆蓋整個場景,但您可以使用字段的region屬性更改它以將其限制為場景的一部分。 (如果你想模擬水中的浮力,這很有用 - 一旦一個物體越過水面的水面頂部,就會重新進入水中。)

此外,如果您想要根據@TheisEgeberg的答案獲得可變浮力,您可以使用falloff屬性控制其在距離上的變化。

在iOS 7 / OS X Mavericks(10.9)中,或者如果您想要更精確地控制在何時何地應用哪種力,您可以使用下面原始答案中的方法。


如果你想讓一個物體像氣球一樣漂浮 - 也就是說,要浮力,受重力影響而且還要抵消它 - 你需要在每一幀上施加一個力(即你的update:方法)。

注意縮放:重力是一個恆定的加速度,但如果你施加一個力來抵抗重力,力就會與質量成正比。 要制作一個完美平衡重力以在applyForce:使用的applyForce: ,您需要:

  1. 將重力矢量按{-1,-1,-1}縮放以指向相反方向
  2. 通過你施加力的身體的mass來縮放( F = ma ,其中重力或反重力是a )。
  3. 縮放150 - 有一個錯誤, SKPhysicsWorld.gravity屬性與SKPhysicsWorld.gravity不在同一個單位applyForce: (如果您關閉SKPhysicsWorld重力並使用SKFieldNode重力,則不需要這樣做。)

與關閉affectedByGravity並應用動作使氣球上升不同,這種方法適用於物理模擬的其余部分。 當平衡力與重力完全相等時,氣球將浮動到位 - 在與其他物體碰撞后,它將恢復平衡。 如果平衡力大於重力,則氣球將上升,但其上升將受到其他物體的阻礙。

首先, SKSpriteNode完全不受重力影響。 SKPhysicsBody屬於受重力影響的節點。

第二...

myNode.physicsBody.afectedByGravity = NO;

:d

如果你想要它向上升,那么你可以添加一個動作......

SKAction *moveAction = [SKAction moveByX:0 y:-10 duration:1];

SKAction *repeatingAction = [SKAction repeatActionForever:moveAction];

[myNode runAction:repeatingAction];

正如許多人所說的那樣是反力量。

所以,是的,您可以對氣球施加反作用力使其向上移動。

但要讓它看起來像一個氣球,你需要了解氣球上升的原因:氣壓。 由於您使用的氦氣或任何輕質氣體比空氣輕,它會開始上升,換句話說,較重的空氣會進入氣球下方。 它就像一塊木頭在水中,較重的水會流到木頭下面,直到木頭被浸濕,甚至比水還重。

所以你應該做的是使反作用力適應氣球的高度,它越高,你施加的壓力越小。 這是一種模擬浮力的方法。

這是我的答案:

- (MyClass *)newRisingObject
{
    MyClass *risingObject = [MyClass spriteNodeWithImageNamed:@"image"];

    [risingObject setPosition:CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame))];
    [risingObject setName:@"name"];
    [risingObject setUserInteractionEnabled:YES];

    //  Physics
    //
    [risingObject setPhysicsBody:[SKPhysicsBody bodyWithCircleOfRadius:risingObject.size.width / 2.0f]];
    [risingObject.physicsBody setRestitution:1.0f];
    [risingObject.physicsBody setFriction:0.0f];
    [risingObject.physicsBody setLinearDamping:0.0f];
    [risingObject.physicsBody setAngularDamping:0.0f];
    [risingObject.physicsBody setMass:1.3e-6f];

    return risingObject;
}

- (void)didMoveToView:(SKView *)view
{
    /* Setup your scene here */
    MyClass *risingObject = [self newRisingObject];

    [self addChild:risingObject];
}

- (void)update:(CFTimeInterval)currentTime
{
    /* Called before each frame is rendered */
    [self enumerateChildNodesWithName:@"name"
                           usingBlock:^(SKNode *node, BOOL *stop)
     {
         //  Push object up
         //
         [node.physicsBody applyImpulse:CGVectorMake(0.0f, node.physicsBody.mass * OBJECT_ACCELERATION)];
    }];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM