为什么SKSpriteNode不响应applyForce或applyImpulse?

4
我有一个精灵节点,它会根据附加到它的physicsBody所施加的重力出现并下落。
非常好。
现在,我想在它下落时使用applyForce来将其向某个方向推一点。
不幸的是,无论我将physicsBody.massphysicsWorld.gravity设得多么小,或者让applyForce矢量变得多么大,applyForce矢量似乎都会被忽略。
当我注释掉self.physicsWorld.gravity行时,我看到applyForce按预期工作。
如何在施加重力的情况下通过applyForce实现对物理体的“推”?
这是我的.h文件:
// GameScene.h


#import <SpriteKit/SpriteKit.h>

@interface GameScene : SKScene

@end

同时,.m文件

// GameScene.m

#import "GameScene.h"

@interface GameScene ()
@property NSMutableArray *bubblesToPop;

@end

@implementation GameScene

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */

    self.size = view.bounds.size;
    self.physicsWorld.gravity = CGVectorMake(0, 1.0);

    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"bubble"];

    sprite.yScale = 0.5;
    sprite.xScale = 0.5;
    sprite.name = @"bubble";
    sprite.position = CGPointMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0);

    SKPhysicsBody *physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.frame.size.width];
    physicsBody.mass = 0.02;
    [physicsBody applyForce:CGVectorMake(900, 900)];
    sprite.physicsBody = physicsBody;

    [self addChild:sprite];

}

@end

2
你需要将 physicsBody 分配给精灵,然后在施加力/冲量之前将精灵添加到场景中。 - 0x141E
1
applyForce 行移动到 addChild 下面完全奏效了。你应该用这个回答我的问题,因为我在 Stack Overflow 和文档上查了几个小时,但都不清楚。 - Jess
另外,我想知道为什么这很重要。 - Jess
1个回答

5
在 Sprite Kit 确定力对物体的影响之前,这个物体需要存在于场景中。在物理体上使用 applyForce 方法时,需要在将其添加到场景后进行。
根据苹果的文档:
“Sprite Kit 中的物理模拟是通过将物理体添加到场景中来完成的。一个物理体是一个模拟的物理对象,与场景节点树中的一个节点相连。它使用该节点的位置和方向将自身放置在模拟环境中...每次场景计算新的动画帧时,它都会模拟作用于与节点树相连的物理体的力和碰撞效应。它计算每个物理体的最终位置、方向和速度。然后,场景更新每个相应节点的位置和旋转[强调添加]。”
此外,外部因素也会影响力对物理体的影响。例如,必须考虑重力、碰撞和力场(iOS 8)等因素,以计算施加于物理体的净力。因此,在 Sprite Kit 能够确定力如何影响物理体之前,该物体需要存在于场景中。

那句话是最重要的陈述。建议将其移到顶部并加粗。 - Jess
1
非常好的答案!几个月后仍在帮助。 - Michael Giba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接