목록C++ 개발 (119)
kyuseo의 게임 프로그래밍

개요.. 가끔 필요한 정확한 크기와 불규칙한 정보를 가진 더미 파일(Dummy File)을 자동으로 만들기 위해 제작한 프로그램입니다. 특별한 기능은 없지만 더미파일(Dummy File), 임시파일(Temp File), 테스트파일(Test File) 이 필요할 경우에 사용하면 유용합니다. 다운로드 (프로그래밍 소스 코드 포함) 사용방법 1. 프로그램을 실행하고 크기와 개수를 설정합니다. 2. 만들기 버튼을 클릭합니다. 올바르게 실행이 되었다면 아래와 같은 파일이 만들어집니다. 핵심 소스 코드 void CMake_dummy_fileDlg::OnButton1() { UpdateData(); CString str; // 작은더미만들기 for( int i=0; i

Kyuseo's C++ 독시젠을 활용한 주석 작성 스타일 가이드라인(규칙) Kyuseo's C++ Comment Style Guideline with Doxygen 버전 : 2.2 최종수정: 2008-01-24 작성자 : Kyuseo의 게임 프로그래밍 이야기 :: http://a.TK.co.kr 개요.. 프로그램 소스 코드의 주석은 크게는 다른 사람이, 작게는 코드 작성자 자신이 소스 이해하는데 도움을 주고 오작동을 방지하며 수정을 쉽게 해주는 매우 중요한 역할을 합니다. 따라서 코딩 스타일과 마찬가지로 주석 역시 공통의 규격이 없다면 다른 사람의 주석을 읽는데 많은 수고가 필요하므로 규격화된 주석 작성방법이 필요합니다. 위와 같은 이유로 C++ 주석 스타일 가이드라인이 필요하며 적어도 팀 내에서는 동일..
개요.. 16비트(Bit) CRC 알고리즘을 구현한 코드입니다. 위 출처에서 구한 코드인데 코드가 참 좋네요. Kyuseo가 약간 수정하였습니다. 코드 출처 : han.comp.lang.c++, http://blog.naver.com/programsite/140006734084 코드 #define POLYNOMIAL 0x8005 #define CRC_TABLE_SIZE 256 #define RCV_BUF_SIZE 4 #define USE_CRC_TABLE #ifndef USE_CRC_TABLE static unsigned short crc_table[CRC_TABLE_SIZE]; #else static unsigned short crc_table[CRC_TABLE_SIZE] = { 0x0000, 0x80..
개요.. 프로그래밍을 공부하다 보면 코드 최적화에 관한 글들이 많습니다. 그 대부분은 이론적으로는 올바른 말이지만, 최적화를 위한 코드를 작성하다 보면 코드가 지저분해지는 경향이 발생됩니다. 하지만 최근 컴파일러의 성능이 좋아지면서 대부분의 최적화는 알아서 잘하기 때문에 그것을 활용하는 편이 좋을 경우가 많습니다. 최적화 원칙: - CPU 부하가 큰 반복작업은 최대한 최적화 코드로 작성하라. - 코딩 수정으로 최적화를 하지 말고 알고리즘으로 최적화를 하라. - 더 빠른 속도가 필요하다면 어셈블리(Assembler) 언어를 사용하라 - 코드의 최적화보다는 코드의 유지보수를 우선하라. - 사소한 최적화에 시간과 노력을 투자하지 말아라. - 중복코드를 최소화 하라. - inline을 활용하라. 괜한 최적화로 ..
개요.. 상대 경로의 파일 위치를 ( 예: ..\test.bmp, .\test.txt ) 절대 경로의 파일 위치(예:c:\kyuseo\test.bmp)로 변경할 경우 _fullpath() 함수를 사용합니다. 코드 함수 원형: char *_fullpath( char *absPath, const char *relPath, size_t maxLength ); wchar_t *_wfullpath( wchar_t *absPath, const wchar_t *relPath, size_t maxLength ); 예제: char full[_MAX_PATH]; _fullpath( full, "ReadMe.txt", _MAX_PATH ); // full == "C:\Documents and Settings\kyuseo\M..
개요.. '123456700' 과 같은 숫자를 '123,456,700' 와 같이 ',' 을 3자리마다 붙여서 통화 화폐의 문자열을 리턴 하는 함수입니다. 코드 함수: /// 통화화폐형의스트링을얻는다. inline CString IntToCurrencyString( int nMoney ) { CString str; str.Format( "%d", nMoney ); for( int i = str.GetLength() - 3; i > 0; i -= 3 ) { str.Insert( i, ',' ); } return str; } 예제: CString str = IntToCurrencyString( 123456700 ); TRACE( str ); // 123,456,700
개요.. 개요: CMap 클래스에서 InitHashTable 함수를 이용하여 해시 테이블의 크기를 설정할 경우, 인자로 소수(Prime Number)를 입력해야 효율이 좋다고 합니다. 매번 소수를 찾기도 어렵고하여 소수를 구하는 함수들을 만들어 보았습니다. 코드 함수: /// 소수인지검사한다. inline BOOL IsPrimeNumber( int nNumber ) { int dwSqrt = ( int ) sqrt( ( double ) nNumber ) + 1; for( int i = 2; i < dwSqrt; i++ ) { if( nNumber % i == 0 ) return FALSE; } return TRUE; } /// 해당값보다크고가까운소수를구한다. inline int GetVPrimeNumbe..
개요.. 문자열에서 문자를 변경하는 함수입니다. ex) "test code" -> 't'를 'a' 로 변환 -> "aesa code" 코드 함수: /// 문자열에서문자를변경한다. inline void strreplace( char* sz, char old, char change ) { if( sz == NULL ) return; while( *sz ) { if( *sz == old ) *sz= change; sz++; } } 예제: char sz[10] = "test code"; strreplace( sz, 't', 'a'); // sz == "aesa code"
개요.. 간단하게 두개의 변수를 교체(Swap) 할 경우 사용하는 템플릿을 이용한 교체 (Swap) 함수입니다. 템플릿을 활용하였기 때문에 CString 과 같은 클래스에서도 편하게 사용할 수 있습니다. 코드 함수: template inline void Swap( T& a, T& b ) { T t = a; a = b; b = t; } 예제: CString a = "aaa"; CString b = "bbb"; Swap( a, b ); // b == "aaa", a == "bbb" int c = 10; int d = 20; Swap( c, d ); // c == 20, d == 10
개요.. 몇 시간, 며칠이 흘렀는지 검사할 경우 초(sec) 또는 밀리초(ms)로 검사하기 위해서는 복잡한 곱셈연산을 해야 합니다. 그것을 편리하고 실수가 없도록 정의(define) 한 코드입니다. 코드 정의: #define ONE_MIN_SEC ( 60 ) #define ONE_HOUR_SEC ( 60*60 ) #define ONE_DAY_SEC ( 60*60*24 ) #define ONE_WEEK_SEC ( 60*60*24*7 ) #define ONE_MONTH_SEC ( 60*60*24*30 ) // 정확한달은아님 #define ONE_MIN_MS ( 60*1000 ) #define ONE_HOUR_MS ( 60*60*1000 ) #define ONE_DAY_MS ( 60*60*1000*24 ) #..
개요.. CString 또는 API 함수중에서 대소문자를 구분하지 않고 문자열을 찾는 함수가 없어서 만들었습니다. 효율성보다는 편리성을 우선으로 만든 함수입니다. 보너스로 한글이 포함된 문자열을 일본 윈도우에서 CString 함수인 MakeLower, MakeUpper 함수를 사용할 경우 프로그램이 다운되는 현상을 막기 위하여 새로 제작한 MakeLower, MakeUpper 함수도 포함되어 있습니다. 코드 함수: /// 문자열을소문자로변경한다. (다국어입력시일본윈도우등에서오작동되는경우를보완하기위하여만듦) inline void MakeLower( CString& str ) { for( int i = 0; i = '..
개요.. 구조체(클래스)를 다른 구조체로 복사 할 경우 memcpy 로 복사를 해야 하는지, operator = 연산자를 사용하여 복사 하는 것이 좋은지 판단하기가 어려운 상황이 있습니다. 어떤 복사방식을 사용하는 것이 좋을지 생각해봅니다. 특징 memcpyoperator =복사방식구조체 크기의 메모리를 복사한다.멤버 변수를 각각 '=' 연산을 통하여 복사한다. 속도빠르다느리다주의사항멤버 중에 CString (일반적인 MFC 클래스) 과 같은 별도로 관리하는 메모리, 포인터 등의 변수가 있을 경우 사용하면 오작동 우려가 있음 자료형의 크기를 정확하게 대입해야 한다.개별적으로 '=' 연산을 하기 때문에 안정성은 뛰어나나 원본과 완벽하게 동일한 메모리 구조를 보장하지 않는다. 복사 연산자 '=' 가 정의되지..
개요.. 네트워크 프로그래밍에서 Nagle 알고리즘이란 "가능하면 조금씩 자주 보내지 말고 한번에 많이 보내라(Effective TCP인용)" 라는 원칙을 기반으로 만들어진 알고리즘입니다. 이 알고리즘을 소켓(Socket)에 적용, 해제하는 함수가 setsockopt 함수의 TCP_NODELAY 옵션입니다. 이 옵션을 언제 사용하면 좋은지를 어떻게 사용하면 되는지를 알아봅니다. WinSock의 경우 별도로 옵션을 조정하지 않는다면 기본으로 Nagle 알고리즘이 적용이 되어있습니다. 하지만 몇몇 네트워크 프로그램에서는 네트워크의 성능보다는 빠른 응답속도가 더욱 중요하게 여기는 상황이 있습니다. 그러한 경우 setsockopt 함수의 TCP_NODELAY 옵션을 사용하여 Nagle 알고리즘을 제거 할 수 있..

