2010-05-21 6 views
1

애니메이션을 순서대로 재생하려고하지만 for 루프로 재생할 때 문제가 있습니다. 배열의 오브젝트 목록을 반복합니다.objecive에서 순차적으로 애니메이션 재생

는 배열을 통해 이동하지만 그것은 단지 마지막 재생 각각 재생되지 않습니다 ...

-(void) startGame { 
    gramma.animationDuration = 0.5; 

    // Repeat forever 
    gramma.animationRepeatCount = 1; 
    int r = arc4random() % 4; 
    [colorChoices addObject:[NSNumber numberWithInt:r]]; 

    int anInt = [[colorChoices objectAtIndex:0] integerValue]; 
    NSLog(@"%d", anInt); 
    for (int i = 0; i < colorChoices.count; i++) { 

     [self StrikeFrog:[[colorChoices objectAtIndex:i] integerValue]]; 
     //NSLog(@"%d", [[colorChoices objectAtIndex:i] integerValue]); 
     sleep(1); 

    } 
} 

정말 빠르고 잠이 수 있도록 아무것도하지 않는 전체 사이클을 통해 이동 그것은 각 애니메이션을 재생할 ... 어떤 제안?

답변

0

실행 루프가 처리 할 수 ​​있도록 NSTimer를 사용하십시오. startGame이 반환 될 때까지 그리기가 시작되지 않습니다.

편집 :

-(void) myTimerMethod:(NSTimer *)inTimer { 
    if (mPosition < [colorChoices count]) { 
    [self StrikeFrog:[[colorChoices objectAtIndex:mPosition] integerValue]]; 
    mPosition += 1; 
    } else { 
    [inTimer invalidate]; 
    } 
} 

그것을 시작하려면 :

mPosition = 0; 
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTimerMethod:) userInfo:nil repeats:YES]; 

당신을 통해 타이머 중간에 중지 필요에 따라 당신이 그것을 무효로 할 수 있습니다에 대한 참조를 유지 할 수 있도록해야하는 경우

.

+0

흠 나는 어떻게 그럴 수 있습니까? 몇 가지 NSTimer 예제를 보았지만 제대로 사용할 수있는 방법을 아직 배우지 못했습니다. 그것은 꽤 의미가 있습니다. 왜냐하면 나는 약간 성가신 것을 발견 한 시퀀스의 마지막 애니메이션만을 재생했기 때문입니다. 타이머가 루프 내부에서 실행되어야합니까? 또는 일부 유형의 글로벌 타이머로 실행되어야합니까? – Ohmnastrum

+0

일부 문서를 찾았으므로 for 루프를 타이머로 대체 한 다음 조건이 충족 될 때이를 무효화했다고 생각합니까? – Ohmnastrum

+0

이것은 훌륭해 보인다! 나는 지금 당장 내 맥을 가지고 있지 않지만 확실히 이것을 시도해 보겠다. ^^ – Ohmnastrum

0

나는 무엇이 잘못 되었는가에 대해서는 의심 스럽지만, "옳은"방법에 따라 "옳은"것을 고쳐야할지 모르겠다. 무슨 일이 일어나는지는 간단합니다 - 목표 C는 함수를 호출하지 않고 메시지를 전달합니다. [self StrikeFrog]를 할 때 대기열에 메시지를 놓으면 대기열을 비울 수 있습니다. StrikeFrog가 잠자기 전에 호출되지 않기 때문에 - 대기열 스레드가 차단 해제 될 때마다 호출됩니다. 예를 들어, 단일 스레드 응용 프로그램에서 net effect는 (colorChoices.count) 초 동안 대기 한 다음 for 루프를 종료 한 후 StrikeFrog 이벤트를 모두 실행하는 것입니다. 이는 이벤트 대기열에서 처음으로 보낼 수 있기 때문입니다 너의 사건들. 즉, Obj C의 모든 "함수 호출"은 얼마나 많은 스레드가 사용되고 있더라도 비동기입니다.

나는 CoreAnimation을 사용하여 C보다 낮은 레벨 또는 더 높은 레벨로 진행할 것을 제안합니다. 이들 중 어느 것도 적합하지 않은 경우, NSObject performSelector:withObject:afterDelay:을 시도해 볼 수 있습니다. 일정 지연 후에 각각의 이벤트가 실행됩니다. 이 방법에는 해결해야 할 문제가 많으므로주의하십시오.

+0

drawnonward의 제안이 performSelector보다 낫습니다 - 타이머를 사용하면 이벤트 대기열에서 벗어나서 다음 이벤트를 대기열에 넣을 수 있습니다. – Matt

관련 문제