2009-10-27 2 views
1

저는 코코아/Objective-C/iPhone SDK를 배우고 있으며, 배운 것을 적용하는 간단한 프로젝트로서 이전의 Simon 게임의 간단한 버전을 만들고 싶습니다. 네 가지 색깔의 단추, 당신은 시퀀스 (빨강, 초록, 파랑, 빨강, 등)을 표시하고 다시 시퀀스를 반복해야합니다.간단한 Simon 복제본 만들기 : 업데이트 간 대기 방법은 무엇입니까?

나는 그 중 대부분을 알아 냈는데 하나의 조각을 제외하고는 사용자에게 시퀀스를 보여 주었다고 믿는다. 특히, & 단추를 강조 표시하는 것과 200ms 후에 정상으로 다시 설정하는 것 사이에 지연을 구현하는 방법.

주 실행 루프에서 잠을 자면 (심지어 명시 적으로 setNeedsDisplay을 호출하더라도) 업데이트가 제대로 수행되지 않습니다. 새 스레드를 생성하면 클래스 메서드에서 UI 요소 (즉석 변수)를 다시 참조해야하므로 상황이 빠르게 복잡해집니다.

어떤 조언이 필요합니까?

+0

명확히하기 위해, 이것은이다 게임 참조 할 곳 : http://en.wikipedia.org/wiki/Simon_%28game%29 – Bill

답변

-1

Core Animation 프레임 워크의 문서를 읽으십시오.

0

"simon"은 매우 간단한 MIDI 시퀀서입니다. 따라서 CoreAudio 프레임 워크, 특히 실시간 클럭 기능을 살펴 보는 것이 좋습니다.

5

UIView에서 +setAnimationStartDate: 메서드를 사용하여 일부 애니메이션을 설정할 수 있습니다. 애니메이션을하는 동안 아무도 단추를 누르지 않게하려면 애니메이션 시작시 -[UIApplication beginIgnoringInteractionEvents]으로 끝나고 -[UIApplication endIgnoringInteractionEvents]을 호출하십시오.

내가 이야기하고의 작성 - 인 - 더 - 텍스트 필드 예 :

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
button1.highlighted = YES; 

[UIView beginAnimations:@"" context:nil]; 
[UIView setAnimationStartDate: CFAbsoluteTimeGetCurrent() + 0.2]; 
[UIView setAnimationsEnabled:NO]; 
button1.highlighted = NO; 
[UIView commitAnimations]; 

[UIView beginAnimations:@"" context:nil]; 
[UIView setAnimationStartDate: CFAbsoluteTimeGetCurrent() + 0.25]; 
[UIView setAnimationsEnabled:NO]; 
button2.highlighted = YES; 
[UIView commitAnimations]; 

// etc. 

[[UIApplication sharedApplication] performSelector:@selector(endIgnoringInteractionEvents) withObject:nil afterDelay:yourTotalDelay]; 
+0

감사합니다! 내 계획은 시퀀스를 표시하는 동안 버튼을 비활성화하는 것이었지만 beginIgnoringInteractionEvents는 훨씬 더 좋은 방법입니다. NSTimers 사용을 고려했지만 지연 문제입니다. 나는. 붉은 색 버튼을 강조 표시하고, 200ms를 기다리며, 정상으로 변경하고, 50ms를 기다리며, 파란색을 높이 표시하고, 200ms를 기다리며, 정상으로 변경하고, 50s를 기다립니다. 스레드를 잠자기하면 UI 업데이트가 전파되지 않습니다. setNeedsDisplay 호출). – Bill

+0

반복 타이머 대신 매번 반복하지 않는 타이머를 예약하고 싶을 것입니다. -performSelector : withObject : afterDelay : 매우 유용합니다. –

+1

사실, 방금 UIView에서 + setAnimationStartDate : 메서드를 사용하여이 모든 작업을 한 번에 설정하고 마지막에 단일 타이머를 사용하여 상호 작용을 다시 활성화 할 수 있음을 알았습니다. 훨씬 더 간단합니다. –

관련 문제