개요.. 인터넷 관련 프로그래밍에서 인터넷 핸들(HINTERNET)을 세부적으로 세팅하는 InternetSetOption 함수에서, 인터넷 접속이 올바르지 않거나 오랜 시간이 소요될 경우 접속 및 다운로드를 중단하는 처리를 할 경우가 많습니다. MSDN 에 정의된 것처럼 InternetSetOption 함수의 옵션 중 INTERNET_OPTION_CONNECT_TIMEOUT, INTERNET_OPTION_SEND_TIMEOUT 와 같은 Timeout 옵션을 이용하려 해보았지만 해당 옵션, 함수의 오류로 인하여 올바른 작동을 하지 않았습니다. MSDN 에 정의된 함수의 모습 BOOL InternetSetOption( HINTERNET hInternet, DWORD dwOption, LPVOID lpBuff..

개요.. 폰트 핸들(HFONT)을 CreateFont로 대량 생성시 리소스 점유에 대하여 알아봅니다. 아래와 같이 CreateFont를 활용하여 HFONT를 대량 생성한 결과 별다른 메모리의 증가는 보이지 않았으나 GDI객체 증가가 발견되었습니다. 윈도우 프로그래밍에서 대량의 GDI 객체 사용시 리소스 부족 증상이 간혹 나올 수 있기 때문에 같은 폰트, 같은 크기 사용할 경우 객체의 핸들을 공용으로 사용하면 리소스 사용을 감소 할 수 있습니다. 코드 1. 최초 실행 2. 같은 폰트 같은 크기를 생성시 최초 폰트 생성시 약 500KB 가량의 메모리가 할당되고 GDI 객체가 생성한 개수만큼 증가하였다. // 같은폰트같은크기를1000개생성한다. for( int i=0; i
개요.. stdafx.h 최상단에 사용가능한 윈도우(Window) 및 익스플러러(Explorer) 버전을 define 함에 따라, 사용가능 한 라이블러리 및 구조체가 바뀝니다. 따라서 지원하는 최소한의 운영체계를 결정하고 그에 따른 WINVER 을 선언하여 사용하면 해당 윈도우 이상 지원됩니다. 예) Windows 98 / Explorer 5.0 지원 할 경우 아래와 같이 정의한다. #define WINVER 0x0410 #define _WIN32_IE 0x0500 MSDN 에 정의된 정보 Minimum system requiredMacros to defineWindows Server 2003_WIN32_WINNT>=0x0502 WINVER>=0x0502Windows XP_WIN32_WINNT>=0x05..

