순발력 구분 게임 어플 만들기에 대한 기획서 내용은 아래 링크에서 확인하실 수 있습니다.
https://developer-p.tistory.com/168
최종 결과물
개발하면서 참고했던 링크들도 모두 함께 첨부합니다.
구현페이지
첫 번째 페이지(StartViewController - StartVC)
Navigation Controller - 네비게이션 바 숨기기
// 참고 : https://faith-developer.tistory.com/31
// StartVC에선 네비게이션바가 안보이게 하고,
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
// gameVC에선 네비게이션바가 보이게 설정.
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
두 번째 페이지(ViewController - gameVC)
타이머 재생 방법
Q. 타이머 메모리 누수가 있는 거 같다. 아닌가?
→ 누수 있는 거 맞다. 누수를 잡기 위해선 self.weak (?) 약한참조를 해주면 된다. 이 부분에 대해선 추후에 말할 기회가 있을 것. 약한참조를 해주면 많은 부분이 해결된다.
(아래는 제공받은) 타이머 코드
더보기
더보기
// MARK: - Properties
var vTimer: Timer? // 인증번호 타이머
var totalTime: Int = 180 // 인증번호 시작 03:00
/** 타이머 시작버튼 클릭 */
@objc func onTimerStart(_ sender: Any) {
if let timer = vTimer {
//timer 객체가 nil 이 아닌경우에는 invalid 상태에만 시작한다.
if !timer.isValid {
/** 1초마다 timerCallback함수를 호출하는 타이머 */
vTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerCallback), userInfo: nil, repeats: true)
} else { // 타이머 실행중에 다시 타이머를 실행했다면, 기존의 타이머를 멈추고 난 후, 실행한다.
timer.invalidate()
self.totalTime = 180
vTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerCallback), userInfo: nil, repeats: true)
}
}else{
//timer 객체가 nil 인 경우에 객체를 생성하고 타이머를 시작한다.
/** 1초마다 timerCallback함수를 호출하는 타이머 */
vTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerCallback), userInfo: nil, repeats: true)
}
}
/** 타이머 종료버튼 클릭 */
func onTimerEnd(_ sender: Any) {
if let timer = vTimer {
if(timer.isValid){
timer.invalidate()
}
}
totalTime = 0
}
//타이머가 호출하는 콜백함수
@objc func timerCallback(){
totalTime -= 1
print("DEBUG: \(totalTime)")
}
}
이미지 같은지 비교 시, (기준이미지 ↔ queueElement1 비교 시)
// leftStandard.image == queueElement1.image로 하면 안되고,
if leftStandard.image?.pngData() == self.queueElement1.image?.pngData() { // 좌측 기준과 맨밑이미지가 같다면,
score += 100 // 득점.
print(score)
}
https://stackoverflow.com/questions/54818497/swift-compare-multiple-images-to-an-array-of-images
- Q. 화면을 그리는 작업은 DispatchQueue.main.async에서 해야 한다고 배웠는데, (저 코드를 쓰지 않고) 그냥 클릭할 때 마다 이미지 변경을 해도 똑같이 잘 된다. 혹시 차이가 무엇인가?
→ uicomponent 값이 바꼈다는건 이미 메인쓰레드다. 따라서 디스패치큐를 하지 않아도, ios에서 메인쓰레드가 알아서 해준다.- But,
메인쓰레드에 위치해 있지 않고, (백그라운드 같은) 다른 쓰레드에 가 있을 때 DispatchQueue.main.async를 통해 화면을 그려줌. (네트워크 등에서 활용될 일이 많다.)- 참고 : 메인 액터
오디오 파일 재생 방법
https://zeddios.tistory.com/269
세번째 페이지
- ? 버튼 클릭 시, 알람 띄우기 - 최종점수 계산식 표시
: 최종 점수 = 획득 점수 + 게임 진행 시간(1초당 1점 | 최소 0점 ~ 최대 60점)
https://urbangy.tistory.com/21
프로젝트에 사용된 전체 코드는 아래 링크에서 확인할 수 있습니다.
https://github.com/SuminPark-developer/4week_DivisionGame
반응형
최근댓글