我有一个问题,需要你的帮助。
我修改了这个旧线程的代码 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/