본문 바로가기

WinAPI

(16)
[WinAPI] 게임 프레임워크 - 9. File Save, Load 게임 프레임워크에서는 Map을 Tile형으로 만들어 수정하고 저장, 불러올 수 있다. if (KEYDOWN("Save")) { ShowCursor(TRUE); DialogBox(WINDOWINSTANCE, MAKEINTRESOURCE(IDD_DIALOG1), WINDOWHANDLE, CMapEditScene::DlgProc); ShowCursor(FALSE); //파일명 이용 저장 char strFileName[MAX_PATH] = {}; WideCharToMultiByte(CP_ACP, 0, m_strText, -1, strFileName, lstrlen(m_strText), 0, 0); m_pStage->SaveFromPath(strFileName); } MapEditScene::Input에서 Ctr..
[WinAPI] 게임 프레임워크 - 8. Animation 게임 프레임워크에서 애니메이션을 ANIMATIONCLIP이라는 구조체에 저장한다. typedef struct _tagAnimationClip { ANIMATION_TYPE eType; ANIMATION_OPTION eOption; vector vecTexture; float fAnimationTime; float fAnimationLimitTime; float fAnimationFrameTime; int iFrameX; int iFrameY; int iFrameMaxX; int iFrameMaxY; int iStartX; int iStartY; int iLengthX; int iLengthY; float fOptionTime; float fOptionLimitTime; _SIZE tFrameSize; }..
[WinAPI] 게임 프레임워크 - 7. Collision Collision은 Scene 내 Collider을 가진 Object 들의 충돌처리를 한다. void CCollisionManager::Collision(float fDeltaTime) { if (m_CollisionList.size() < 2) { m_CollisionList.clear(); return; } list::iterator iter; list::iterator iterEnd = m_CollisionList.end(); --iterEnd; for (iter = m_CollisionList.begin(); iter != iterEnd; ++iter) { list::iterator iter1 = iter; ++iter1; list::iterator iter1End = m_CollisionList..
[WinAPI] 게임 프레임워크 - 6. Render 게임 화면을 출력하는 것은 Scene이 포함하고 있는 모든 Object를 Render하는 것과 같다. 그래서 실질적인 게임화면의 출력은 Object::Render에서 이루어진다. POSITION tPos = m_tPos - m_tSize * m_tPivot; tPos -= GET_SINGLE(CCamera)->GetPos(); RESOLUTION tClientRS = GET_SINGLE(CCamera)->GetClientRS(); bool blnClient = true; if (tPos.x + m_tSize.x tClientRS.iW) blnClient = false; else if (tPos.y + m_tSize.y < 0) b..
[WinAPI] 게임 프레임워크 - 5. PathManager, 유니코드와 멀티바이트 PathManager는 프로젝트 내 파일을 읽거나 쓸 때 경로가 필요할 때 사용한다. wchar_t strPath[MAX_PATH] = {}; GetModuleFileName(NULL, strPath, MAX_PATH); for (int i = lstrlen(strPath) - 1; i >= 0; --i) { if (strPath[i] == '/' || strPath[i] == '\\') { memset(strPath + (i + 1), 0, sizeof(wchar_t)*(MAX_PATH-(i+1))); break; } } m_mapPath.insert(make_pair(ROOT_PATH, strPath)); PathManager::Init에서는 저장할 경로를 m_mapPath에 저장한다. 위 코드는 기..
[WinAPI] 게임 프레임워크 - 4. Input WinAPI 프레임워크에서 키보드, 마우스 입력을 관리하는 Input 클래스를 만들었다. typedef struct _tagKeyInfo { string strName; vector vecKey; bool bPress; bool bDown; bool bUp; _tagKeyInfo() : bDown(false), bPress(false), bUp(false) { } }KEYINFO, * PKEYINFO; KEYINFO 구조체는 Input 클래스 내에 있다. vecKey는 입력해야 할 키 값'들'이다. Ctrl + S 처럼 두개 이상의 키를 동시에 입력받아야 할 경우가 있기 때문이다. strName은 vecKey의 KEYINFO의 이름이다. bPress, bDown, bUp은 각각 처음 눌렀을 때 부터 뗄 ..
[WinAPI] 게임 프레임워크 - 3. Reference Count 이 프로젝트에서 동적으로 할당된 메모리를 해제할 때는 SAFE_DELETE라는 매크로 함수를 사용한다. #define SAFE_DELETE(p) if(p){delete p;p=NULL;} 포인터 p에 할당되어있는 메모리를 해제하고 p를 NULL로 지정한다. SAFE_DELETE를 사용하면 아무 이상 없어보이지만 문제는 동적 할당한 포인터를 여러 객체에서 참조하고 있을 때 나타난다. class Ref { public: int value = 1; }; class A { public: Ref* r1; }; class B { public: Ref* r2; }; int main() { Ref* r = new Ref; A a; B b; a.r1 = r; b.r2 = r; cout value
[WinAPI] 게임 프레임 워크 - 2. Scene과 SceneManager 게임프레임워크에서 가장 큰 단위는 장면, Scene이다. Scene 클래스는 Layer List를 가지고 있고 Layer은 Object List를 가지고 있다. 그래서 Scene의 Update 함수는 Layer List의 Layer들을 모두 업데이트 해주고, Layer의 Update는 Object List의 Object들을 모두 업데이트 해준다. Layer은 ZOrder라는 변수를 가지는데 레이어를 생성할 때마다 자동으로 ZOrder의 오름차순으로 정렬한다. 그래서 ZOrder가 낮은 레이어에 있는 Object들은 먼저 출력되고 높은 레이어에 있는 Object들은 나중에 출력된다. 배경은 낮은 레이어에 출력하고 UI는 높은 레이어에 출력해서 Render 순서를 조정할 수 있다. 그외에도 Layer은 En..