프로그래밍/Design Patterns

box2d의 Testbed 유용한 디자인 패턴 정리

콘파냐 2014. 5. 20. 18:59
반응형

글쎄... 이 디자인 패턴은 어떤 이름일까 아직 모릅니다. 공부를 해나가다 보면 언젠간 알게 되겠지만....  직접 분석을 했기 때문에 나중에 알게 되겠지만, Box2D의 디자인 패턴은 참 유용하다는 생각이 드네요. 이런 유용한 패턴은 언젠가 꼭 필요할 수 있을것 같아서 정리해 둡니다.. 오픈 소스기 때문에 엔진 자체도 무척 가볍고 c++로 이루어진 결과물이기 때문에 객체지향 관점에서 배울점이 많은 소스입니다. 물론 제 입장에서 말입니다. 그래서 TestBed가지고 놀던중 내부 소스를 살펴 봤습니다. 한국에는 Box2D관련 자료가 턱없이 부족하기 때문에 그냥 혼자서 살펴봤습니다.

TestBed는 내부를 들여다보면  Test라는 주요 클래스가 있습니다.

Test를 상속받은 수많은 클래스가 존재합니다. 아래보시면 Tests은 Test클래스를 상속받은 녀석들입니다.

 

TestBed는 사용자들로 하여금 Test를 상속받아 자신이 원하는 물리계를 만들 수 있습니다. 단순히 Test만 상속받아서 자신의 클래스를 만들기만 하면 됩니다. TestBed를 사용하는 방법은 따로 할애해서 포스팅을 해야 하기 때문에 나중으로 미루고(필요하시면 자세히 알려드림) 허접하지만 간단히 파악한 TestBed의 구조를 간략히 정리해 보겠습니다.

여기선 c++의 상속에 관한 기본적인 문법과 구조체, 함수포인터, 모듈컴파일등 에 관해서 먼저 아셔야 이해할 수 있는 내용입니다. 제가 지금까지 정리해 놓은 c++관련 포스팅에서 모두 다룬 내용입니다.


먼저 Test를 상속받는 사용자 클래스가 필요하고 위 그림에서 보다시피 이런 사용자 클래스들이 많아질 경우 감당이 안될 수 있습니다.

main.cpp에서 모든 사용자 클래스들을 include 한 뒤 각 객체를 생성해야 할 것입니다. 클래스별로 이름도 어떤 규칙성이 없고, 점점 복잡해지고 가독성을 떨어질 수 있습니다. 그렇다고 클래스이름은 A1,A2라고 하기에도 허접해 보입니다. 제가 분석한 부분은 이렇게 클래스들을 관리하는 프로젝트의 경우 유용한 디자인이라 생각되기 때문에 정리하는 것입니다.

그래서 간단한 예제를 만들었습니다.


부모가 되는 원래의 클래스를 Test1이라 두겠습니다. 1=원, 원래라는 뜻으로 이름지었습니다.


Test1.cpp



Test1.h


헤더 파일을 보면 자신의 함수포인터를 구조체 변수로 선언했습니다. 이 구조체에 사용자 Tests 객체를 만들어 저장하는 용도로 쓰입니다. 함수포인터는 Test*를 반환하는 함수기 때문에 Test를 상속 받는 모든 함수들을 가리킬 수 있습니다. 이 함수는  Test를 상속받은 클래스 내부에 다음과 같이 static으로 선언됩니다. 


ZTest.h

사용자 클래스는 모두 헤더파일만 존재합니다. 물론 cpp파일을 만들어도 되지만, 소스를 숨길필요가 없기 때문에 헤더파일에 작성합니다. 이부분은 선택입니다.

위 헤더파일에서 자신의 객체 인스턴스를 생성하는 create()멤버함수가 존재합니다. 사용자 Tests를 만들기 위해서 위와 같은 포맷이 필요합니다. Box2d의 경우 Step()이 물리계의 연산빈도(갱신)를 나타냅니다. 아무튼 여기서는 그냥 멤버함수입니다.

위에 Test클래스에서 Test*를 반환하는 함수 포인터는 각 사용자 Tests클래스의 create()를 가리킬 것입니다. 여기서는 구조체의 멤버변수로 필요할 때 마다 일련적으로 사용자 객체를 구조체에 삽입 삭제 관리합니다.


다음은 구조체를 담은 TestEntry.cpp입니다.


아주 간단한 구조입니다.

Test.h에서 이 구조체변수를 extern 한 것을 기억해 두세요.

다음은 main.cpp입니다.


Box2D는 훨씬 복잡하지만, 위 구조는 Box2D의 TestBed의 core라 할 수 있습니다.

다음은 Box2D의 TestEntry.cpp의 일부입니다.



여기서는 화면에 표시할 문자열도 입력 받습니다. 클래스의 관리가 용이해 졌다고 생각드네요. 지금까지 함수포인터와 extern에대해서 큰 필요성을 못 느끼고 있었는데, 이렇게 좋을 소스를 보니, 생각의 전환이 되네요. 요즘 Box2D를 조금씩 만지고 있는데, C++을 공부하는 입장에서는 참 좋은 소스라 생각 듭니다. 문제는 OpenGl인데 공부는 끝이 없나 봅니다. 뭔가 이젠 알것 같다 생각들면 더 많은 주제들이 기다리고 있네요.

반응형