2017-11-16 26 views
-1

볼과 속성을 선언하는 클래스 이름 ballNode()가 포함 된 장면이 있습니다. 이제 모든 정의 된 초마다 볼이 프레임을 스폰하기를 바랍니다. 나는 그것을하는 방법에 대해 읽고 타이머를 설정해야한다는 것을 깨닫습니다. 그래서 튜토리얼을 읽고 그것에 관한 몇 가지 비디오를 보았습니다. 나는 지침을 따르 있지만신속한 장면에서 노드 타이머 설정

class GameScene: SKScene, SKPhysicsContactDelegate { 
var tim = Timer() 

override func didMove(to view: SKView) { 

    self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8) 
    physicsWorld.contactDelegate = self 


    tim = Timer.init(timeInterval: 0.5, target: self, selector: #selector(createSmallBall) , userInfo: nil, repeats: true) 

    let sceneBody = SKPhysicsBody.init(edgeLoopFrom: self.frame) 
    sceneBody.friction = 0 
    self.physicsBody = sceneBody 

} 

@objc func createSmallBall(){ 
    let smallBall = BallNode(radius: 30) 
    smallBall.position.x = 100 
    smallBall.position.y = 200 
    self.addChild(smallBall) 
} 

(4 신속한로 조정 - 선택기 문제) 난 아직도 내 프레임에 어떤 공을 볼 수 없습니다 : 나는 자습서를 따를 때 나는 마지막으로이 코드를 얻을.

나는 2 시간 동안 문제를 찾고 그것을 발견하지 못한다. (createSmallBall이 작동 중이다. 나는 이것을 touchesbegin() 내부에 설정하여 점검했다.)

내가 뭘 잘못했는지 찾을 수 있습니까?

+0

정말 업데이트 키를 통해 Spritekit 타이밍 기능을 사용해야합니다. 그 옆으로 smallBall.zPosition = 1로 설정해보고 도움이되는지 확인해보십시오. –

답변

0

읽고 난 후에, spriteKit에 타이머를 사용하는 가장 좋은 방법은 SKAction을 통해 이루어진다는 것을 알았습니다. 내가 이해했듯이, Timers는 노드와 장면을 무시하기 때문에 spriteKit에서 쓸모가 없다. (잘못된 것이 아니라면 뷰의 일시 정지 메서드를 무시한다.) 타이머를 설정하는 데는 두 가지 방법 밖에 없습니다. update(currentTime) 함수를 사용하거나 더 나은 일반 방법 인 SKAction을 사용하십시오. 내가 이해 한대로 SKAction은 더 간단하고 훨씬 더 쉬우 며, 사용 된 주요 기능/방법은 sequence입니다. 이 신속한에서 수행되는 방법

여기 :

let wait = SKAction.wait(forDuration: 3) 

.wait : - 포함 렛 설정 (forDuration : _) 여기

func spawnBalls() { 
    let wait = SKAction.wait(forDuration: 3) 
    let action = SKAction.run { 
     //your code here 
    } 
    run(SKAction.repeatForever((SKAction.sequence([wait, action])))) 
} 

과는 선으로 설명 라인입니다 시각. 기본적으로 각 동작 사이의 시간을 설정하는 데 사용됩니다. 시간 간격은 초 단위입니다.

let action = SKAction.run{ //code here } 

.RUN - 중괄호 내부 동작 자체를 설정하면 액션 코드를 (움직임, 페이드, 회전 애니메이션 등)이어야한다. 노드가 실행하도록 지시 한 후에 동작은 으로 실행됩니다.

run(SKAction.repeatForever((SKAction.sequence([wait, action])))) 

이 줄에는 실제로 실행 한 행동이 있습니다. repeatForver()을 사용하면 내 행동이 영원히 (정기적으로) 실행되기를 바랍니다. 하지만이 라인에서 가장 흥미로운 부분은 sequence([])입니다 - 순서대로 수행되는 일련의 작업 (한 번에 한 작업)을 연결하는 것을 허용합니다. 첫 번째 작업이 실행 된 배열에 내 SKAction 변수를 삽입하는 것과 같습니다. 다음 두 번째 등등. 내 코드에있는 라인은 wait var가 먼저 실행될 것이고 (= wait 3 초), 그 다음에 액션 var가 실행될 것이라고 말한다. repeatforever로 설정 했으므로 반복적으로 실행됩니다 (이 코드를 삭제하면 코드가 한 번만 실행됩니다). SKAction를 사용하여

할 수도 있습니다 그룹 함께 어떤 행동 - .group : 그것의 장점은 당신이 기적를 실행 활동의 그룹을 실행할 수 있다는 것입니다.

here is apple doc for the SKAction.

희망자에게 도움이되기를 바랍니다.