분류 전체보기 (308) 썸네일형 리스트형 [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.. [Winapi] 게임 프레임워크 - 1. Core https://youtu.be/lBawfsBIT7s 나는 지난 2주간 어소트락 winapi 강좌를 보면서 프레임워크 만드는 것을 진행했다. 강좌의 진도가 빠르고 코드의 양이 워낙 많은 탓에 프레임워크 만드는 것을 따라했다고 봐도 무방할 것 같다. 그래서 강좌를 모두 시청한 지금 시점에서 다시 코드를 복습하고 배운 것들을 정리하려고 한다. #include #include "Core.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { if (!CCore::GetInst()->Init(hInstance)) { CCore::Destro.. [C++] 파일 입출력 - fopen_s, fread, fwrite 파일을 입출력할 때 파일의 데이터를 잠시 저장하기 위해 FILE 구조체를 사용한다. 우선 파일의 데이터를 저장하기 위한 파일 포인터를 만들고, fopen_s 함수로 파일을 열어 액세스를 준비한다. FILE* pFile = NULL; fopen_s(&pFile, strPath.c_str(), "rb"); fopen_s는 pFile에 strpath 경로의 파일을 "rb" 모드로 연다. "rb"는 파일 열기 모드 중 이진 파일을 읽기 전용(read binary)으로 연다는 뜻이다. 파일 열기에 성공했을시 0을 반환한다. fopen과의 차이점은 SDL검사를 지원하기 때문에 전처리기를 추가할 필요가 없다. fread(&m_vecPixel[0], sizeof(PIXEL), m_vecPixel.size(), pFil.. [C++] 가변 인자 템플릿 (variadic template) 가변 인자 템플릿은 가변 인자 함수와 마찬가지로 인수로 몇개가 올지 모르는 템플릿이다. 몇개의 키보드 입력을 받을지 모르는 AddKey로 가변 인자 템플릿을 만들어보겠다. template bool AddKey(const T& data) { if (!m_pCreateKey) m_pCreateKey = new KEYINFO; const char* pTType = typeid(T).name(); if (strcmp(pTType, "char") == 0 || strcmp(pTType, "int") == 0) { m_pCreateKey->vecKey.push_back((DWORD)data); } else { m_pCreateKey->strName = data; m_mapKey.insert(make_pair(m_p.. 이전 1 ··· 26 27 28 29 30 31 32 ··· 39 다음