개요.. 온라인게임이나 메신저 프로그램, 각종 P2P 프로그램들은 프로그램 하나만 실행이 됩니다. 이와 같이 하나의 프로그램만 실행 시키는 방법은 뮤텍스(Mutex)라는 동기화 객체를 사용하는데 그 객체의 사용법을 알아봅니다. 다운로드 코드 1. APP 헤더에 선언한다. class Cmfc_dlg2App : public CWinApp { HANDLE m_hMutex; 2. 생성자에서 초기화한다. Cmfc_dlg2App::Cmfc_dlg2App() { m_hMutex = NULL; } 3. InitInstance 에서 뮤텍스를 생성한다. BOOL Cmfc_dlg2App::InitInstance() { HANDLE m_hMutex = CreateMutex(NULL,TRUE, "뮤텍스를이용한한번만실행되는윈도우..

개요.. GetTextExtentPoint32 함수는 글자의 가로, 세로 크기를 얻을때 유용한 함수입니다. 이 함수의 사용법과 주의사항을 알아봅니다. 다운로드 MSDN 에 등록된 함수의 원형은 다음과 같습니다. BOOL GetTextExtentPoint( HDC hdc, // handle to DC LPCTSTR lpString, // text string int cbString, // number of characters in string LPSIZE lpSize // string size ); 실제 사용방법은 아래와 같습니다. 1. 폰트를 생성한다. 2. 폰트를 HDC 에 할당한다. 3. GetTextExtentPoint 함수를 이용하여 원하는 문장의 크기를 구한다. 이 함수의 주의할 점은 호출이전에..

개요.. MFC 프로그래밍시 공유 DLL에서 MFC 사용과 정적 라이브러리에서 MFC 사용 의 차이점 및 구성방법을 알려드립니다. 참고로 일반인에게 배포되는 프로젝트를 주로 개발하는 Kyuseo 는 1%명 가량의 유저가 MFC 관련 DLL 때문에 실행이 안되는 불만이 자주 발생되기 때문에 보통 정적 방식을 사용합니다. 최근 인터넷과 컴퓨터의 발달로 파일용량이나 로딩속도 보다는 안정성 및 편의성이 가장 우선이 되도록 개발하는 것이 합리적이라고 생각됩니다. 공유 DLL에서 MFC 사용정적 라이브러리에서 MFC 사용파일 용량작다.크다.프로그램 로딩 속도빠름 (사실상 큰상관 없음,)보통프로그램 속도차이없음차이없음배포시 문제 발생불편함 (정확한 MFC DLL 목록을 반드시 함께 배포해야함)문제 없음개발과정차이없음..

개요.. 스플리터 윈도우는(분할창, CSplitterWnd) 탐색기와 같은 프로그램 에서 유용하게 사용하는 기능입니다. 프로그램 실행시, 실행도중 각각의 윈도우의 크기를 조절하는 방법을 알아봅니다. 다운로드 코드 - MainFrame 에서는 다음과 같은 방법으로 조절합니다. m_wndSplitter.SetColumnInfo( 0, size, min_size ); m_wndSplitter.RecalcLayout(); - View 에서는 다음과 같은 방법으로 조절합니다. GetParentSplitter( this, FALSE )->SetColumnInfo( 0, size, min_size ); GetParentSplitter( this, FALSE )->RecalcLayout(); 예제 1. 분할창 윈도우 ..

개요.. 윈도우와 컨트롤의 WM_ACTIVATEAPP, WM_ACTIVATE, WM_SETFOCUS, WM_KILLFOCUS 등의 발생시기를 잘 보여주는 프로그램입니다. 게임에서 사용자가 Alt Tab과 같은 작동을 할 경우 자신의 어플리케이션이 활성화 되었는지(Active), 활성화 되지 않은지(Inactive)에 따라서 사운드, 화면(풀스크린) 복구 작업을 하기 때문에 그 정확한 시점을 테스트 해보고자 만들어 보았습니다. 다운로드 코드 ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1) ON_EN_KILLFOCUS(IDC_EDIT1, OnKillfocusEdit1) ON_EN_KILLFOCUS(IDC_EDIT2, OnKillfocusEdit2) ON_EN_SETFOCUS(ID..

개요.. 윈도우즈 프로그래밍을 하다 보면 윈도우의 위치를 마지막에 유저가 사용한 위치로 복구하여 유저의 편의성을 올려줄 경우가 많이 있습니다. 레지스트리를 이용하여 윈도우의 위치를 저장하고 복구하는 것이 일반적이고 알고리즘 자체도 단순하긴 하지만 자칫 잘못하면 보이지 않는 위치에 윈도우를 복구하는 경우가 종종 있습니다. 오류 가능성을 줄이고 사용하기 편리하도록 함수를 만들어 보았습니다. 다운로드 코드 1. 로드 & 세이브 함수 작성 (MainFrm.cpp) void LoadWindowPos( CWnd& rWnd, LPCSTR szName, BOOL bResize ); void SaveWindowPos( CWnd& rWnd, LPCSTR szName ); void LoadWindowPos( CWnd& rW..
개요.. RECT 구조체를 교집합, 이동, 증가하기 등을 처리할 경우 직접 코드를 작성하여도 좋지만, 이미 제공되는 함수도 쓸만한 것들이 많이 있습니다. 쓸만한 Rect 관련 API 함수 BOOL UnionRect( LPRECT lprcDst, // destination rectangle CONST RECT *lprcSrc1, // first rectangle CONST RECT *lprcSrc2 // second rectangle ); 두개의 사각형으로 하나의 사각형으로 합한다. 면적이 0이면 FALSE 아니면 TRUE 를 리턴한다. BOOL InflateRect( LPRECT lprc, // rectangle int dx, // amount to adjust width int dy // amount ..
개요.. 윈도우 프로그램이 종료되는 메시지의 순서를 알고 적절한 대처를 합니다. 이것을 응용하면 윈도우가 죽기직전에 살릴 수도 있습니다. 사용자가 종료(X)버튼 클릭 -> WM_SYSCOMMAND -> WM_CLOSE -> WM_DESTROY -> WM_QUIT 코드 MFC 의 경우 b1 -> b2-> b3-> b4 의 순서로 코드가 진행됩니다. void CMainFrame::OnClose() { BOOL b1 = ::IsWindow( m_hWnd ); // b1 = TRUE // 윈도우를 살릴 수 있는 마지막 기회!!! (중요) if( 윈도우가 살아야함 == TRUE ) return; CFrameWnd::OnClose(); BOOL b4 = ::IsWindow( m_hWnd ); // b2 = FALS..
개요.. CString은 MFC 클래스 중에서도 가장 많이 사용하는 클래스 입니다. 하지만 몇몇 함수는 올바른 것인지 아닌지 명확하게 알 필요성이 종종 있습니다. CString 의 operator()= 함수는 인자로 NULL을 대입하여도 작동이 잘 됩니다. CString 의 Compare() 함수는 인자로 NULL을 대입하면 오류가 발생합니다. 코드 { char* sz = NULL; CString str1 = NULL; //

개요.. 이미지 로딩, 복잡한 알고리즘 계산과 같은 오랜 시간이 걸리는 작업을 할 경우 유저는 입력작업을 하지 못하고 잠시 기다려야 할 경우가 있습니다. 그러한 경우 대기 커서(Wait Cursor) 모래시계 로 커서가 바뀌면 사용자는 프로그램이 오류가 발생한 것이 아니고 프로그램이 작업 중이니 기다려야한다는 것을 인지하고 참고 기다려줄 것입니다. "몇 초 정도 기다리면 어때" 라고 생각하시는 분도 많지만 조금 더 유저에게 배려를 한다면 더 좋은 프로그램을 만드실 수 있으리라 생각됩니다. 코드 : (MFC App 시스템에서 정상 작동됩니다.) 방법1: { BeginWaitCursor(); Sleep(3000); // 아주오래걸리는일 EndWaitCursor(); } 방법2: { CWaitCursor wc..
개요.. 헝가리안 표기법은 "구시대의 유물이니 쓰지 말아야 한다"라는 주장과 "대규모 프로젝트, 코드파악이 잘된다."등의 논란은 많지만 사용을 잘 하면 코드 분석(가독성) 및 작성에 매우 도움이 되는 코딩 방법론입니다. 또한 Kyuseo 역시 중요변수( 멤버, 전역 변수)에 필수적으로 애용하는 코딩 스타일입니다. 헝가리안 표기법 정리.. Hungarian Notation Data TypePrefixExampleBooleanbbContinueIntnnIndexShortnnIndexCharacterccFirstInitialFloatfPercentDouble ddMetresLongllCarCountStringssCustomerNameNull terminated StringszszCustomerNameUnsig..
버전: 2.1최종수정: 2008-01-03 출처 : http://www.soonsin.com/ 개요.. 프로그래밍에서 아무리 강조를 해도 지나침이 없는 프로그래밍 규범과 코딩 스타일의 중요성에 대하여 설명을 드립니다. 프로그래밍의 기본은 프로그래밍 언어입니다. 우선 언어를 능수 능란하게 사용하게 된 이후에 설계나 알고리즘, 최적화, 방법론 등의 추가 기법들을 쉽게 배울 수 있고 다른 사람들의 언어들의 이해가 가능해집니다. 이러한 사항들은 실제의 언어 즉 한국어, 영어, 일본어등과 흡사한 모습을 가지게 되지요. 한국에서 잘 살려면 한국어를 잘 사용하는 것이 기본이지요. 또한 동일한 한국어라고 할지라도 경상도 전라도 등의 사투리가 존재하고 각 지역별로 그 지역에서 잘 살려면 그 지역의 사투리를 잘 배우고 사..