2017-03-22 1 views
-1

화면 중간에서부터 화면 가장자리까지 작은 별을 발사하고 싶습니다. 사실 이것이 완벽하게 작동하지 않는다는 사실을 감안할 때 다른 문제가 있습니다. 여러 개의 SKNode (별)를 차례로 발사하려고합니다. 그러나 별이 떨어지는 이상한 이유로 새 별이 실행 중일 때 이전 별이 제거됩니다. 이것은 항상 다른 Scene을 추가하기 때문에 가능하지만, 이미 viewDidLoad에이를 성공적으로 추가하려고 시도했습니다. 그리고 o, VM을 사용하고 있기 때문에 xCode가 충돌하기 때문에 .sks 파일에 액세스하거나 볼 수 없기 때문에 모든 코딩을 ViewController에서 수행해야합니다. 고맙습니다!SKNodes를 하나씩 실행하지 않고 차례로 실행합니다.

import UIKit 
import SpriteKit 
class ViewController: UIViewController { 

    @IBOutlet weak var rootView: UIView! 
    let minDuration = 10 
    let maxDuration = 30 

    var gameTimer: Timer! 
    var sceneView = SKView() 
    var sceneScene = SKScene() 

    func executeSpawningStar() { 
     let star = SKSpriteNode(imageNamed: "LittleStar") 
     star.position = CGPoint(x: rootView.frame.origin.x, y: rootView.frame.origin.y) 
     star.size = CGSize(width: 10, height: 10) 
     let viewSize = UIScreen.main.bounds.size 
     let randomX = RandomInt(min: 0, max: Int(viewSize.width)) 
     let randomY = RandomInt(min: 0, max: Int(viewSize.height)) 
     let randomPosition = CGPoint(x: randomX, y: randomY) 
     let minimumDuration = minDuration 
     let maximumDuration = maxDuration 
     let randomDuration = TimeInterval(RandomInt(min: minimumDuration, max: maximumDuration)) 
     let fireAtWill = SKAction.move(to: randomPosition, duration: randomDuration) 
     let rotation = SKAction.rotate(byAngle: CGFloat(randomAngle()), duration: Double(randomDuration)) 
     let fadeIn = SKAction.fadeIn(withDuration: 1.0) 
     let fadeOut = SKAction.fadeOut(withDuration: randomDuration) 
     let scaleTo = CGSize(width: CGFloat(abs(minimumDuration - maximumDuration) + minDuration + 8), height: CGFloat(abs(minimumDuration - maximumDuration) + minDuration + 8)) 

     let grow = SKAction.scale(to: scaleTo, duration: randomDuration) 
     let group = SKAction.group([fadeIn, fadeOut, fireAtWill, rotation, grow]) 



     if let view = sceneView as SKView? { 
      if let scene = SKScene(fileNamed: "MyScene") { 
       scene.scaleMode = .resizeFill 
       view.presentScene(scene) 
       scene.addChild(star) 
       star.run(group) 
      } 

      view.ignoresSiblingOrder = true 

     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     gameTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(executeSpawningStar), userInfo: nil, repeats: true) 
     sceneView = SKView(frame: rootView.frame) 

     sceneView.backgroundColor = UIColor.black 
     self.view.addSubview(sceneView) 

    } 
    func RandomInt(min: Int, max: Int) -> Int { 
     return Int(arc4random_uniform(UInt32(max-(min-1)))) + min 
    } 
    func randomAngle() -> Int { 
     return Int(arc4random_uniform(UInt32(10))) + 1 
    } 
} 

편집 :이 코드를 사용하여 고정 :

import UIKit 
import SpriteKit 
class ViewController: UIViewController { 

    @IBOutlet weak var rootView: UIView! 
    let minDuration = 10 
    let maxDuration = 30 

    var gameTimer: Timer! 
    var sceneView = SKView() 
    var sceneScene = SKScene() 

    func executeSpawningStar() { 
     let star = SKSpriteNode(imageNamed: "LittleStar") 
     star.position = CGPoint(x: rootView.frame.origin.x, y: rootView.frame.origin.y) 
     star.size = CGSize(width: 10, height: 10) 
     let viewSize = UIScreen.main.bounds.size 
     let randomX = RandomInt(min: 0, max: Int(viewSize.width)) 
     let randomY = RandomInt(min: 0, max: Int(viewSize.height)) 
     let randomPosition = CGPoint(x: randomX, y: randomY) 
     let minimumDuration = minDuration 
     let maximumDuration = maxDuration 
     let randomDuration = TimeInterval(RandomInt(min: minimumDuration, max: maximumDuration)) 
     let fireAtWill = SKAction.move(to: randomPosition, duration: randomDuration) 
     let rotation = SKAction.rotate(byAngle: CGFloat(randomAngle()), duration: Double(randomDuration)) 
     let fadeIn = SKAction.fadeIn(withDuration: 1.0) 
     let fadeOut = SKAction.fadeOut(withDuration: randomDuration) 
     let scaleTo = CGSize(width: CGFloat(abs(minimumDuration - maximumDuration) + minDuration + 8), height: CGFloat(abs(minimumDuration - maximumDuration) + minDuration + 8)) 

     let grow = SKAction.scale(to: scaleTo, duration: randomDuration) 
     let group = SKAction.group([fadeIn, fadeOut, fireAtWill, rotation, grow]) 

       sceneScene.addChild(star) 
       star.run(group) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     gameTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(executeSpawningStar), userInfo: nil, repeats: true) 
     sceneView = SKView(frame: rootView.frame) 

     sceneView.backgroundColor = UIColor.black 
     sceneView.ignoresSiblingOrder = true 
     self.view.addSubview(sceneView) 
     sceneScene = SKScene(fileNamed: "MyScene")! 
     sceneScene.backgroundColor = .black 
     sceneScene.scaleMode = .resizeFill 
     sceneView.presentScene(sceneScene) 

    } 
    func RandomInt(min: Int, max: Int) -> Int { 
     return Int(arc4random_uniform(UInt32(max-(min-1)))) + min 
    } 
    func randomAngle() -> Int { 
     return Int(arc4random_uniform(UInt32(10))) + 1 
    } 
} 

답변

0

이궁을! viewController에서 해당 코드를 실행하면 안됩니다. 씬을로드 한 다음 SKScene 내부에서 스타 생성을 수행해야합니다.

+0

oo :(방금 Spritekit을 배우기 시작했고 그 방법에 대해서는 전혀 모르겠다. –

+0

프로젝트를 제쳐두고 Xcode에서 새로운 SpriteKit 게임을 만들겠습니다.이 작업은 시작 프로젝트 프로젝트를 기반으로합니다. 스타터가 GameViewController에서 SKScene을로드하는 방법과 SKScene 파일이 어떻게 전환되는지 볼 수 있으며 GameScene 파일 내부에서 장면과 상호 작용하는 방법을 보여줍니다. –

+0

이 코드를 실행해야합니다. 내부에있는 UIViewController. GameViewController 내부의 모든 함수를 추가 할 수 없습니다 ... 그것은 단지 몇 줄의 코드를 바꿔서이 작업을 수행해야한다고 느낍니다. –

관련 문제