2017-03-22 8 views
-1

画面の中央から画面の端に至るまで、小さな星を全面に射したいと思います。これが完全に機能しないという事実を考えると、私は他の問題を抱えています。私は複数のSKNode(星)を次々と発射しようとしていますが、新しい星が走っている奇妙な理由のために古いものが取り除かれます。これは、常に別のシーンを追加するためですが、私はすでにviewDidLoadにこれを成功させずに追加しようとしました。そして、私は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ベースの学習を開始し、私はさておき、あなたのプロジェクトを入れて、Xcodeで新しいSpriteKitベースのゲームを作成します –

+0

ことを行う方法については考えている。これが何を行いますが、あなたのベースとしてスターターゲームプロジェクトを入れていますスターターがGameViewControllerからSKSceneをどのようにロードするのか、そしてSKSceneファイルがどのように遷移するのかを見ることができます。また、GameSceneファイル内のシーンとやりとりする方法も表示されます –

+0

このコードを実行する必要があります私はGameViewController内のすべての関数を追加することはできません...私はこの作業を行うためにコードのいくつかの行を置き換える必要があると感じています。 –

関連する問題