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

개요.. 문자열(String)을 사용하면 대소문자를 변경 할 경우가 종종 있습니다. 이미 구현되어있는 API 함수를 사용하여 변경하는 코드를 보여드립니다. 주요함수 towlower, towupper, strlwr, strupr 주의사항 한국에서 개발된 프로그램이라면 즉 한글이 포함되었다면 일본 윈도우에서strlwr, strupr 는 오작동되어 프로그램이 다운되는 현상이 발생됩니다. 따라서 다국어를 위한 개발이라면 직접 strlwr, strupr 을 구현해야 합니다. 소스코드 및 설명 char ch = 'C'; ch = ( char ) towlower( ch ); // ch = 'c' ch = ( char ) towupper( ch ); // ch = 'C' char sz[32] = "CQSeeTalkHe..

개요.. CStringW, USES_CONVERSION, A2W, W2A을 활용하여CHAR 과 WCHAR 자료형의 상호 변환 방법을 설명 드립니다. 방법 - CString 과 CStringW 을 이용하는 방법 char sz[10] = "123가나다라마바사"; WCHAR szw[10] = L"123가나다라마바사"; CStringW strw( sz ); // char -> wchar CString str( szw ); // wchar -> char - USES_CONVERSION , A2W, W2A 을 이용하는 방법 char sz[10] = "123가나다라마바사"; WCHAR szw[10] = L"123가나다라마바사"; USES_CONVERSION; WCHAR* w = A2W( sz ); // char ->..

개요.. Visual C++ 에서 최근 파일 목록의 파일 수를 늘리는 방법을 설명해드립니다. 방법 - 프로젝트 생성시 최근 파일 목록의 파일 수를 조절한다. - 프로그램 소스코드의 LoadStdProfileSettings(12) 와 같이 숫자를 조절 한다.

