SKPhysicsBody带有恢复系数为0仍然会弹跳

3

我正在尝试以恒定速度且不反弹地移除SKSpriteNode。

这是我使用的代码:

SKSpriteNode *floor = [SKSpriteNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(self.size.width, 1)];
floor.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:floor.size];
floor.physicsBody.restitution = 0.0f;
floor.physicsBody.dynamic = NO;
floor.physicsBody.allowsRotation = NO;

SKSpriteNode* block = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:imageName]];
block.position = CGPointMake(160, 300);
block.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(block.size.width - 2, block.size.height)];
block.physicsBody.dynamic = dynamic;
block.physicsBody.restitution = 0.0f;
block.physicsBody.allowsRotation = NO;

当我改变恢复值时,我可以看到块弹跳的差异,但当它为零时,它仍然会有一点弹跳。当多个块堆叠在一起时,下面的块也会有一点弹跳。
我该如何完全禁用弹跳?

你尝试过负值吗? - CodeSmile
@LearnCocos2D 我没有。你建议在哪里应用负值? - aumanets
恢复系数不能为负数。它确定物理体的“弹性”(0.0-1.0)。 - aumanets
1
理论上,在物理引擎中超出值范围可能会有所帮助。最坏的情况是立即崩溃,或者什么也不做。 - CodeSmile
1
SpriteKit似乎是基于Box2D的,后者也有这种行为。这些库是为了速度而设计的,而不是准确性。即使是对于静态对象,我也不会抱太大希望获得100%的非弹性碰撞,更不用说试图防止从上方撞击时堆叠的动态对象移动一点点了。如果这些情况是无法接受的,那么您可能正在使用错误的工具。我不知道SpriteKit是否允许您减少时间步长,但对于Box2D,我建议这样做(例如,使用1/1000秒的时间步长长度,而不是典型的1/60秒等)。 - iforce2d
显示剩余2条评论
1个回答

1

经过一些尝试和错误,我发现物理引擎并不适合用于想要准确定位元素的情况。这就是为什么在我的棋盘游戏中,我重新实现了代码以使位置更加准确。


你最终的解决方案是什么?我也遇到了同样的问题。 - damirstuhec
@Damir179 起初,物理引擎似乎是我游戏的好解决方案。但正如我所提到的,它不适用于精确定位。你无法使用物理引擎来控制对象的精确位置。因此在我的情况下,我开发了具有精确控制游戏对象及其准确位置的特定游戏引擎。虽然很难前进,但这是一个很好的设计选择。 - aumanets

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