2017-10-03 7 views
2

나는 권투 시뮬레이션을 만들었고 이제 애니메이션을 추가하려고합니다. 이제, "Ref 's Countup"을 추가하여 미결 상태를 추가합니다. 나는 수많은 것을 시도했지만, 아무도 내가 원하는 것을 얻지 못했습니다.복싱 카운트 업/지연/타이머

Thread.sleep(forTimeInterval: 1) 
knockdownNumber.text = "\(knockdownNumberInt)" 

sleep(1) 
knockdownNumber.text = "\(knockdownNumberInt)" 

사람들은 UI를 일시 정지 : 나는이 시도했다. 그래서 그들은 적절한 시간을 기다렸지 만 본문은 변경하지 않았습니다. 다음은 모두 한 번만 계산됩니다 (즉, 1, 3 또는 1, 8).

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

func delay(_ delay:Double, closure:@escaping()->()) { 
    DispatchQueue.main.asyncAfter(
     deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC), execute: closure) 
} 

같은 지연 기능

delay(1) { 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

I는 (이들 모두에서) 함수를 호출하는 방법은 이후 그는 최저를 얻는다. 이 코드는 다음과 같습니다.

knockdownNumber.text = "1" 
    knockdownNumberInt = 1 
    downSec() 
    knockdownNumberInt = knockdownNumberInt + 1 
    downSec() 
    knockdownNumberInt = knockdownNumberInt + 1 
    downSec() 
    if fighter2.endurance < 400 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 300 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 200 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 100 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 0 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < -100 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 

나는 정말 당황 스럽다.

답변

1

이 접근 방식을 거의있다 :

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in 
    self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
} 

당신이해야 할 모든 truerepeats을 설정하고 타이머가 영원히 반복됩니다.

이제 타이머를 중지 할시기를 결정해야합니다. 새로운 시간을 시작하는 동안 knockdownNumberInt을 감소시키면서 타이머를 시작하기 전에이를 결정해야합니다. 이것은 타이머의 클로저에 넣은 것들이 비동기이기 때문에 작동하지 않습니다.

그래서 우리는 우리가 카운트 업 무슨 수를 결정 :

knockdownNumber.text = "1" 
knockdownNumberInt = 3 
if fighter2.endurance < 400 { 
    knockdownNumberInt += 1 // use the "+=" to make it cleaner! 
} 
if fighter2.endurance < 300 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 200 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 100 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 0 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < -100 { 
    knockdownNumberInt += 1 
} 

클래스에 currentCountDown라는 속성 선언 :

var currentCountDown = 1 

그런 다음이처럼 타이머를 만들 수 있습니다

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] (timer) in 
    guard let `self` = self else { // I added this to prevent a retain cycle. 
     timer.invalidate() 
     return 
    } 
    self.currentCountDown += 1 
    self.knockdownNumber.text = "\(self.currentCountDown)" 
    if self.currentCountDown == self.knockdownNumberInt { 
     timer.invalidate() 
    } 
} 
+0

하나의 문제는 카운트가 완료 될 때까지 코드를 일시 중지하지 않는다는 것입니다. 그렇게하는 방법이 있습니까? – Peter

+0

@ 피터해야합니다. 나는'timer.invalidate'를 호출했습니다. – Sweeper

+0

하나 더 문제가 있습니다. 건너 뛰기 카운트 버튼을 누르고 다른 사람이 무너지면 카운트는 영원히갑니다. 건너 뛰기 버튼에서 카운트를 취소 할 수있는 방법이 있습니까? 고마워, Peter – Peter