2017-02-01 4 views
0

SKSpriteNode에서 수행 할 작업 : 더 크게 만들려면 새 위치로 이동하십시오. 다시 작게 만드십시오.대기 기간을 사용하지 않는 SKActions 중첩

그러나 코드는 모두 한꺼번에 실행되어 큰 것으로 만들어서 서로를 소극적으로 취소합니다. 여기

는 놀이터에서 만든 코드 :

import PlaygroundSupport 
import UIKit 
import SpriteKit 

var theirCard:SKSpriteNode 
let CARDSHRINK_TIME = 5.0 
let AICARDMOVE_SPEED = 2.5 
let droppoint:CGPoint = CGPoint(x: 100,y: 100) 

let sceneView = SKView(frame: CGRect(x:0 , y:0, width: 480, height: 320)) 

let scene = SKScene(size: CGSize(width: 480, height: 320)) 
sceneView.showsFPS = true 
sceneView.presentScene(scene) 
PlaygroundSupport.PlaygroundPage.current.liveView = sceneView 

theirCard = SKSpriteNode(imageNamed: "card") 
theirCard.name = "theircard" 
theirCard.position = CGPoint(x: scene.size.width * 0.50, y: scene.size.height * 0.5) 

scene.addChild(theirCard) 

func getwait(makeBig big:Bool) -> SKAction { 
    let ret = SKAction.wait(forDuration: CARDSHRINK_TIME) 
    var action:SKAction 

    if big { 
     action = SKAction.scale(to: 1.9, duration: CARDSHRINK_TIME) 
    } 
    else { 
     action = SKAction.scale(to: 1.0, duration: CARDSHRINK_TIME) 
    } 
    theirCard.run(action, completion: { print("getwait \(big) done!") }) 

    return ret 
} 



// We want to MAKE the node BIG, move it to the location, then make it SMALL again 
let action1:SKAction = getwait(makeBig: true) 
let action2:SKAction = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED) 
let action3:SKAction = getwait(makeBig: false) 
let seq:SKAction = SKAction.sequence([action1, action2, action3]) 
theirCard.run(seq, completion: { 
    print("animation complete!!!!") 
}) 

나는 때문에 실제 코드에서이 같은 getwait을 유지하는 데 필요한 카드 클래스의 그것의 방법합니다 (theirCard 실제로 바로 이것이다). 나는

놀이터

에서 테스트를 단순화 업데이트 :

let action1 = SKAction.scale(to: 1.9, duration: CARDSHRINK_TIME) 
let action2:SKAction = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED) 
let action3 = SKAction.scale(to: 1.0, duration: CARDSHRINK_TIME) 

작품 내가 좋아하는 것처럼,하지만 난 카드 클래스에서 메서드를 사용할 수 없다는 것을 의미한다.

답변

1

사용할 때 동작이 한 번에 실행하는 이유는 getwait(makeBig: true) 때문에 다음 줄입니다 :

theirCard.run(action, completion: { print("getwait \(big) done!") }) 

당신이 함수를 호출 할 때마다

, 당신은 즉시 카드가 작업을 실행하고 있습니다. 전화 왜 당신이 연속적으로 볼 수

getwait(makeBig: true) 
getwait(makeBig: false) 

단지 카드의 순 효과는 같은 시간에 아래로 확장하고 있습니다.

func getScaleAction(makeBig big:Bool) -> SKAction { 
    return SKAction.scale(to: big? 1.9 : 1.0, duration: CARDSHRINK_TIME) 
} 

을 다음과 같이 호출 :

나는 다음과 같이 당신이 그것을 다시 제안

let scaleUp = getScaleAction(makeBig: true) 
let move = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED) 
let scaleDown = getScaleAction(makeBig: false) 

theirCard.run(SKAction.sequence([scaleUp, move, scaleDown])) { 
    print("done") 
} 
+0

감사합니다, 나는 그것을 기회를 제공 할 것입니다. 내 코드에 대한 추론은 getwait()을 호출하여 카드를 즉시 확장한다는 것입니다. getwait()은 실제 크기 조정이 완료 될 때까지 대기하는 시퀀스에서 사용하는 대기 작업을 반환합니다. – Johnne