2017-02-01 30 views
0

Я пытаюсь выполнить следующее на SKSpriteNode: Сделать это крупнее, Переместить его в новое место, Сделать его маленьким снова.Вложение SKActions, не использующее длительность ожидания

Однако код, кажется, все сразу запускает его, делая его небольшим, отменяя друг друга.

Вот код, созданный в Playground:

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 на самом деле). Я упростил для тестирования в Playground

Обновление:

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