SKSpriteNode - swift之间出现了奇怪的差距

时间:2017-06-10 16:04:32

标签: ios swift sprite-kit

注意:我试过这个答案:Gap between SKSpriteNodes in SpriteKit collision detection

在让我的游戏运行5分钟后,我的SKSpriteNodes之间出现了差距。这是我制作节点的代码:

let tileNode = SKSpriteNode(imageNamed: "world1Tile\(tileNumber).png")
tileNode.position.x = x
tileNode.position.y = y
tileNode.size.width = 128
tileNode.size.height = 128
tileNode.zPosition = 10
tileNode.physicsBody = SKPhysicsBody(rectangleOf: tileNode.size)
tileNode.physicsBody!.isDynamic = false
tileNode.physicsBody!.restitution = 0
tileNode.physicsBody!.allowsRotation = false
tileNode.name = "Tile"
row.append(tileNode)

当我删除物理体时,它运行正常。这是一些图像,以显示我的意思: With physics immediately taken.

此图像有一个物理体,在运行应用程序后立即拍摄。

This image was taken 5 minutes after running the app.

此图片是在运行应用程序后5分钟拍摄的。

为什么会这样?我认为它与物理体有关,因为我的应用程序看起来与第一张图片完全一样,即使在没有物理体的情况下运行应用程序后一小时。我应该改变什么物理身体属性来阻止这种情况发生?任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

不久前我遇到了类似的问题,在平铺的节点之间出现了间隙(虽然我没有使用物理)。基于this answer,我发现如果想要节点之间的完美对齐,最好确保节点的位置以及节点的位置。宽度和高度都是整数。

我建议对x位置的ytileNode值进行四舍五入,看看它是否会有所不同。

答案 1 :(得分:1)

我猜测没有差距。你可能在你的gameviewcontroller中将'showPhysics'设置为true,并且这条线对我来说是一个间隙。

比较有和没有pb的位置来验证。

答案 2 :(得分:1)

我遇到类似的问题,即在以恒定速度滚动约5分钟(无限滚动游戏)后,精灵之间的间隙开始出现。我没有使用物理学,甚至所有位置,宽度和高度都四舍五入为整数值。我正在滚动相机并一个接一个地添加新的精灵,一切工作正常,除非大约5分钟后,无限滚动间隙开始出现,就像您的情况一样。我花了一些时间寻找解决方案,结果发现问题是当我的对象的位置变大时(以我为例,场景中的X位置大约为150000,然后这些间隙开始出现,我也注意到了)仅在必须缩放场景的设备上才会出现此问题。我为iPhone 6分辨率使用默认场景尺寸的纵横比填充,这些差距仅出现在iPhone 5上,但在iPhone 6上我没有注意到。我可以通过不时从所有对象的X位置(包括相机位置)减去某个常数来解决该问题,从而使场景中的所有内容相对于相机的位置都不会改变,并且看起来相同,但实际上绝对位置是改变以保持低。我猜想较大的位置值(例如150000和场景缩放)会在SpriteKit中引起一些浮点舍入问题,这就是为什么间隙变得可见的原因。

因此,根据我的经验,如果您有相似的差距,我建议对所有位置,宽度,高度使用整数值,并同时将所有对象的对象位置值保持较低。

答案 3 :(得分:1)

为将来提供参考,以防万一有人还在搜索此内容,以下是我的经验:

  • 如果图块具有PhysicsBodies,则它们容易产生缝隙。对我来说,一个解决方案是将空白的SKNode用作图块的子代,然后为其分配PhysicsBody。
  • 如果可能的话,请确保位掩码的设置方式不使图块彼此冲突。
  • 如前一个答案所述,请确保所有度量均为整数,并且四舍五入的方式应使它们之间不留单位间隙。

一个相关的问题也是SpriteKit的PhysicsBody漂移。关于此有一些线程(例如https://forums.developer.apple.com/thread/27057),这似乎是一个错误。在我的情况下,问题是PhysicsBodies的组合导致随机的小间隙,并且漂移使其中一些间隙更大。上面的步骤消除了小差距。不幸的是,在我的案例中,解决漂移问题的唯一解决方法是仅为距播放器一定距离内的节点生成PhysicsBodies,并在将其遗弃后销毁它们。

答案 4 :(得分:0)

For future reference for anyone who needs, I found an different answer specific to my problem. As JohnV said, I may need to round of values when setting the position, but when running the code, I found out that I also need to do that when running SKActions.