swift - 垂直移动 Swift 背景中的黑线

标签 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/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 处留出一个缺口

关于swift - 垂直移动 Swift 背景中的黑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313057/

相关文章:

ios - swift 。谷歌地图 View 显示问号而不是字母

css - 为什么当我将元素位置设置为 :absolute? 时,线性渐变消失了

ios - 在后台的 tableView 中附加数据 - iOS

java - 将图像添加到 JPanel

ios - SKAction 仅在 sleep 后或运行调试器时运行

ios - SpriteKit : remove specific node instead of all nodes

ios - 预期返回 'UIImage' 的函数中缺少返回值

json - Swift 4 JSON 解析(预期解码 Array<Any> 但发现字典)

ios - 搜索核心数据中的关系数量 - Swift

swift - 无法将 "inout CGAffineTransform"类型的值转换为预期参数