2014-07-18 3 views
0

방금 ​​확장 (예 : 대리자에서 bannerViewActionShouldBegin을 호출) 한 앱에 adBannerView를 구현하면 CALLayers에서 CAKeyFrameAnimations가 발생합니다 (기본 저글링 게임). 정의 된 베 지어 곡선)을 사용하여 해당 대리자에서 animationDidStop을 중단하고 호출합니다. 계속해서, 약 0.001 초마다 한 번 의미합니다.adBannerView가 펼쳐졌을 때 (계속해서) 베타 커브에서 CAKeyframeAnimation이 멈 춥니 다.

나는 내 게임에 이미 일시 정지 메서드를 구현했다. UIButton에 연결된 동작을 통해 호출 될 때 각 볼 개체의 CALayer 속도를 0.0으로 설정하여 애니메이션 중간에 효과적으로 중지한다. 게임이 일시 중지되었는지 여부를 정의하는 부울 조건이 있습니다.이 조건은 메서드가 호출 될 때 실행되는 일시 중지 코드의 부분을 결정합니다.

- (IBAction)pauseButton:(id)sender { 
    if (isPaused == NO) { 
     isPaused = YES; 
     [_pauseButtonOutlet setImage:playButtonImage forState:UIControlStateNormal]; 
     [_pauseButtonOutlet setImage:playButtonImage forState:UIControlStateSelected]; 
     for (x = 0; x < [ballsArray count]; x++) { 
      [[ballsArray objectAtIndex:x] setTimeOffset:[[ballsArray objectAtIndex:x] convertTime:CACurrentMediaTime() fromLayer:nil]]; 
      [[ballsArray objectAtIndex:x] setBeginTime:CACurrentMediaTime()]; 
      [[ballsArray objectAtIndex:x] setSpeed:0.0]; 
     } 
     [_statusLabel setText:@"Paused"]; 

    } else if (isPaused == YES) { 
     isPaused = NO; 
     [_pauseButtonOutlet setImage:pauseButtonImage forState:UIControlStateNormal]; 
     [_pauseButtonOutlet setImage:pauseButtonImage forState:UIControlStateSelected]; 
     for (x = 0; x < [ballsArray count]; x++) { 
      [[ballsArray objectAtIndex:x] setTimeOffset:[[ballsArray objectAtIndex:x] convertTime:CACurrentMediaTime() fromLayer:nil]]; 
      [[ballsArray objectAtIndex:x] setBeginTime:CACurrentMediaTime()]; 
      [[ballsArray objectAtIndex:x] setSpeed:1.0]; 
     } 
     [_statusLabel setText:@""]; 

    } 

} 

이 방법은 또한 제공 (또는 그렇게 생각)을 adBannerView의 내용이 확장되는 동안에 응용 프로그램 활동을 중단 할 수있는 편리한 방법으로 다음은 코드입니다. 그러나 내가 찾은 것은 내가 인터페이스로 돌아 왔을 때, 내 CALayer 볼은 애니메이션이 끝날 때 (캐릭터가 그들을 잡는 지점)되지만 게임은 여전히 ​​일시 정지됩니다. 일시 중지를 해제하면 애니메이션이 새로 시작되는 것처럼 계속됩니다 (공이 떨어지면 애니메이션이 멈추고 반대 방향으로 새 애니메이션이 만들어 짐).

광고를 표시하는 동안 프리젠 테이션 레이어에 뭔가가 일어난다는 것을 알았습니다 (각 애니메이션의 시작 부분에서 CALayer 자체를 끝점으로 이동하지만 여전히 베 지어 곡선을 가로 질러 프리젠 테이션 레이어에 애니메이션을 적용합니다). 출발점에서부터). 하지만 빠른 NSLog 문을 내 animationDidStop 메서드에 추가 한 후에 (나는 "볼링"이라는 말은 총 4 개의 볼 클래스가 있고, 각각이 정의 된 경로를 통해 애니메이션을 만들도록 디자인되어 있으며 각각의 고유 한 animationDidStop 대리자 메서드를 가짐) 나는 이상한 이유는 모든 인스턴스화 된 볼의 중지 방법을 연속적으로 매우 가까운 간격 (~ .001s)이라고합니다. 이 활동은 광고가 닫힐 때 중단됩니다 (그리고 나는 bannerViewActionDidFinish를 사용하여 일시 중지 기능을 다시 호출하여 자동으로 게임을 다시 시작합니다).

