-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
}
}
OOは:(私はちょうどSpriteKitベースの学習を開始し、私はさておき、あなたのプロジェクトを入れて、Xcodeで新しいSpriteKitベースのゲームを作成します –
ことを行う方法については考えている。これが何を行いますが、あなたのベースとしてスターターゲームプロジェクトを入れていますスターターがGameViewControllerからSKSceneをどのようにロードするのか、そしてSKSceneファイルがどのように遷移するのかを見ることができます。また、GameSceneファイル内のシーンとやりとりする方法も表示されます –
このコードを実行する必要があります私はGameViewController内のすべての関数を追加することはできません...私はこの作業を行うためにコードのいくつかの行を置き換える必要があると感じています。 –