[英]How to make a specific object defy gravity? (SpriteKit / Objective-C)
[英]SpriteKit - Making a sprite defy gravity (like a balloon)
有誰知道如何讓我的SKSpriteNode
無視重力? 我想過反轉默認的引力但是意識到我也需要掉下來的東西!
看起來應該很容易,但通過文檔閱讀我看不出我會怎么做!
謝謝
更新:在iOS 8 / OS X Yosemite(10.10)中,物理領域為這些問題提供了一個優雅的解決方案。 這里可以快速使用它們為場景添加浮力(針對特定的節點集)。
linearGravityFieldWithVector
構造函數創建SKFieldNode
,提供與重力相反的向量,並將字段節點添加到場景中。 fieldBitMask
設置為唯一的。 categoryBitMask
設置為與氣球的fieldBitMask
重疊,但不與任何其他fieldBitMask
重疊。 現在,氣球會上升或保持穩定,但其他物體會下降。 調整場地的strength
將讓你調整氣球的浮力是否完美地平衡重力(使它們漂浮在原位,但在被觸摸時受到干擾),或稍微多於或少於重力(使它們緩慢上升或下降)。
默認情況下,一個字段是無限的,覆蓋整個場景,但您可以使用字段的region
屬性更改它以將其限制為場景的一部分。 (如果你想模擬水中的浮力,這很有用 - 一旦一個物體越過水面的水面頂部,就會重新進入水中。)
此外,如果您想要根據@TheisEgeberg的答案獲得可變浮力,您可以使用falloff
屬性控制其在距離上的變化。
在iOS 7 / OS X Mavericks(10.9)中,或者如果您想要更精確地控制在何時何地應用哪種力,您可以使用下面原始答案中的方法。
如果你想讓一個物體像氣球一樣漂浮 - 也就是說,要浮力,受重力影響而且還要抵消它 - 你需要在每一幀上施加一個力(即你的update:
方法)。
注意縮放:重力是一個恆定的加速度,但如果你施加一個力來抵抗重力,力就會與質量成正比。 要制作一個完美平衡重力以在applyForce:
使用的applyForce:
,您需要:
{-1,-1,-1}
縮放以指向相反方向 mass
來縮放( F = ma
,其中重力或反重力是a
)。 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.