SpriteKit。 与重力相反的applyForce混淆

我使用下面列出的代码作为SpriteKit的一个实验。 我所做的是施加相同数量的力作为重力效应,但是使用反向平行向量(身体质量被设置为1.0)。 该function通过更新function在每一帧上执行。 我希望物体不会像应用力和重力相互补偿一样移动。

-(void)didMoveToView:(SKView *)view { self.anchorPoint = CGPointMake(0.5, 0.5); SKShapeNode *node = [SKShapeNode shapeNodeWithRect:CGRectMake(0,0,WIDTH, HEIGHT)]; node.position = CGPointMake(30, 280); node.strokeColor = [SKColor whiteColor]; node.fillColor = [SKColor purpleColor]; node.name = @"node"; CGSize sz = node.frame.size; node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sz center:[GameScene Center]]; node.physicsBody.restitution = 0.3; node.physicsBody.mass = 1.0; node.physicsBody.affectedByGravity = YES; self.figure = node; [self addChild:node]; self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; } -(void)update:(CFTimeInterval)currentTime { [self.figure.physicsBody applyForce:CGVectorMake( - self.physicsWorld.gravity.dx, - self.physicsWorld.gravity.dy)]; 

然而,物体就像受重力的影响一样掉下来。 我用一个日志来检查质量总是正好1.0

经过一些实验后,我发现它有一些神奇的数字。 它是150.如果使用下一个更新方法对象是rest的:

 -(void)update:(CFTimeInterval)currentTime { [self.figure.physicsBody applyForce:CGVectorMake( - self.physicsWorld.gravity.dx, -150 * self.physicsWorld.gravity.dy)]; 

而在这里的另一个时刻,如果身体尺寸为150 * 150,质量自动计算为1.0。 无论如何,这将无济于事。 行为与我们直接设置质量相等的行为相同。

如果有人知道这是怎么回事,请帮忙!

比方说,SpriteKit中的点与米的比例是150比1。 如果我们创build一个150 * 150的大小的主体,那么质量就是一个。 好吧,这很好,我们有一个质量等于1.0的体,我们不会自己改变它。 但是,接下来我们再次施加与重力相反的力并且幅度相同。 在这种情况下,身体会再次跌倒。 不好。

好吧,150/1是点对点的,我们需要乘以150才能平衡力量。 我们可能会开始思考“嗯,一定有一些线索”。 可能是重力vector(0,-9.8)不影响米而是米! 好吧,让我们有150 * 150点的身体。 平衡我们需要的力量(理论上):

一方面万有引力:9.8牛顿(公斤*米)/秒^ 2)

另一方面我们施加的力量:(1.0公斤)* 9.8 *(150分)/(秒^ 2)

所以在这里,我们错过了150.无论如何,这似乎有点愚蠢,但是应用力量是以((点*公斤)/秒^ 2)来度量的,但是重力加速度是以牛顿((公斤*米)/秒^ 2)(尽pipe事实上它在文档中被描述为每秒钟米数,每秒秒数!加速!)。 乘以质量并得到力量。

你find了神奇的数字:D

150是Sprite-kit中的“像素与仪表比”。 在这里可以find一个特别好的解释: 请看mitchellallison的第二个答案 。 当你在你的update:方法中访问重力vector时,记住这个比例。