좀 질문이 길수있습니다.
양해 부탁드립니다.
게임 개발을 하다가 문득 다른 개발자 분들은 어떤 방식으로 개발을
하시는지 궁금하고, 몇가지 처리가 궁금하여 질문 드립니다.
-----------------------------------------------------------------------------
저는 보통 게임은 인트로, 메뉴, 메뉴 세부(옵션등등) , 본 게임
으로 나누고 메뉴 객체 ,인트로 객체 이런식으로 생성하고
draw()함수를 선언해주어서 객체에서 각 처리를 해주고 있습니다.
객체를 생성할때는 최초(main.cpp) state변수 하나를 두고
switch문에서 그 변수에 따라 각 객체를 생성해서 xxxx->draw()이런 식으로
처리해주고 상태를 바꾸고 싶을때는 객체에서 콜백함수를 호출해주어서
main.cpp에서 콜백인자값으로 다른 객체를 생성해주는 방법을 사용하고 있습니다...
그리고 생성된 객체 안에는 세부객체들 예를들어 인트로 객체에서 어떤일들을 하는
객체들을 생성하고 인트로 객체안에서 그 객체들이 일들을 하죠.
즉,intro의 draw 메소드 안에.. 세부객체들.draw가 호출되는 방식입니다.
-----------------------------------------------------------------------------
또 한가지는 intro상태에서 키를 눌르거나 intro의 어떤 애니 프레임에서
menu상태로 체인지 할려고 할때 intro에서 intro내부의 상태변수를
하나 선언해서 키를 눌르면 if문으로 intro상태변수를 검사해서
상태를 바꾸는 방식입니다.
-제 생각에는 intro안에서 일들을 하는 객체에서 menu상태로 바꾸어 주는
방식도 될거같은데 어떤것이 좋을지 명확하지 않아서 현재 intro에서
menu상태로 바꾸어주는 방식으로 개발하고있습니다.
----------------------------------------------------------------------------
이런 방법 말고 더 좋은 방법이 있거나, 참고할수 있는 부분이
있으면 부탁드립니다~~
그럼 이만.....
각 페이즈 ( 메뉴, 게임, 옵션 등등...)에서 공통점을 뽑아 슈퍼클래스를 하나 만드세요.
그리고 그 슈퍼클래스 -예를 들어 CCommonManager 클래스를 상속받아 CMainMenu, CGameManager 같은 클래스를 만들어줍니다.
그리고 CCommonManager *m_currentManager 를 선언하여 이것에다가
초기치로 m_currentManager = (CCommonManager*)(new CMainMenu); 이런 식으로 메인메뉴 객체를 넣어주고, 각 프레임마다 돌아가는 모든 코드에서는 페이즈 공통으로 가지는 CCommonManager에 선언된 함수만 불러다 쓰는겁니다. 오버라이딩을 적극 활용한다면 아주 잘 작동합니다.
만약 메인메뉴를 쓰다가 게임으로 들어간다면 delete m_currentManager; 한 다음 m_currentManager = (CCommonManager*)(new CGameManager) 해주고 초기화 해주면 되겠죠.
그리고 draw 코드에서는 걍 if(m_currentManager != NULL ) m_currentManager->Draw(); 요 한줄만 적어줘도 어떤 페이즈가 돌아가고 있든 상관없이 돌아가게 됩니다.