개요.. 에디트 콘트롤(CEdit, Edit Control)의 최대 문자수, 글자수를 제한하는 방법을 알려드립니다. 이와 같은 코드는 아이디가 16자 일 경우 16자 이상 글자를 입력하지 못하게 하는 용도로 사용됩니다. 리소스 에디터를 사용하는 방법 1. 에디트 콘트롤에서 마우스 오른쪽을 클릭하여 '변수 추가' 를 선택합니다. 2. 변수명을 입력하고 '최대 문자 수'를 설정합니다. 직접 코딩하여 입력하는 방법 아래와 같이 코드를 직접 입력합니다. 주의 할 점은 DDX_Text, DDV_MaxChars 의 순서가 변경되면 안됩니다. DDX_Text(pDX, IDC_EDIT_K1, m_strK1); DDV_MaxChars(pDX, m_strK1, 255); DDX_Text(pDX, IDC_EDIT_K1, m..
개요.. CFile 을 여러 곳에서 다수 파일 오픈 하는 방법을 알려드립니다. 방법 CFile::shareDenyNone 을 옵션으로 오픈하면 여러곳에서 동시에 파일오픈 가능하다. CFile file1; if( file1.Open( "C:\\CONFIG.SYS", CFile::modeRead | CFile::shareDenyNone ) == FALSE ) { ASSERT(0); } CFile file2; if( file2.Open( "C:\\CONFIG.SYS", CFile::modeRead | CFile::shareDenyNone ) == FALSE ) { ASSERT(0); }
개요.. CStringf wsprintf str.Format 의 속도 비교해봅니다. CStringf 가 이상하게도 더 빠른 결과를 얻을 수 있습니다. 아무래도 CString::FormatV 함수가 매우 느리기 때문인듯합니다. 또한 릴리즈 버전에서의 최적화가 되기 때문에 일부러 for 문안에 int 형과 같은 타이트한 객체선언을 밖에 할 필요가 없습니다. 상황에 따라 코드의 표현상 이점에 따라 행동하도록 합시다. 비교 분석 -------- 이론상 최적화 코드 ------------- DWORD n; for( int i=0; i
개요.. 마우스 메시지 WM_MOVE / WM_LBUTTONDOWN 의 버그 / 오류 / 문제점을 알려드립니다. 오류 내용 MSDN 에는 아래와 같이 기술되어있지만 실제로는 WM_MOVE xPos = (int)LOWORD(lParam); yPos = (int)HIWORD(lParam); -> WM_MOVE xPos = (short)LOWORD(lParam); yPos = (short)HIWORD(lParam); 으로 해야 합니다. 왜냐하면 음수(-) 값 처리를 하기 위해서는 WORD 형을 INT 형으로 변환할 시 올바르게 변환이 되지 않으므로SHORT 형으로 변환하여야 합니다. 위와 유사한 메시지 목록 #define WM_MOUSEMOVE 0x0200 #define WM_LBUTTONDOWN 0x0201..

개요.. 기계어 어셈블리어(Assembler)와 mmx, fpu 활용한 빠른(fast) memcpy 소스코드를 작성해봅니다. 개발일지 2002/12/30 어셈블리를 이용하여 기본 제어문 및 루프 테스트함 ( if_test, for_test ) 거꾸로 메모리 복사하는 reverse_memcpy 버전 개발. "1234567890" -> "0987654321" if_test, for_test 기본적인 제어문과 루프의 사용법 습득됨 reverse_memcpy 1 바이트 별로 거꾸로 복사하는 reverse_memcpy 버전은 기존의 memcpy2에 비해 무척이나 느린 현상이 보였다. 그도 당연할 것이 기존의 memcpy2 는 4바이트씩 복사작업을 통하여 루프의 최소화를 하였지만 reverse_memcpy 의 버전..

개요.. 기계어 어셈블리어(Assembler)와 mmx, fpu 활용한 빠른(fast) memcpy 소스코드를 작성해봅니다. 개발 일지 2002/12/29 어셈을 이용하여 memcpy 제작함 mmx 와 fpu 의 속도에 의심이 들어 관련 자료 찾아봄 과연 mmx 기술은 언제 어느 상황에서 사용할 수 있는 것인가...... 아래와 같은 글이 사실이라면 대용량 복사작업을 제외하면 사용할 수 있는 곳은 거의 없다고 판단됨...... MMX는 FPU 레지스터를 이용하는 것인데 FPU를 안 쓴다니 무슨 뜻인지 모르겠습니다. 매뉴얼을 좀더 자세히 읽어보시길 바랍니다. 그리고 emms 명령이 100클럭이 소요된다는 근거는 어디에 있는 것인가요? 물론 수 킬로 바이트 정도의 작은 데이터를 복사하는데 MMX나 SSE를 ..

개요.. 게임과 같은 경우 하나의 컴퓨터에서 하나의 프로그램만 실행시키기를 원하는 경우가 많습니다. 뮤텍스(Mutex)를 이용하여 하나의 프로그램(게임)만 실행하는 소스코드와 방법을 설명드립니다. 방법 아래와 같이 작업하고 추가로 다음과 같은 코드를 추가하여야 리소스 누출을 방지할 수 있습니다. 1. CAppApp::CAppApp() { m_hMutex = NULL; } 2. BOOL CAppApp::InitInstance() { // 프로그램중복실행을막기위한뮤텍스생성 m_hMutex = CreateMutex( NULL,TRUE, "SEARCH_EYEONLlNE_2_RWEHO_FWEO_GWEOG_MUTEX"); if( m_hMutex && GetLastError() == ERROR_ALREADY_EXIS..

개요.. 내 컴퓨터의 아이피 주소 (IP Address)를 얻는 소스코드를 소개 합니다 소스코드 함수 CString GetMyIP() { CString ipAddr; WSADATA wsaData; WORD wVersionRequested = MAKEWORD( 2, 0 ); if( WSAStartup( wVersionRequested, &wsaData ) == 0 ) { char name[256]; if( gethostname( name, sizeof( name ) ) == 0 ) { PHOSTENT hostinfo = gethostbyname( name ); if( hostinfo != NULL) { ipAddr = inet_ntoa( *( struct in_addr* ) *hostinfo->h_addr..
개요.. 매우 편리하고 유용한 MFC 템플릿(Template) 클래스 CMap 의 사용 주의 사항을 설명 드립니다. 주의사항 CMap 사용하기 무척 편리합니다. 특히 스트링(String)맵의 경우 사용용도가 높으나 아래와 같이 오류발생 가능이 있는 코드가 존재하니 주의해서 사용합니다. 올바른 코드 CMap map; map["One"] = 1; map["Two"] = 2; CString s1 = map["One"]; CString s2 = map["Two"]; CString s3 = map["Three"]; CString s4 = map[ NULL ]; 문제의 코드 char* sz = "One"; C..

개요.. Window(윈도우) 2000 / XP / Server 기본 설정으로는 인터넷 TCP/IP소켓 (Internet TCP/IP Socket)을 5000개 이상 열 수 없습니다. TCP/IP 소켓을 5000개 이상 다수 오픈하여 여는 방법을 알려드립니다. 방법 출처 : MS 사이트 The information in this article applies to: Microsoft Windows NT Server versions 3.51, 4.0 Microsoft Windows NT Server, Enterprise Edition version 4.0 Microsoft Windows NT Workstation versions 3.51, 4.0 IMPORTANT: This article contains i..

개요.. 제(Kyuseo)가 즐겨 사용하는 C++ 프로그래밍 매크로, 디파인( Macro, Define) 코드를 소개해드립니다. 코드 #define RGB24TO16( r, g, b ) ( ((r) >> 3) > 3) > 3) #define RGB15( r, g, b ) ( (r) 32) & 0xFFFFFFFF)) #define RED15(p) ( ( (p) >> 10 ) & 0x1F ) #define GREEN15(p) ( ( (p) >> 5 ) & 0x1F ) #define BLUE15(p) ( (p) & 0x1F ) #define RES_STRING( resid ) CString( (LPCTSTR) resid ) template void swap( T& lhs, T& rhs ) { T temp = ..

개요.. int, short, byte 자료형의 복사, 비교 구문의 속도를 비교 분석해봅니다. 비교 분석 1. 아래코드 [A]를 복사하여 코드를 삽입하고 2. F9로 디버깅 브레이크를 설정하고 3. F5를 눌러 실행한 이후 4. Alt-8 을 눌러보면 5. [B] 와 같은 어셈블리 코드가 나옵니다. [A] int t = 0; int a = 1; short b = 2; BYTE c = 3; int a0 = 1; short b0 = 2; BYTE c0 = 3; int a1 = a+a0; int a2 = a+b0; int a3 = a+c0; short b1 = b+a0; short b2 = b+b0; short b3 = b+c0; short c1 = c+a0; short c2 = c+b0; short c3 =..

개요.. MFC 는 아이템 제거 함수가 통일성이 없기 때문에 각각의 클래스에 따라서 함수명을 별도로 외워서 사용해야 합니다. 이것뿐만이 아니라 상당수 함수명이 통일되어있지 않아서 조금은 불편합니다. 통일성 없는 아이템 모두 제거 함수의 모습 CArray::RemoveAll(); CList::RemoveAll(); CMap::RemoveAll(); CListBox::ResetContent(); CComboBox::ResetContent(); CListCtrl::DeleteAllItems();

개요.. 모든 코드를 64bit 프로그래밍을 하면 좋지만 번거로운 일들이 많습니다. Visual Studio 에서 64비트 이식성 문제로 warning C4267 오류가 발생할 경우가 그렇지요. 굳이 64 비트 프로그래밍을 완벽하게 하지 않아도 무방하다면 다음과 같은 과정을 통하여 해결 할 수 있습니다. 해결 방법 64 비트 오류 warning C4267의 예 1>d:\pmangoengine\include\pdcsurface.h(94) : warning C4267: '인수' : 'size_t'에서'int'(으)로변환하면서데이터가손실될수있습니다. 1>d:\pmangoengine\include\panifile.h(121) : warning C4244: 'return' : 'INT_PTR'에서'int'(으)로..

개요.. 제가 개발한 아이피 주소(IP Address) 문자열(String)의 유효성을 검사하는 함수를 소개해드립니다. 아래와 같은 곳에서 IP 주소를 입력을 받을 경우 문자열을 검사하는데 사용합니다. 코드 함수 원형 BOOL IsAvailableIP( LPCSTR szIP ) { if( szIP == NULL ) return FALSE; int len = strlen( szIP ); // 7자( 1.1.1.1 ) 이상&& 15자( 123.123.123.123 ) 이하 if( len > 15 || len < 7 ) return FALSE; int nNumCount = 0; int nDotCount = 0; // 유효성검사 for( int i = 0; i< len; i++ ) { if( szIP[ i ] ..

개요.. Visual Studio C++ 2005,2008 에서 "한 단계씩 코드실행(F10)" 과 "프로시저 단위 실행(F11)"을 이용하여 디버깅을 하다 보면 F11로 CString 내부 디버깅(Debug) 코드로 들어가면(진행하면)서 불편한 경우가 많이 발생합니다. CString 및 기타 디버깅 할 필요가 없는 클래스 내부 디버깅 코드로 들어가지 않는 방법을 설명 드립니다. 방법 디버깅하지 않을 클래스 또는 함수를 아래와 같이 레지스트리를 등록합니다. Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\NativeDE\StepOver] "1"="\\scope:CString.*\\:\\:..
개요.. 지울 수 없는 파일 즉 읽기 전용 속성이 있는 파일들은 DeleteFile 함수로 삭제를 할 수 없습니다. 그러한 파일을 삭제하기 편리하도록 읽기 전용 속성을 제거하고 파일을 삭제, 제거하는 함수가 RealDeleteFile 입니다. 함수 BOOL RealDeleteFile( LPCSTR szFileName ) { SetFileAttributes( szFileName, FILE_ATTRIBUTE_NORMAL ); return DeleteFile( szFileName ); } 사용예 RealDeleteFile( "DeleteFileName.dat" );
개요.. 디렉토리(폴더)의 모든 파일을 제거, 삭제하는 함수 DeleteAllFile 입니다. 파일을 삭제하는 함수이므로 주의해서 사용하시기 바랍니다. 함수 핵심 코드는 CFileFind, FindFile, DeleteFile 입니다. void DeleteAllFile( LPCSTR szDir ) { CString strName; strName.Format( "%s\\*.*", szDir ); CFileFind ff; BOOL bFind = ff.FindFile( strName ); while( bFind ) { bFind = ff.FindNextFile(); if( ff.IsDots() == TRUE || ff.IsDirectory() == TRUE ) continue; DeleteFile( ff.Ge..
Kyuseo's C++ 프로그래밍 스타일 가이드라인 ::코딩/프로그래밍 규칙 Kyuse's C++ Programming style guideline (Coding / Programming rule) 버전 : 2.2 작성자 : 채경석 ㈜누리게임즈 대표 http://www.nurigames.com http://soonsin.com/저작권 : 출처 및 링크를 표시하여 자유롭게 사용합니다. 업데이트 : 날짜장소내용1997Skyteam 기본 개념 작성 2000~2004 Sky Soft전반적 이론 및 규칙 확립2005- 4- 13Freechal체계화된 정리2006-09-12Fungrep1차 개정2008-01-24Fungrep2차개정2008-01-31 띄어쓰기 및 보기 좋게 편집 변경 개요.. 본 가이드는 절대적이거..

개요.. 윈도우 98, Me (Window 98, Me)에서 유니코드(Unicode) 지원 방법(Micorsoft Viusal C++ .NET 2003)을 설명드립니다. 윈도우에서 여러 언어를 지원하는 소프트웨어를 만들 경우 유니코드가 한가지 방법이 될 수 있습니다. 하지만 윈도우 98, Me(Window 98 Me)에서는 유니코드를 지원하지 않기 때문에 아래와 같은 방법으로 유니코드를 지원 하도록 해야 합니다. 방법 - 프로젝트 속성 -> 일반 -> 문자집합에 "유니코드 문자 집합 사용"으로 변경한다. - 프로젝트 속성 -> 일반 -> MFC사용에 ""정적 라이블러리 사용""으로 변경한다. (MFC를 사용할경우) - 프로젝트 속성 -> 링커 -> 입력 -> 특정라이블러리 무시에 아래를 추가 한다. ke..
개요.. 1기가바이트 이상의 대용량 텍스트 변경을 fgets 함수로 한다면 로딩 & 변경이 너무 느립니다. 대용량 텍스트(Text) 파일의 스트링(string) 검색 & 변경 방법에 대하여 알려드립니다. 방법 A : 원본파일, B : 결과파일 1. A 파일을 fread로 1메가씩 문자열 메모리로 로딩 2. 로딩된 문자열을 strstr 및 직접 제작한 함수로 찾고 수정 3. 수정된 문자열 메모리를 B 파일에 fwrite로 저장 4. 1번으로 복귀 위와 같은 방법을 사용하면 빠르게 변경이 가능합니다.
개요.. STL 의 stack(스텍) 또는 queue(큐)의 clear 방법에 대하여 설명해드립니다. 방법 STL stack(스텍) 또는 queue(큐)는 clear 함수를 제공하지 않습니다. 따라서 아래와 같이 pop 함수를 while 함수에서 호출하여 모두 삭제(clear) 할 수 있습니다. stack s; s.push( 1 ); s.push( 2 ); s.push( 3 ); // using stack... // 스텍 또는 큐의 클리어 방법 while( !s.empty() ) s.pop();

개요.. CWinThread::PreTranslateMessage 함수는 윈도우(CWnd)의 자식을 비롯하여 다양한 윈도우 메시지를 가로채서 처리하는 역할을 합니다. PreTranslateMessage 함수를 재정의하여 메시지(Message, MSG) 를 처리한 이후에 리턴값을 어떻게 하는지 설명합니다. 설명 PreTranslateMessage함수를 재정의 하여, - 더 이상 메시지가 처리되지 않기를 바란다면 1(0이 아닌값)을 리턴 합니다. - 만일 메시지가 계속 처리하기를 원한다면 0을 리턴 합니다. 참고로 MFC CWnd 의 다음과 같은 코드를 보면 PreTranslateMessage 함수의 리턴값이 0 이 아니라면 더 이상 메시지를 Walk 하지 않습니다. BOOL PASCAL CWnd::Walk..

개요.. Kyuseo가 즐겨 사용하는 Visual Studio 6.0 과 유사하도록 설정한 Visual Studio 2005 단축키 및 옵션 설정(세팅) 입니다. 2005 는 6.0과 달리 복잡한 세부적인 설정까지 할 수 있어서 좋더군요. 2005에서 프로그래밍 하시는 분들은 참고하세요. Kyuseo's Visual Studio 2005 설정 - 옵션 설정 (세부설명 : F1 을 눌러서 msdn 도움말을 참고) - 단축키 설정 빌드.선택영역빌드 : F7 빌드.선택영역다시빌드 : Shift+F7 파일.모두저장 : Alt S 편집.클립보드링순환 : Ctrl+Shift +V 창.자동숨기기 : Ctrl+` 보기.솔루션탐색기 : Ctrl+1 보기.클래스뷰 : Ctrl+2 보기.리소스뷰 : Ctrl+3 Visual..

개요.. 게임 개발을 하면 다양한 해상도의 800x600, 1024x768등의 전체 화면 모드로 개발을 할 경우가 많습니다. 전체 화면 변경을 쉽게 하는 클래스와 프로젝트를 강의 합니다. 전체 소스 다운로드 스크린샷 강좌 1. MFC 로 Dialog 기반 프로젝트를 생성합니다. 2. 다음과 같은 윈도우 컨트롤을 배치합니다. 3. OnInitDialog() 함수에서 화면 모드를 가져와서 리스트에 추가하는 코드를 추가합니다. // 화면모드를모두가져오기 // 모드가얼마나존재하는지알아오기 DEVMODE temp_dev; for( int i=0; ; i++ ) { if( EnumDisplaySettings( NULL, i, &temp_dev ) == FALSE ) break; } CString str; m_aDe..
개요.. 클래스의 const 함수는 const 함수만을 호출 할 수 있습니다. 하지만 일반 클래스 함수를 호출 할 경우도 있는데 const 함수 에서 일반 함수를 호출하는 방법을 알려드립니다. 방법 함수 내부에서 this 포인터를 강제로 형변환하여 사용합니다. 예) CFile* pFile = (CFile*)this; 강제적으로 변환하기 때문에 위험합니다. 이와 같은 기법은 주의하여 사용합시다. MFC CFile의 예제 코드 아래와 같이 CFile의 GetLength() 는 100% const 함수이지만, 내부적으로 const 가 아닌 함수를 사용하므로 컴파일 문제가 생깁니다. 이와 같은 경우 MFC에서는 이 기법을 이용하여 해결 하였습니다. // MFC의 CFile 의 예 DWORD CFile::GetL..
개요.. const 함수는 클래스의 변수를 변경하지 않을 경우 사용하는 함수 입니다. 또한 클래수 변수의 포인터(*) 또는 참조(&)를 리턴하면 외부에서 그 값을 변경할 수 있기 때문에 그것을 리턴하면 안됩니다. 결론 - 클래스 외부에서 값을 얻는 함수는 const 함수를 사용하지 않는다. - const 함수에서는 포인터(*) 또는 참조(&)를 값을 얻기 위한 인자로 사용하지 않는다. - (const) 포인터(*), 참조(&)를 리턴하는 함수는 const 함수를 사용하지 않는다. const 함수의 특성을 잘 보여주는 코드 // CArray 와 const 함수의 관계를 잘 보여주는 테스트 클래스 // const 함수에 따라서 CArray의 operator[] 함수의 호출되는 내용이 바뀌므로 매우 주의를 요..