본문 바로가기

분류 전체보기

(308)
[WinAPI] Pivot POSITION tPos = m_tPos - m_tSize * m_tPivot; BitBlt(hDC, m_tPos.x, m_tPos.y, m_tSize.x, m_tSize.y, m_pTexture->GetDC(), 0, 0, SRCCOPY); Pivot을 통해 이미지의 어떤 부분을 기준으로 출력할 지 정할 수 있다. 기본 위치 정보 m_tPos에서 m_tSize 와 m_tPivot을 곱한만큼 뺀다. Pivot의 x를 0.5f y를 1f로 설정했을 때 아래와 같이 그려진다. 파란색 점이 m_tPos이다. 그냥 m_tPos기준으로 이미지를 출력하면 이미지의 왼쪽 위 끝 부분을 기준으로 출력한다. 그런데 m_tSize * m_tPivot만큼 빼주면 중앙 아래 쪽이 m_tPos자리에 위치하게 된다. 그러면 이제..
[WinAPI] 더블 버퍼링 WinAPI 실습을 할 때 화면이 깜빡거리고 플레이어가 이동할 때마다 잔상이 남고 총알이 이동할 때 역시 잔상이 남았다. 이것을 해결하기 위해서는 더블 버퍼링을 사용해야 한다. 더블 버퍼링을 잘 표현한 그림이다. 사용자에게 보여주는 버퍼와 뒤에서 출력할 내용을 그리는 버퍼로 나누어진다. (출처 : http://cafe.naver.com/buildgame.cafe) void CCore::Render(float fDeltaTime) { //백버퍼 얻어오기 CTexture* pBackBuffer = GET_SINGLE(CResourcesManager)->GetBackBuffer(); //흰 사각형 그려 화면을 지움(초기화) Rectangle(pBackBuffer->GetDC(), 0, 0, 1280, 720)..
[C++] vector, list, map에 할당한 메모리 해제 winapi 실습중에 objList 이름의 list를 만들어 동적으로 할당한 객체들을 저장했다. 이렇게 vector나 list에 메모리를 동적으로 할당한 객체를 저장하면 clear()을 사용하는 것으로는 동적으로 할당한 메모리가 해제되지 않는다. 그래서 메모리를 해제하기 위하여 다음과 같은 코드를 작성하였다. template void Safe_Delete_VecList(T& p) { typename T::iterator iter; typename T::iterator iterEnd = p.end(); for (iter = p.begin(); iter != iterEnd; ++iter) { SAFE_DELETE((*iter)); } p.clear(); } SAFE_DELETE는 인수를 delete로 메모리..
[C++] 상속관계에서 복사 생성자 호출 상속관계에서 자식 클래스의 복사 생성자를 호출할 때 부모의 복사 생성자도 호출하기 위해서는 초기화 리스트를 사용해야 한다. CParent::CParent() { std::cout
[C++] const string&을 쓰는 이유(const와 레퍼런스) private: string m_strTag; public: void SetTag(const string& strTag) { m_strTag = strTag; } 위 코드는 m_strTag 를 지정하는 함수이다. 그런데 string이 아니라 const string&을 사용하는 이유가 궁금해서 찾아보았다. 우선 레퍼런스를 사용하는 이유는 Call by Reference를 이용해서 값을 복사하지 않아 메모리 낭비를 줄이고 속도가 더 빠르기 때문이다. 그렇다면 const는 왜 붙이는 것일까? #include #include using std::string; string g_value; void ProcessStringByRef(string& s) { g_value = s; std::cout
[C++] static 멤버와 싱글톤 패턴 정적 멤버 변수는 클래스에 속하지만 객체별로 할당되지 않고 모든 객체가 공유하는 멤버이다. 개별 객체와는 직접적 상관이 없고 객체 전체를 대표하는 클래스와 관련된 정보를 저장하는 특수한 멤버이다. 싱글톤 패턴은 애플리케이션이 시작할 때 해당 클래스 타입의 정적 멤버 포인터 변수를 통해 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 쉽게 말하자면 객체를 단 하나만 만들 수 있는 것이다. #define DECLARE_SINGLE(Type) \ private:\ static Type* m_pInst;\ public:\ static Type* GetInst()\ {\ if(!m_pInst)\ m_pInst = new Type;\ return m_pInst;\ }\ sta..
[WinAPI] 삼각함수 if (GetAsyncKeyState('W') & 0x8000) { g_tPlayer.x += fSpeed * cosf(g_fPlayerAngle); g_tPlayer.y += fSpeed * sinf(g_fPlayerAngle); } if (GetAsyncKeyState('S') & 0x8000) { g_tPlayer.x -= fSpeed * cosf(g_fPlayerAngle); g_tPlayer.y -= fSpeed * sinf(g_fPlayerAngle); } if (GetAsyncKeyState('A') & 0x8000) { g_fPlayerAngle -= PI * g_fDeltaTime * fTimeScale; } if (GetAsyncKeyState('D') & 0x8000) { g_fPla..
[WinAPI] 델타 타임 지난번에 PeekMessage함수를 이용할 때 else 블럭에 카운트를 만들어 일정 카운터가 달성될 때 마다 한번씩 Run함수가 실행되게 만들었다. 왜냐하면 실제로 메시지루프가 엄청 빠르게 반복하기 때문에 사각형이 보이지도 않을 정도로 빠르게 움직이기 때문이다. 그런데 그렇게 하지 않고 델타 타임을 이용해서 사각형의 속도를 조절할 수 있다. QueryPerformanceFrequency(&g_tSecond); QueryPerformanceCounter(&g_tTime); 메인 함수의 메시지 루프 전에 위 코드를 작성한다. Performance Counter은 현재 CPU의 클럭수를 반환하고 Frequency는 주파수(초당 진동수)를 나타낸다. 주파수는 전역으로 선언한 float형 변수 g_tSecond에..