Skip to content

Fever Mode

Song edited this page Jul 31, 2021 · 4 revisions

2021-07-24

by Song

Step 1 - Flow

흐름도

fever flow
  • 📱 Game View Controller ➡️ 🛠 Game View Model - 사용자의 버튼 Input 전달 (오른쪽 or 왼쪽)
  • 🛠 Game View Model ➡️ ⏰ Time Manager - Correct / Wrong 판단하여 각 상황에 맞는 Time Manager 메소드 호출
  • ⏰ Time Manager ➡️ 🔥 Fever Manager - Correct / Wrong 상황에 따른 시간(게이지) 업데이트 지시
  • 🔥 Fever Manager ➡️ ⏰ Time Manager - 피버 게이지 상황에 따라 피버 모드 On / Off 판단 전달
  • ⏰ Time Manager ➡️ 🛠 Game View Model - 타임 모드 (normal / fever) 전달
  • 🛠 Game View Model ➡️ 📱 Game View Controller - 피버 타이머가 필요한지 전달

Step 2 - Logic

연속 입력 성공 시 피버 모드로 진입

  • 게임 세팅 값으로 피버 게이지 최대치와 피버 진입 시 주어지는 피버 타임을 설정
enum GameSetting {
    static let feverGaugeMax = 20
    static let feverTime = 10
}
  • 사용자 액션이 Correct인 경우 Fever Manager의 현재 피버 게이지를 1 올리도록 함
  • Wrong인 경우 Fever Manager의 피버 게이지를 0으로 리셋
  • 1초가 지날 때마다 피버 게이지를 1씩 감소시킴
  • 현재 피버 게이지가 feverGaugeMax과 같아지면 Fever Mode를 발동시킴

Step 3 - View

피버 모드 진입 시 전용 Time View 노출

  • Stack View 안에 Normal Time View / Fever Time View 배치
  • 각 모드에 따라 다른 View를 Hidden 처리
  • Height는 두 View 모두 Stack View 높이와 같게 지정하되, 한 View의 priority를 더 낮게 설정하여 Hidden 상태에 따라 Stack View에 꽉 차도록 설정
timer stack view

Step 4 - Animation

피버 모드 중 배경 레이어 애니메이션 구현

  • Timer Mode 변경 시 Start / Stop하도록 구현
  • CAKeyframeAnimation로 배경 색상 애니메이트
  • Pause & GameOver Scene에서 생성한 ReplicateAnimationView를 subclassing하여 재사용
final class GameBackgroundView: ReplicateAnimationView {
    func startFever() {
        backgroundAnimation(duration: 5, colors: feverColors, repeatCount: .infinity)
        draw(withImage: .fever, countPerLine: 2.5) // superclass의 메소드
    }

    func stopFever() {
        layer.sublayers?.forEach({ sublayer in
            sublayer.removeFromSuperlayer()
        })
    }
}

결과

Clone this wiki locally