2014-12-14 2 views
0

SKActions의 작동 방식을 이해하려고합니다. 특히 SKAction.runAction()을 사용하면 매개 변수 중 하나가 애니메이션의 지속 시간입니다. 그러나 그것이 내가 지속 시간으로 넣었던 것처럼, 애니메이션은 모든 프레임을 렌더링하는 것처럼 보입니다. 다른 곳에서 SKAction.runAction() 행을 넣으려고했지만 update() 무시 방법 인 SKScene에서만 작동하는 것으로 보입니다. SKAction.repeatActionForever을 시도했지만 다른 프로세스와 병렬로 실행할 수없는 것 같습니다.SKAction 지속 시간은 프레임 속도와 관련하여 어떻게 작동합니까?

내 질문은, 애니메이션 기간 동안 필요한 매개 변수가있는 경우, 하나는 어디 프레임 속도 대신 주어진 기간을 기반으로 애니메이션을 실행하는 방법을 배치할까요?

GameScene.swift (.. 플레이어 클래스는 문자 클래스의 서브 클래스입니다 아래 코드 참조)

let player = Player() 
class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     //Code here to recognize user inputs 
     scene?.addChild(player.sprite) 
    } 

    override func update(currentTime: CFTimeInterval) { 
     player.sprite.runAction(SKAction.runBlock(player.move)) 
    } 
} 

CharachterClass.swift 이동() 함수

:

내 코드입니다
func move(){ 
    switch(direction){ 
     case "up": 
     sprite.position = CGPoint(x: sprite.position.x, y: sprite.position.y + speed) 
     case "down": 
     sprite.position = CGPoint(x: sprite.position.x, y: sprite.position.y - speed) 
     case "right": 
     sprite.position = CGPoint(x: sprite.position.x + speed, y: sprite.position.y) 
     case "left": 
     sprite.position = CGPoint(x: sprite.position.x - speed, y: sprite.position.y) 
     default: 
     break 
    } 
    SKAction.moveTo(sprite.position, duration: 1) 
} 

참고 : direction 변수 스프라이트가 이동되고 speed 변수 화소의 총계 스프라이트이라는 방향 SKAction이 실행될 때마다 이동해야합니다.

답변

2

난 당신이 함께 할 예정 모르겠어요 :

override func update(currentTime: CFTimeInterval) { 
    player.sprite.runAction(SKAction.runBlock(player.move)) 
} 

하지만 간단하게 할 매우 수있는 효과에 대신 다음

override func update(currentTime: CFTimeInterval) { 
    player.move() 
} 

두 가지 방법의 차이는 runAction은 블록 실행을 예약하고 스케줄링이 언제 발생하는지에 따라 현재 프레임 (업데이트주기)에서 실행되지 않고 다음 프레임에서 실행될 수 있습니다. 따라서 런 블록 솔루션은 1 프레임 지연을 유발합니다. 당신이 모든 업데이트 방법이를 실행하기 때문에 당신이 효과적으로 널 (null),

SKAction.moveTo(sprite.position, duration: 1) 

과 SKAction의 무효화 :

다음이 1 초 기간 동안 이동 동작 (: 1 프레임 되지 않음)를 실행 주 목적 : 주어진 시간에 작업을 수행하려면 (기간).

최악의 경우, 매 프레임마다 새로운 이동 동작을 실행하므로 1 초 동안 정의되지 않은 동작으로 동시에 실행되는 약 60 개의 이동 동작이 누적 될 수 있습니다.

"key"매개 변수를 사용하여 runAction을 호출하는 경우 적어도 스택 작업을 방지 할 수 있지만 1 초 동안 실행해야하는 모든 프레임을 액션으로 대체하므로 여전히 무의미합니다 있다면 효과가 거의 없음을 의미합니다.

동시에 코드를 설정하는 방법과 마찬가지로 위치에 직접 할당 할 수도 있지만 ...당신이 끝나는 1 초에 걸쳐 작업을 실행하려고 그래서 모두 모두

SKAction.moveTo(sprite.position, duration: 1) 

:

sprite.position = CGPoint(x: sprite.position.x - speed, y: sprite.position.y) 

그러나 직후이 이동 작업을 실행 : 잠깐, 당신은 이미 그렇게 매 프레임마다 (초당 60 회) 교체되며 그 작업은 아무 것도하지 않습니다. 스프라이트가 이미 원하는 위치로 움직이는 위치에 있도록 설정했기 때문에 아무 것도하지 않습니다. 그러나 스프라이트는 이미 그 위치에 있으며 아무 것도 할 행동이 없습니다. 1 초 동안 - 또는 아마도 일찍 종료 될 수도 있지만, 이는 우리가 알지 못하는 SK 구현 세부 사항에 달려 있습니다.

아무리 보더라도이 이동 동작은 과도하게 설계되어 은 아무 효과가 없습니다. 타이밍과 다른 동작 동작을 더 잘 이해하기 위해 actions article in the SK Programming Guide을 읽어 보시기 바랍니다.

관련 문제