나는 이것을 도와 주길 누군가를 사랑합니다. 나는 가상 솔루션을 공식화했다. (배너에서 멈출 때 볼 위치를 얻고, x와 y 값을위한 nsnumber 배열을 만들고, 컨트롤 포인트와 주 포인트가 동적으로 계산되는 베 지어 곡선으로 중단 한 지점에서 애니메이션을 다시 시작하지 않을 때) 그러나 이것은 애니메이션을 불규칙하고 표준 볼 애니메이션과 부합하지 않게 만듭니다. 정기적 인 일시 중지 방법처럼 중단 한 지점에서 애니메이션을 다시 시작할 수있게되어서 정말 고맙습니다.

이 모든 것을 읽어 주셔서 감사 드리며 모든 도움을 주시면 대단히 감사하겠습니다. 또한, 내 코드의 나머지 부분을보고 싶거나/원한다면, 나는 기꺼이 기꺼이하겠다.

업데이트 : 약간의 코드 고려 사항을 수행 한 후 배너 디스플레이가 애니메이션을 강제 중단하여 강제로 (볼 CALayer) 대리자의 animationDidStop 메소드를 호출하게되었습니다. 이 메서드는 자동으로 새 애니메이션을 만들기 때문에 new-stop-new-stop-new-etc의 무한 사이클이 만들어집니다. 이것은 또한 때로는 공이 예상되는 곳에 도착하는 경우가 종종있는 반면, 때로는 볼이 토지에 있어야하는 것과 반대쪽에있는 이유를 설명합니다.

여기에서 adBannerView를 확장하면 모든 CAAnimation이 강제 종료된다는 것을 알았습니다. 내가 이것에 관해 정확하다면, 그것 주위에 어떤 방법이 있습니까?

답변

0

어쩌면 레이어를 다시 시작할 때 애니메이션이 추가되었는지 확인할 수 있습니다. 아니요 인 경우 올바른 timeOffset을 사용하여 새 애니메이션을 추가 할 수 있습니다.

(x = 0; x < [ballsArray count]; x ++)에 비해 빠른 열거 형을 사용하지 않는 이유가 있습니까?

+0

나는 그런 식으로 생각하고있었습니다. 내 질문 : 애니메이션 레이어가 이미 애니메이션을 통해 진행되는 베 지어 곡선 애니메이션을 만드는 방법 ("시간 오프셋"이라는 의미로 가정). 그리고 열거하는 방법에 관해서는, 잘, 나는 몰라. 나는 객관적인 C에 들어가기 전에 BASIC과 C로 많은 일을했습니다. 나는 구식의 방법으로 편안함을 느낍니다. Lol. – ghostsax

+0

동일한 베 지어 곡선 애니메이션을 추가 할 수 있습니다. 그런 다음 애니메이션 timeOffset을 일시 중지 된 timeOffset으로 설정합니다. 이것은 (CALayer * ball in ballsArray)에 대한 의 obj c에서 열거하는 방법입니다. { [ball setTimeOffset : [ball convertTime : CACurrentMediaTime() fromLayer : nil]]; } –

+0

광고 배너가 열리기 전에 (bannerViewActionShouldBegin) 애니메이션 CALayers에서 "timeOffset"메서드를 호출 할 때 반환되는 double 유형의 숫자가 포함 된 "offsetsArray"에 NSNumber 값을 추가합니다. bannerViewActionDidFinish를 닫으면 원래의 베 지어 곡선 경로를 사용하여 각 레이어의 새 애니메이션을 만들고 다음을 수행합니다. 각 애니메이션의 시작 시간을 CACurrentMediaTime()으로 설정하고 속도를 1.0으로 설정하고 timeOffset 이전에 기록 된 번호로 그러나 여전히 작동하지 않습니다. 이 작업을 수행 할 구체적인 방법이 있습니까? – ghostsax