2010-04-14 3 views
3

저는 Mick West가 제공 한 'Evolve Your Hierarchy' 행을 따라 Objective-C를 사용하여 간단한 구성 요소 기반 게임 개체 아키텍처를 구현하려고했습니다. 이를 위해 메서드를 사용하여 Mike Ash가 작성한 'Objective-C Message Forwarding' 문서에 설명 된대로 몇 가지 아이디어를 성공적으로 사용했습니다.Obj-C 구성 요소 기반 게임 아키텍처 및 메시지 전달

기본 설정에는 인스턴스 변수로 구성 요소 클래스의 세 인스턴스 인 GCPositioning, GCRigidBody 및 GCRendering이 포함 된 컨테이너 GameObject 클래스가 있습니다. -(id)forwardingTargetForSelector: 메서드는 -(BOOL)respondsToSelector: 메서드를 사용하여 결정된 해당 선택기에 응답하는 구성 요소를 반환합니다.

모든 점에서 매력적으로 작용합니다. 구현 된 구성 요소 중 하나에서 구현 된 GameObject 인스턴스에 대한 메서드를 호출하면 작동합니다. 물론 문제는 컴파일러가 각 호출에 대해 '...에 응답하지 않을 수 있습니다.'라는 경고를 제공한다는 것입니다. 이제, 제 질문은 어떻게 이것을 피합니까? 그리고 특히 GameObject의 각 인스턴스마다 다른 구성 요소 집합이 있다는 사실에 관해서는? 어쩌면 개체 당 개체에 대한 컨테이너 개체를 사용하여 메서드를 등록하는 방법? 예를 들어, 어떤 종류의 -(void)registerMethodWithGameObject: 메서드를 만들 수 있습니까? 어떻게 그럴까요?

이제 코코아와 Objective-C를 처음 접했을 때가 멀었을 수도 있고 그렇지 않을 수도 있습니다. 근본적으로 말이죠.이 모든 것이 아주 외계인 일 수 있습니다. 당연히, 나의 특정한 문제점에 해결책을 아주 많이 알고 싶을 것이나, 이것을하기의 우아한 방법을 설명하는 것을 걱정할 누군가는 추가로 아주 환영받을 것입니다.

많은 감사, -Bastiaan

+1

불행히도 기술적으로 정확한 경고가 남을 것입니다. 컴파일러는 일치하는 메서드가 인터페이스에 선언되어 있지 않으면 개체가 실제로 응답하는지 여부를 확인할 수 없습니다. 즉, GameObject를'id'로 캐스팅하여 (못생긴) 또는 경고를 구성 옵션 (못생긴)으로 사용하지 못하게 할 수 있습니다. :/ –

+0

내 비슷한 질문에 대한 bbum의 대답을 참조하십시오. http://stackoverflow.com/questions/2259012/avoiding-compiler-warnings-when-doing-message-forwarding. 기본적으로 클래스에 범주를 선언하고 해당 범주에 전달 된 메서드를 넣습니다. – Felixyz

답변

2

컨테이너 객체를 모든 구성 요소의 메시지로 보내는 것이 Mick West가 제안한 것이라고 생각하지 않습니다. "모 놀리 식 게임 엔티티 객체"의 아이디어를 제거하는 데 도움이되지 않습니다.

최종 목표는 구성 요소가 컨테이너 객체없이 서로 직접 통신하도록하는 것입니다. 그때까지, 컨테이너 객체는 각 게임 엔티티에 대한 단일 객체와 새로운 구성 요소 - 구성 요소 시스템을 기대하는 오래된 코드 사이의 접착제 역할을합니다.

즉, 최종 제품에서 메시지 전달을 전혀 사용하지 않아도되므로 경고를 무시하거나 변수를 조용히하기 위해 변수를 id으로 선언하는 것은 그다지 추악하지는 않습니다. (기사에서 제시 한 계획은 결국 경고를 유발하는 코드를 제거하는 것입니다!)

0

그 경고 하는 것 사라지게하는 간단한 방법은 유형의 인스턴스 변수 컴파일러는 당신이 당신에 대해 무슨 일을하는지 알고 가정 id

그 방법을 선언 객체의 유형 및 객체가 사용자가 전송 한 메시지에 응답 할 것인지 또는 사용자가 상관하지 않는지 여부를 결정합니다.

0

GameObject의 -respondsToSelector: 메서드를 재정의하십시오. 구현시 각 인스턴스에 respondsToSelector: 메시지를 보내야하며 YES 중 하나가 반환되면 YES을 반환해야합니다.

+0

... 물론 다른 사람들이 제안한 것처럼 데이터 유형으로'id'를 사용하십시오. – jlehr

0

id 유형을 사용할 수도 있고 performSelector 메서드를 사용하여 메서드를 호출 할 수도 있고 인수가 복잡한 경우 NSInvocation을 만들 수도 있습니다. 그러나 이것은 컴파일러 경고를받는 방법 일뿐입니다. 객체가 여러 메소드에 응답하는 경우 동일한주의 사항이 적용되지만 프로토콜 선언이 도움이 될 수 있습니다.

0

문제를 올바르게 이해하는 다른 방법은 프로토콜을 구현하는 것입니다.

ID anObjectRef

컴파일러는 오브젝트 anObjectRef 참조하는 프로토콜에 부합한다는 것을 이해하는 방법이 자바에서 인터페이스 연결과 같은 변수가이 선언 될 수있다.

특정 객체가 전송 또는 할당되기 전에 특정 프로토콜을 준수하는지 여부를 알려주는 메소드가 있습니다.