2009-07-04 4 views
2

오래된 UI를 다시 구현하려고합니다. 좀 더 멋진 UI를 사용하여 글을 올렸습니다. Reversi board game 저는 Jens Alfke의 GeekGameBoard 코드에서 영감을 얻었습니다. CALayers는 UI 구현 방법과 비슷합니다.모델 및 컨트롤러를 CALayer 기반 UI와 별도로 유지하는 방법은 무엇입니까?

그러나 GeekGameBoard 코드에서 모델과 뷰를 명확하게 구분할 수는 없습니다. 모델 은보기가이므로 AI 플레이어에 대한 게임 트리 검색을 수행하기 위해 예를 들어 게임 상태의 복사본을 만들기가 어렵습니다. 그러나, 나는 두 개의 병렬 그리드를 유지하기위한 지속적인 전투를 포함하지 않는 모델과 뷰의 분리를 가능하게하는 구조에 대한 대안적인 방법을 생각해 낼 수없는 것처럼 보인다 (모델의 경우, 뷰의 경우 하나) 동기화합니다. 물론 이것은 고유 한 문제가 있습니다.

AI 검색 친화적 인 모델 구조와 디스플레이 친화적 인보기 간의 관계를 가장 효과적으로 구현하려면 어떻게해야합니까? 모든 제안/경험은 인정 될 것입니다. 나는 "좋은 대답은 없습니다. 당신이 할 수있는 한 최선을 다해 대하십시오"라고 말하면서 놀랄 준비가되어 있습니다.


답변 해 주셔서 감사합니다. 그러나 나는 그것을 완전히 이해하고 있는지 잘 모르겠습니다. 나는 당신이 조각을 옮기고 심지어는 제거하는 초기 세트를 가지고 있다면 사람이 새로운 조각을 집어 넣을 때 어떻게 될까? 다음과 같이 작동합니까?

  1. 보기에서 사용자가 클릭합니다.
  2. View를 보드 위치로 변환하면 컨트롤러에 통지됩니다.
  3. 컨트롤러가 후임자 상태로 새 보드를 만듭니다 (해당되는 경우 합법적 인 이동이었습니다).
  4. 뷰는 바인딩을 통해 새 보드를 선택하고 기존 뷰/계층 계층 구조를 찢어 버리고 현재 상태로 바꿉니다.

맞습니까?

PS : iPhone 또는 Mac 용인지 여부를 지정하지 못해 죄송합니다. 저는 iPhone에서 작동하는 것에 가장 관심이 있습니다. 그러나 Mac에서 처음으로 제대로 작동하도록 할 수 있다면 iPhone에서 직접 작업 할 수있는 솔루션을 채택 할 수있을 것이라고 확신합니다. (또는 새로운 질문을 게시하십시오!)

+0

아니요, 새 보드를 만들지 않으실 겁니다. 당신은 새로운 조각을 만들어 그것을 보드에 추가 할 것입니다. 보드에서 두 단계 중 하나를 수행할지 (즉, 컨트롤러가 보드에 "x, y로 새 조각 만들기 및 추가"를 지시하게하십시오) 또는 별도로 (즉 컨트롤러가 조각 자체를 만든 다음 이사회에 전달). –

+0

iPhone에서 내 제안을 사용할 수는 있지만 Bindings가 없으므로 KVO를 직접 사용해야합니다. 보드 레이어는 보드의 속성을 관찰하고 조각 레이어는 각각의 조각의 속성을 관찰합니다. 너무 고통스러워서는 안된다. 그러나 나는 그것을 시도하지 않았다. –

답변

2

이론적으로 NSView 기반 UI와 동일해야합니다 : 모델 속성 (또는 속성)을 추가하고 바인딩을 모델로 추가 한 다음 뷰를 바인딩합니다. (레이어)를 컨트롤러를 통해 모델에 연결합니다.

예를 들어, 보드 클래스에 Pieces가있을 수 있습니다 (각 Pieces는 플레이어를 소유 한 플레이어에 대한 참조를 가짐). 모든 클래스는 모델 클래스입니다. 귀하의 컨트롤러는 Board를 소유하게되며, 귀하의 View/Layer는 Board를 표시 할 수 있으며 각 Piece에 대한 하위보기/하위 레이어가 가능합니다.

컨트롤러의 board 속성에 보드보기/레이어를 바인딩하고 해당 속성에 대한보기/레이어 설정자에서 각 부분에 대한 하위보기/하위 레이어를 만들고 그 부분의 모든 속성에 바인딩합니다 필요합니다. (기본 뷰/레이어의 보드를 교체 할 때 모든 하위 뷰/하위 레이어를 바인딩 해제하고 제거하는 것을 잊지 마십시오.)

조각을 이동하거나 수정하려면 고유 한 속성을 사용합니다. 뷰/레이어의 속성 액세스로 변환됩니다.표면 상으로는 레이어의 속성을 설정하여 변경 사항을 애니메이션으로 만들 수 있습니다 (예 : Piece의 position을 변경하면 그에 따라 레이어가 변경됩니다).

이사회에서도 마찬가지입니다. 사용자가 타일 색상 중 하나 또는 두 가지를 변경하도록 할 수 있습니다. 게임 컨트롤러를 통해 Board 객체에 색상을 바인딩하고 동일한 보드의 동일한 속성에 바인딩 된보기/레이어를 사용하여 변경 사항을 자동으로 선택합니다.

면책 조항 : 저는 Core Animation을 사용한 적이 한번도 없습니다. 코코아 대신 코코아 터치에 관해 묻는다면 코코아 바인딩에 의존하기 때문에 위의 해결 방법이 작동하지 않습니다.

0

저는 거의 모든 인터페이스가 Core Animation CALayers를 사용하여 구성되었고, 저는 Peter가 설명한 것과 매우 유사한 패턴을 사용합니다. an iPhone application이 있습니다. CALayers를 마치 NSViews/UIView처럼 취급하고 모델 객체를 통해 컨트롤러와 데이터를 통해 로직을 관리하고자한다는 점에서 그는 정확합니다.

필자의 경우 컨트롤러 개체의 계층 구조를 만들어 모델 개체 (모델 구성 요소를 분리 할 수있는 리팩토링 도구) 역할을합니다. 각각의 컨트롤러 오브젝트는 CALayer를 관리하기 때문에 모델 컨트롤러의 계층에 대한 병렬 CALayer 디스플레이 계층이됩니다. 내 응용 프로그램의 경우이 계층 구조를 사용하여 생성 된 방정식에 대한 계산을 수행해야하므로 컨트롤러의 계산 된 값을 트리의 위쪽에서 위로 제공합니다. 컨트롤러는 또한 새 하위 작업 삽입 또는 작업 트리 삭제와 같은 사용자 편집 이벤트를 처리합니다.

CALayer 트리가 터치 또는 마우스 이벤트에 응답 할 수 있도록 레이어 호스팅 뷰 클래스를 만들었습니다.이 소스는 Core Plot 프로젝트에서 사용할 수 있습니다. 귀하의 보드 게임 예를 들어, CALayer 조각 터치 이벤트에 걸릴 수 있으며 자신의 컨트롤러가 백 엔드 로직 (합법적 인 움직임을 결정 등) 관리 할 수 ​​있습니다. 움직일 때마다 모든 것을 찢지 않고 동일한 컨트롤러를 유지하고 조각을 움직일 수 있어야합니다.

관련 문제