[SpriteKit] 고양이 퍼즐 게임 기능추가 chapter.03

Emily·2025년 6월 18일
0

GridPopGame

목록 보기
8/8
post-thumbnail

추가, 개선할 부분이 많은 고양이 게임이지만 출시용이 아닌 학습용 프로젝트였기 때문에 마지막 효과 하나만 추가하고 마무리를 지어보려 한다. 주변에 똑같은 고양이가 없는 1개짜리 고양이를 탭했을 경우 좌우로 살짝 흔들리며 miss 판정이 좀더 명확히 인식되도록 효과를 넣을 것이다.(기존에는 무반응이었다) 굉장히 간단하기 때문에 매우 짧은 포스팅이 될 거 같다.

01) 좌우로 떨리는 액션 정의하기

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로 묶어주었다.

02) 메소드 호출하기

노드 주변 검사 결과 매칭 노드가 1인 경우의 guard문에 정의한 메소드를 호출해주었다.

private func removeMatches() {
	guard let matchedItems.count > 1 else {
    	trembleSingleItem(matchedItems.first)
        return
    }
    
    // ... //
}

겪었던 문제들 기록

  1. 사실 처음에는 이 액션을 구현할 때 moveBy 또는 move(by: ) 액션을 사용하려고 했다가 실패했다.

https://developer.apple.com/documentation/spritekit/action-initializers

이 두 액션은 노드의 현재 위치 기준으로 입력한 값만큼 이동시켜준다. (내가 최종적으로 사용한 moveTo 메소드는 상대값이 아닌 위치의 좌표를 전달해주어야 한다.) 그런데 이상하게도 이 메소드로는 애니메이션이 제대로 작동하지 않았다. 어떻게든 해보려고 이렇게저렇게 해도 실패했다. 입력한 값과 이동거리가 일치하지 않는다거나, 아예 움직이지 않는다거나, sequence의 첫번째 액션만 작동한다거나 여러가지 현상을 보이며 나를 답답하게 했다.

클로드 말에 따르면 이 이상한 현상이 SpriteKit의 고질적인 문제라는 거 같다. 솔직히 좀 어처구니가 없었다. 다른 작업물에서 grid item이 아닌 단일 노드로는 move(by: )메소드가 잘 작동했기 때문에 언제 잘되고 언제 안되는 건지 조건도 감이 오지 않는다. 그때그때 먹히는 걸 찾아서 사용해야 하나보다.

  1. duration에 비해 이동거리가 너무 길면 액션 시퀀스가 제대로 작동하지 않는다. 사실 0.15초가 아니라 0.1초로 각 액션의 길이를 설정했었는데 시퀀스의 일부만 작동하는 등 제대로 작동하지 않았다. 이동거리가 10일 때는 0.35는 되어야 작동한다. 처음에 10으로 맞추고 작동하는 시간을 찾다가 너무 느려서 이동거리를 5로 줄였다.
profile
iOS Junior Developer

0개의 댓글