我有问题,需要您的帮助。
我已从此旧线程修改了代码 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
}
}
答案 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)