2008-11-13 6 views
3

현재 게임용 메뉴 시스템을 만들려고하고 있으며 실제로 어떤 사운드 방식으로도 만들 수 없습니다. 몇 가지 메뉴 화면이 있습니다. 각 메뉴 화면은 별개의 클래스가 아닌 별도의 클래스로 유지하려고합니다. 내가 겪고있는 주된 문제는이 메뉴 화면 사이에서 제어권을 넘기는 것입니다.OOP : 메뉴 시스템 설계

각 스크린을 싱글 톤으로 구현하고 다른 스크린에서 하나의 스크린을 직접 호출하려고했습니다. 목표 C에서 [[MainMenu instance] display]과 비슷한 것입니다. 이것은 (1) 메뉴 스크린마다 싱글 렛 상용구 코드를 작성해야하고 (2) 클래스가 서로 의존적이되기 때문에 때로는 원형 주위를 코딩해야하기 때문에 약간 지저분합니다. 종속성 등등.

나는 인스턴스 관리 (이 경우 약간의 추가로 각 화면의 인스턴스가 실제로 하나이기 때문에)를 해결하기 위해 완전히 정적 인 클래스를 만드는 것에 대해 생각했다. 하지만 Objective C가 클래스 변수를 "012"를 선언하여 "위조 (fake)"해야 할 때 특히보기 흉한 것 같습니다. static.

그런 다음 인스턴스를 만들고 컨트롤을 전달하는 "관리자"클래스에 대해 생각했지만 추가 클래스를 도입하면이 클래스가 Manager라는 이름을 가진 경우 문제를 해결할 수 있는지 확실하지 않습니다.

내가 을 수행해야한다는 것을 알아 두어야한다.에는 작동 시스템이있다. 단지 기분이 좋지 않다. 어떤 코드 중복이 발생한다는 것을 의미합니다.주의하지 않으면 문제가 발생할 수 있습니다. 어떤 아이디어? 나는 이것이 명확하지 않다는 것을 알고 있기 때문에 토론은 아마 더 많은 브레인 스토밍이 될 것이지만 어쨌든 그들이 내 문제를 철저히 해결하지는 않더라도 어쨌든 나는 그 아이디어에 흥미가있다.

업데이트 : 감사합니다. 내가 마지막으로 수행 한 작업 :

ScreenView이라는 인터페이스 아래에 맞도록 메뉴 내용 (버튼, 그래픽 등)을 수정했습니다. 나는 모든 특정 메뉴 화면을 버리고 표시 파단의 목록을 받아 모두를 처리하는 일반 메뉴 화면을 생성 할 수 있었다이 프로토콜에

@protocol ScreenView 

- (void) draw; 
- (BOOL) handlesPoint: (CGPoint) p; 

- (void) appearWithAnimation; 
- (void) disappearWithAnimation; 
- (BOOL) hasFinishedAnimating; 

@optional 

- (void) fingerDown; 
- (void) fingerUp; 

@end 

감사 :이은 다음과 같습니다 일반적인 인터페이스입니다 그리기, 전환, 이벤트 등과 같은 프레젠테이션. 이 일반 메뉴 화면은 서브 클래 싱을 많이하지 않습니다. 대부분의 메뉴 화면은 서브 뷰 목록을 표시하기 만하면 행복하기 때문입니다. 이것은 MVC의 V입니다.

그런 다음 특정 메뉴 화면에 대한 모든 이벤트를 처리하는 컨트롤러 클래스도 만들었습니다. (명백히 MVC의 C) 루트 컨트롤러 클래스는 인스턴스 관리, 메뉴와 기타 작은 것들 사이의 전환을 처리합니다. 대부분의 메뉴 화면은 버튼과 다른 하위 뷰의 이벤트를 처리하는 컨트롤러의 사용자 정의 하위 클래스를 가져옵니다.

클래스 수가 많았지 만 코드가 훨씬 깔끔하고 반복되지 않으며 오류가 적습니다. 인스턴스 관리는 여전히 완벽하지는 않지만 디자인에 상당히 만족합니다. 다시 한 번 대답 한 모든 사람들에게 감사하십시오.

답변

4

나는 괜찮은 디자인을 배웠고, 항상 코드에서 데이터를 분리했다. 이것은 귀하의 특정 문제에 대해 WONDERS를 수행 할 것입니다.

이것은 메뉴 항목 (문자열)과 메뉴 간의 관계를 배열이나 별도의 파일에 저장하고 배열로 읽어야한다는 의미입니다.

그런 다음이 배열을 사용하여 모든 메뉴 클래스를 인스턴스화합니다.

코드를이 코드로 다시 코딩하면 (모든 코드를이 코드로 완성했습니다) 모든 코드가 제자리에 놓이게되고 메뉴 코드의 90 %가 제외됩니다 (각 메뉴는 더 이상 사용하지 않습니다). 그것은 자신의 클래스 일뿐입니다. 고유 한 데이터로 인스턴스화 된 동일한 클래스

메뉴 항목의 대상은 메소드 포인터 또는 클래스 인스턴스로 "데이터"에도 저장됩니다.

2

MenuManager 클래스를 사용하는 것이 좋습니다. 모든 메뉴 화면이 파생되는 하나의 메뉴 기본 클래스를 가지며 관리자는 현재 활성 메뉴 화면에 대한 포인터를 갖습니다. 예를 들어 임의의 메뉴 화면 호출에서 메뉴 화면의 뒤로 단추를 쉽게 사용할 수 있도록 이전 메뉴 화면을 추적 할 수도 있습니다. 어쩌면 그냥 std :: vector를 사용하면 돌아갈 때 이전 메뉴 화면을 다시 만들 필요가 없습니다. 이렇게하면 고급 하위 메뉴가있는 옵션 메뉴 에서처럼 입력 된 정보가 손실되는 것을 방지 할 수 있습니다.

1

메뉴의 모든 내용을 사전에 넣고 plist에 덤프하고 메뉴 화면에서 필요한대로 각각을 읽는 것이 가장 간단한 방법 일 수 있지만 솔직히 말해서 MVC 중심의 해결 방법을 고려해야합니다 문제. 화면은 데이터를 저장하는 것이 아니라 데이터를 표시하기위한 것이어야합니다. 뷰에서 데이터를 완전히 분리하면 문제가 해결됩니다.