2017-03-20 3 views
0

I 지속적 1500 x 600 픽셀이며, 움직이는 배경이 코드를 사용하여 화면에 수직으로 이동이 있습니다신속한 게임 장면 시간이 세로로 움직이는 배경을 바꾸시겠습니까?

let bgTexture = SKTexture(imageNamed: "bg.png") 
    let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4) 
    let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0) 
    let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 

    var i: CGFloat = 0 

    while i < 3 { 

     bg = SKSpriteNode(texture: bgTexture) 
     bg.position = CGPoint(x: self.frame.midX, y: bgTexture.size().height * i) 
     bg.size.width = self.frame.width 
     bg.zPosition = -2 

     bg.run(moveBGForever) 
     self.addChild(bg) 

     i += 1 


    } 

지금은 새로운 배경이 제공하는 시간의 X 금액 후 화면에오고 싶어를 플레이어가 게임의 다른 부분으로 이동하고 있다고 느낍니다.

이 코드를 함수에 넣고 NSTimer를 사용하여 20 초 후에 트리거 할 수 있지만 새 bg의 시작 위치를 화면 꺼짐으로 변경 할 수 있습니까?

답변

1

repeatForever 동작의 문제는 특정 순간에 어디에 있는지 알 수 없다는 것입니다. NSTimers는 원하는만큼 정확하지 않으므로 타이머를 사용하면 렌더링 속도와 프레임 속도에 따라 적절한 시간을 놓치거나 너무 일찍 뛰어 넘을 수 있습니다.

이동 순서 & 교대 동작으로 moveBGForever를 bgAnimation으로 바꾸는 것이 좋습니다. 그런 다음 bgAnimation 액션을 실행하면 완료 블록 {self.cycleComplete = true}로 실행됩니다. cycleComplete는 동작 시퀀스가 ​​완료되었는지 여부를 나타내는 부울 변수입니다. 장면 업데이트 방법에서이 변수가 맞는지 확인할 수 있습니다. 그렇다면 시퀀스 작업을 다시 실행할 수 있습니다. cycleComplete 변수를 false로 재설정하는 것을 잊지 마십시오.

아마도 더 복잡한 것처럼 들리 겠지만 한 번 더주기를 실행할지 여부를 제어 할 수 있습니다. 그렇지 않은 경우 텍스처를 변경하고주기를 다시 실행할 수 있습니다.

또는 스프라이트가 보이는 영역 밖에 있는지 확인한 후에 텍스처를 변경하면됩니다. 그것의 Y 위치는보기 크기의 높이입니다.

SpriteKit에서는 완료 블록과 함께 대기 동작을 사용할 수 있습니다. 이것은 NSTimer를 사용하는 것보다 쉽습니다.

질문에 대답하기 위해 - 화면에서 스프라이트를 이동하기위한 작업을 사용할 때 언제든지 스프라이트의 위치를 ​​변경해서는 안됩니다 - 이것이 동작입니다. 위치가 스크린 밖일 때 텍스처를 업데이트하면됩니다. 시간이 오면 분명히 일부 스프라이트가 표시되므로 모든 3의 텍스처를 동시에 변경할 수 없습니다. 이를 위해서는 헬퍼 변수가 필요합니다 (위에서 제안한대로) 업데이트주기를 확인하고 시간이 맞으면 텍스처를 바꿉니다 (스프라이트 Y pos가 화면 외부에 있음).