Game Dev/Article 59

Window Message Callback에 Class Member 함수 이용하기

대부분의 Win32 Application에서 Message Callback 함수에는 전역 함수가 사용된다. 하지만 이렇게 전역함수를 사용하는 것은 객체지향 패러다임에도 맞지 않을 뿐 아니라 Main Loop와 Message Proc 간의 원활한 연동이 힘들다. 이 둘간의 통신을 위해서 또다른 전역 함수나 전역 변수를 사용해야 하는 것이다. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // ..... } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { // Register Class WNDCLASSEX wc; ZeroMemory(&wc, sizeof(wc)); wc...

Game Dev/Article 2009.09.16

짝 프로그래밍의 장단점

대부분의 회사에서 작업을 배분할 때 작업과 프로그래머의 비율을 1:1로 정하고 있습니다. 가장 쉬운 예로, 해야할 작업이 2가지이고 프로그래머가 2명일 경우 프로그래머 각각 하나의 작업을 수행합니다. 물론 작업의 양과 프로그래머의 능력에 따라 이 비율은 N:1, 1:N, N:M 등이 될 수도 있겠지만, 프로그래머들은 (그 습성상 그리고 경영진의 압박으로) 개인적으로 작업을 진행합니다. 설령 매우 큰 하나의 작업을 여럿이서 진행한다 할지라도 독립적인 모듈로 나누어 작업한 후 통합합니다. Pair Programming 흔히 말하는 짝 프로그래밍은 위와 같이 개인적으로 작업을 진행한 후 통합하는 방식이 아니라 2인 이상의 프로그래머가 한 조가 되어 같은 작업을 진행하는 방식을 말합니다. (물론 짝 프로그래밍에..

Game Dev/Article 2009.08.04

간단한 3차 보간법

Abstract 입력된 4개의 정점을 지나는 3차곡선을 계산하는 방법이다. Input 4개의 정점 (x1, y1), (x2, y2), (x3, y3), (x4, y4) Output 3차 곡선을 f(x) = ax^3 + bx^2 + cx + d 라고 할 때 입력으로부터 a, b, c, d의 계수를 계산한다. Calculation f(x)의 방정식이 ax^3 + bx^2 + cx + d이므로 4개의 입력을 각각 공식에 대입한다. y1 = a*(x1)^3 + b*(x1)^2 + c*(x1) + d y2 = a*(x2)^3 + b*(x2)^2 + c*(x2) + d y3 = a*(x3)^3 + b*(x3)^2 + c*(x3) + d y4 = a*(x4)^3 + b*(x4)^2 + c*(x4) + d 이를 4차원..

Game Dev/Article 2009.08.02

Vista에서 관리자 권한으로 프로세스 실행시키기

ActiveX나 기타 응용 프로그램 내에서 프로세스를 실행시켜야 할 경우가 있다. 보통은 CreateProcess 등을 사용하는데 이 경우 Vista에서 부모 프로세스를 관리자 권한으로 실행하지 않았을 경우 제대로 동작하지 않는다. 해결법은 ShellExecuteEx 함수를 사용하는 것이다. // Process 생성 SHELLEXECUTEINFO shExecInfo; shExecInfo.cbSize= sizeof(SHELLEXECUTEINFO); shExecInfo.fMask= NULL; shExecInfo.hwnd= NULL; shExecInfo.lpVerb= NULL; shExecInfo.lpFile= 프로세스이름; shExecInfo.lpParameters = 파라미터; shExecInfo.lpDi..

Game Dev/Article 2009.05.28

XML에 특수 문자 삽입

&#아스키코드; XML 파일을 스트링 테이블 등으로 사용하는 경우가 많이 있다. 이 때 개행을 위해 \n 등의 개행 문자를 넣고 싶을 경우가 많이 있는데, 문자열에 바로 \n을 넣으면 개행이 되지 않고 문자로 인식해 \n이 그냥 출력이 된다. 따라서 특수 문자를 넣고 싶을 때는 위의 코드를 이용한다. 삽입을 원하는 부분에 복사한 후 "아스키코드"에 ASCII 코드 번호를 삽입하면 된다. 예를 들어 C++에서 개행으로 사용되는 \n은 ASCII 코드로 10인 LF(Line Feed)이므로 다음과 같다. XML에서는 대략 다음과 같은 형태를 갖을 것이다.

Game Dev/Article 2009.05.07

Minimize All Windows

어떠한 프로그램을 실행시킬 때 해당 프로그램의 점유율을 조금이라도 높여주기 위해 혹은 그 외의 이유로 다른 프로그램을 최소화 할 때가 있다. 여러가지 접근 방법들이 존재하겠지만, 쉽게 구현할 수 있는 몇가지 방법들에 대해서 정리해 보도록하겠다. 1. 윈도우 이벤트 발생 - 장점 : 빠르고 쉽게 구현이 가능하다. - 단점 : 단점은 딱히 없는것 같다 아직 발견하지 못하였다. // "Window Key + D" Event keybd_event(VK_LWIN, 0, 0, 0); keybd_event('D', 0, 0, 0); // Choose Win+D or Win+M keybd_event('D', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_LWIN, 0, KEYEVENTF_KEYU..

Game Dev/Article 2009.04.30

간단한 ActiveX 수동설치 만들기

시작하기 전에 Inno Setup과 IS Tool 두가지 유틸리티가 필요합니다. Inno Setup은 Install Wizard를 자동으로 만들어주는 프로그램이고 IS Tool은 Inno Setup이 만들어주는 Setup Script를 쉽게 제작할 수 있는 툴 입니다. 두 프로그램 모두 프리웨어이기 때문에 링크를 클릭하면 쉽게 다운받을 수 있습니다. Inno Setup 대신 Install Factory를 사용할 수도 있습니다만 Install Wizard 모양 등에서 차이가 나게 됩니다. 설치를 다 마쳤으면 IS Tool을 실행합니다. 그리고 "Create a new empty script file"을 체크하여 빈 스크립트를 생성합니다. 제대로 생성하였다면 아래와 같은 빈 화면이 나타날 것 입니다. 이제 ..

Game Dev/Article 2009.04.28

중첩을 피하는 코딩 스타일

코딩을 하다보면 계층 구조 깊숙이 있는 포인터를 다루는 경우가 많이 있다. 예를들어 A 포인터에서 B 포인터를 얻어내고 B 포인터에서 C 포인터를 얻어내고... 이 경우 포인터를 얻어내는 것도 쉬운 일이 아니지만, 잘못된 포인터를 참조하지 않도록 방어적 프로그래밍을 하는 것도 매우 중요하다. 그리고 대부분의 경우 NULL 체크를 위해 다음 2가지 중 한 방법을 취할 것으로 생각된다. A* pA = NULL; B* pB = NULL; C* pC = NULL; pA = GetA(); if (pA) { pB = pA->GetB(); if (pB) { pC = pB->GetC(); if (pC) { pC->Func(); } } // end of if (pB) } // end of if (pA) 1. if 문의 ..

Game Dev/Article 2009.04.12