垂直移动Swift背景中的黑线

时间:2018-09-13 11:46:40

标签: swift background sprite-kit

我有问题,需要您的帮助。

我已从此旧线程修改了代码 here

我的背景是垂直移动的。该代码很好用。但是我在每个运动的背景图像之间都有一条细小的黑线。

看起来有些重叠。但为什么? 如果有人可以帮助我解决此错误,那就太好了。

非常感谢

这是我的代码:

 var bg = SKSpriteNode()
 var bg2 = SKSpriteNode()
 var bg3 = SKSpriteNode()

 var parallax = SKAction()

override func didMove(to view: SKView) {



 bg = SKSpriteNode(imageNamed: "back1")
 bg.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
 bg.zPosition = 1
 bg.size = self.size

 bg2 = SKSpriteNode(imageNamed: "back2")
 bg2.position = CGPoint(x: self.size.width/2, y: self.size.height/2+self.size.height)

 bg2.zPosition = 1
 bg2.size = self.size

 bg3 = SKSpriteNode(imageNamed: "back3")
 bg3.position = CGPoint(x: self.size.width/2, y:self.size.height/2+self.size.height+self.size.height)
 bg3.zPosition = 1

 bg3.size = self.size
 self.addChild(bg)
 self.addChild(bg2)
 self.addChild(bg3)

 parallax = SKAction.repeatForever(SKAction.move(by: CGVector(dx: 0, dy: -self.frame.size.height), duration: 4))


 bg.run(parallax)
 bg2.run(parallax)
 bg3.run(parallax)}


override func update(_ currentTime: TimeInterval) {

 // Called before each frame is rendered
 if bg.position.y <= -self.frame.size.height {

      bg.position.y = self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

 if bg2.position.y <= -self.frame.size.height {
      bg2.position.y = self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

 if bg3.position.y <= -self.frame.size.height {
      bg3.position.y = self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

}

1 个答案:

答案 0 :(得分:1)

您遇到浮点取整问题。 1/2像素的概念不存在,因此当您到达12.5之类的位置时,系统需要将其设置为12或13。

现在,由于十进制不能很好地转换为分形二进制,因此您最终将得到像12.499929932092434234234324和12.50000000342423423424这样的数字,但据您所知,它仍然是12.5。

要解决此问题,您需要强制您的位置始终沿相同的方向向上或向下舍入。

由于大多数网格都在基于0的索引系统中工作,因此您可能希望舍入。

要修复您的代码,我们需要做:

override func update(_ currentTime: TimeInterval) {
 bg.position.x.round(.down)
 bg.position.y.round(.down)
 bg2.position.x.round(.down)
 bg2.position.y.round(.down)
 bg3.position.x.round(.down)
 bg3.position.y.round(.down)

// Called before each frame is rendered
 if bg.position.y <= -self.frame.size.height {

      bg.position.y += self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

 if bg2.position.y <= -self.frame.size.height {
      bg2.position.y += self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

 if bg3.position.y <= -self.frame.size.height {
      bg3.position.y += self.frame.size.height*2
      //this ensures that your backgrounds line up perfectly
 }

}

现在,当然,随着开发工作的进展,您将希望将这些类型的事情移到更新功能之外。最终,您将需要在位置更改时执行这些检查,这样,如果没有任何变化,则不必执行这些代码行来固定不需要固定的位置。

编辑:

提到了另一个问题,您需要+ =高度,而不是=高度,因为如果您在-1处,这也会引起间隙,因为您没有考虑到高度-1的行(基本上,您的第一张图片从高处开始-2,新图片从高处开始,在高处产生缝隙-1)