추가, 개선할 부분이 많은 고양이 게임이지만 출시용이 아닌 학습용 프로젝트였기 때문에 마지막 효과 하나만 추가하고 마무리를 지어보려 한다. 주변에 똑같은 고양이가 없는 1개짜리 고양이를 탭했을 경우 좌우로 살짝 흔들리며 miss 판정이 좀더 명확히 인식되도록 효과를 넣을 것이다.(기존에는 무반응이었다) 굉장히 간단하기 때문에 매우 짧은 포스팅이 될 거 같다.
private func trembleSingleItem(_ item: Item?) {
guard let item = item else { return }
let pointX = item.position.x
let moveToLeft = SKAction.moveTo(x: pointX - 5, duration: 0.15)
let moveToRight = SKAction.moveTo(x: pointX + 5, duration: 0.15)
let restorePosition = SKAction.moveTo(x: pointX, duration: 0.15)
let sequence = SKAction.sequence([moveToLeft, moveToRight, moveToLeft, moveToRight, restorePosition])
item.run(sequence)
}
탭된 노드의 x 좌표 값을 기준으로 왼쪽으로 5만큼 이동하는 액션, 오른쪽으로 5만큼 이동하는 액션 그리고 제자리로 이동하는 액션을 선언한 뒤 sequence
로 묶어주었다.
노드 주변 검사 결과 매칭 노드가 1인 경우의 guard
문에 정의한 메소드를 호출해주었다.
private func removeMatches() {
guard let matchedItems.count > 1 else {
trembleSingleItem(matchedItems.first)
return
}
// ... //
}
- 사실 처음에는 이 액션을 구현할 때
moveBy
또는move(by: )
액션을 사용하려고 했다가 실패했다.
https://developer.apple.com/documentation/spritekit/action-initializers
이 두 액션은 노드의 현재 위치 기준으로 입력한 값만큼 이동시켜준다. (내가 최종적으로 사용한 moveTo
메소드는 상대값이 아닌 위치의 좌표를 전달해주어야 한다.) 그런데 이상하게도 이 메소드로는 애니메이션이 제대로 작동하지 않았다. 어떻게든 해보려고 이렇게저렇게 해도 실패했다. 입력한 값과 이동거리가 일치하지 않는다거나, 아예 움직이지 않는다거나, sequence
의 첫번째 액션만 작동한다거나 여러가지 현상을 보이며 나를 답답하게 했다.
클로드 말에 따르면 이 이상한 현상이 SpriteKit
의 고질적인 문제라는 거 같다. 솔직히 좀 어처구니가 없었다. 다른 작업물에서 grid item이 아닌 단일 노드로는 move(by: )
메소드가 잘 작동했기 때문에 언제 잘되고 언제 안되는 건지 조건도 감이 오지 않는다. 그때그때 먹히는 걸 찾아서 사용해야 하나보다.
duration
에 비해 이동거리가 너무 길면 액션 시퀀스가 제대로 작동하지 않는다. 사실0.15
초가 아니라0.1
초로 각 액션의 길이를 설정했었는데 시퀀스의 일부만 작동하는 등 제대로 작동하지 않았다. 이동거리가10
일 때는0.35
는 되어야 작동한다. 처음에10
으로 맞추고 작동하는 시간을 찾다가 너무 느려서 이동거리를5
로 줄였다.