-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
}
}
oo :(방금 Spritekit을 배우기 시작했고 그 방법에 대해서는 전혀 모르겠다. –
프로젝트를 제쳐두고 Xcode에서 새로운 SpriteKit 게임을 만들겠습니다.이 작업은 시작 프로젝트 프로젝트를 기반으로합니다. 스타터가 GameViewController에서 SKScene을로드하는 방법과 SKScene 파일이 어떻게 전환되는지 볼 수 있으며 GameScene 파일 내부에서 장면과 상호 작용하는 방법을 보여줍니다. –
이 코드를 실행해야합니다. 내부에있는 UIViewController. GameViewController 내부의 모든 함수를 추가 할 수 없습니다 ... 그것은 단지 몇 줄의 코드를 바꿔서이 작업을 수행해야한다고 느낍니다. –