Черная линия на вертикальном фоне - PullRequest
0 голосов
/ 13 сентября 2018

У меня проблема, и мне нужна ваша помощь.

Я изменил код из этой старой темы здесь

Чтобы я получил вертикальный движущийся фон.Код работает хорошо.Но у меня между каждым движущимся фоновым изображением есть крошечная черная линия.

выглядит как что-то перекрывающееся.Но почему?Было бы хорошо, если бы кто-нибудь мог помочь мне исправить эту ошибку.

Большое спасибо

Вот мой код:

 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 голосов
/ 14 сентября 2018

У вас проблемы с округлением с плавающей запятой.Понятия 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)

...