일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 판매
- Mame32
- 맞고게임
- 프로그램 개발
- 포커
- 고스톱
- 티스토리 초대장
- 포커게임
- 영어단어
- 게임 개발
- 써치아이
- 카일레라서버
- 윈윈
- 맞고
- holdem
- 틀린그림 찾기
- MAME
- 보드게임
- 틀린그림찾기
- 영어단어게임
- 윈윈전략
- 서치아이
- 프로그램 외주
- 상호링크
- 카일레라
- 게임 외주
- 온라인게임
- 옥션소송
- 옥션해킹
- 홀뎀
- Today
- Total
목록C++ 개발 (119)
kyuseo의 게임 프로그래밍
개요.. 제가 사용중인 자주 사용하는 코드들을 쉽게 입력할 수 있는 비쥬얼 어시스트(Visual Assist) TPL 매크로 :: 2004년 6월 버전입니다. 사용 방법 1. VAssist.tpl 파일로 저장하여 비쥬얼 어시스트 (Visual Asssist) 디렉토리에 복사한다. 2. "Shift+마우스오른쪽 -> Edit Code Templates" 으로 직접 입력한다. TPL 전문 readme: AutoText and Code Template entries used by Visual Assist. You can obtain information on the purpose and format of this file by clicking "Help..." on the Auto Completion tab ..
개요.. 1000개의 빠른 TRACE 를 호출 할 경우 1000개 모두 디버그 창에 출력되리라고 믿지 마세요. 버퍼에 초과된 TRACE 는 출력되지 않습니다. 해결책 1. TRACE를 아래와 같은 빠른 반복구문에서는 사용하지 않는다. 2. 사용하더라도 100% 신뢰하지 않는다. 3. 정말 정확한 정보를 알고 싶다면 디버그 구문을 파일로 출력한다. 4. Sleep() 을 이용하여 느리게 출력한다. 코드 for( int i=0; i
개요.. if 구문에서 비교 연산을 동시에 할 경우 어느 구문을 먼저 사용하고 생략하는지 Release 버전과 Debug 버전을 실험을 해보았습니다. 다운로드 결론 - if 구문내의 모든 비교연산은 앞의 것부터 뒤의 것을 순차적으로 연산하고 - || 연산의 경우 앞의 것이 1개라도 참이라면 더 이상 연산을 하지 않고 - && 연산의 경우 앞의 것이 1개라도 거짓이라면 더 이상 연산을 하지 않습니다. 이러한 연산 순서를 알면 if 문을 유용하게 사용할 수 있습니다. 코드 if 구문의 strlen과 NULL 을 비교 하는 경우 BOOL is_1over_length( LPCSTR psz ) { if( psz != NULL && strlen( psz ) > 1 ) return TRUE; // NULL 부터 비교..
개요.. 부모 클래스와 자식 클래스가 같은 함수의 이름을 사용하면 발생하는 암묵적으로 상속받은 부모 클래스의 함수 감춤 현상과 해결책을 알려드립니다. 핵심내용은 using 키워드의 사용입니다. 오류 내용 class CParent { public: CParent(){}; virtual ~CParent(){}; virtual void Fun( int n ) { printf( "CParent Fuc Int %d\n", n ); } virtual void Fun( char* sz ) { printf( "CParent Fun String %s\n", sz ); } }; class CChild : public CParent { public: CChild(){}; virtual ~CChild(){}; void Fun..
개요.. 프로그래밍 문서화 도구인 독시젠(Doxygen) 으로 프로젝트에 적용한 예를 보여드립니다. 스타일시트인 css 파일을 수정하니 예쁘게 문서화가 만들어지는군요. 또한 상속이 표현되어 구조도 쉽게 파악이 되어서 좋습니다. 스크린샷
개요.. 최근 국내 소프트들도 해외 진출이 많고 간단한 유틸리티 프로그램도 다국어 지원을 많이 합니다. 다국어 개발에 관한 기본적인 방법을 설명해드립니다. 다운로드 (피망고 게임엔진을 이용하기 때문에 컴파일은 되지 않습니다.) 1. 다국어 지원용 ini 파일을 구성합니다. ====== Kor.ini 파일 ====== ; 한국어 [ title ] 100 = 다국어 다이알로그 박스 [ control ] 1000 = 확인 1001 = 취소 1002 = 한국어 1003 = 영어 1004 = 다국어 버튼 1005 = 언어를 선택하세요 1010 = 다국어 버젼을 만들기는 쉽습니다. 1011 = 하지만 많은 노력이 필요합니다. [ message ] 1020 = 메세지 박스입니다. ====== eng.ini 파일 ==..
개요.. 게임을 실행시키고 인터넷을 하거나 다른 작업중인 상태에서 다른 사람이 입장하거나, 게임 시작 하는 경우, 작업바( Task Bar ) 가 깜빡( Flash ) 거리면서 사용자에게 알려주면 효과적입니다. 그것을 구현 하고 테스트 하는 프로그램을 만들어 보았습니다. 다운로드 핵심 코드 // 일정시간마다윈도우를깜빡거린다. void CFlashTestDlg::OnTimer(UINT nIDEvent) { // 일정시간마다윈도우를깜빡거린다. if( nIDEvent == TIME_ID_FLASH_WINDOW ) { FlashWindow( TRUE ); } // 3초후에액티브상태가아니면깜빡인다. else if( nIDEvent == TIME_ID_3SEC_FLASH_WINDOW ) { KillTimer( TI..
개요.. CList 와 CMap 는 유용한 MFC 클래스 입니다. 안전하게 아이템을 제거, 삭제 방법에 대하여 알려드립니다. CList와 CMap 는 순차 검색을 하면서 특정 아이템을 제거하는 과정이 조금은 까다로울 수 있는데, CList 는 이전 위치를 제거하고, CMap 은 키를 삭제하면 안전하게 제거됩니다. 코드 - CList 의 제거 방법 int i; POSITION pos, old; ///////////////////////////////////////////////////////////////////////////// // CList 의 예 CList list; // 아이템을 추가한다. for( i=0; i map; for( i=0; i
개요.. 예전에 프로그래밍을 배우시는 초심자 분으로부터 질문을 받았습니다. 컴파일 오류 관련 질문인데stl 의 string 의 용법을 잘 몰라서 한 실수였습니다. 우선 질문의 정답은 오류코드 : if( strcmp( str, second ) == 0 ) 수정코드 : if( strcmp( str.c_str(), second.str.c_str() ) == 0 ) 하지만 코드를 살피던 도중 너무 큰 문제점들이 보여서 몇몇 오류를 지적해보았습니다. "백문이 불여일타!!!"이고 모르면 찾아보고 물어보고, 그것이 배우는 지름길임에는 틀림이 없고 질문자의 큰 발전을 이루겠지요. 아래 코드의 주석 내용을 잘 살펴보셔서 조금은 도움이 되시길 기원합니다. 코드 #include #include using namespace ..
개요.. CFile 보다 FILE 가 약 10배 빠르다던 글이 있어서 CFile, HFILE, FILE 대용량 파일 로드(읽기) 속도를 비교, 실험 해 보았습니다. 실험방식 - 약 20M 바이트의 파일 3개의 실험 재료로 준비한다. - FILE, CFile, HFILE 을 3회 이상 테스트한다. 코드 for( int i=0; i
개요.. 윈도우 프로그래머는 디버깅이 편리하도록 윈도우 디버그 심볼 (Debug Symbol) 을 설치하면 매우 편리합니다. 아래 링크를 통하여 다운로드 받아 설치하시기를 권장합니다. 다운로드
개요.. CArray 에서 수 십만개 ~ 수 백만개 의 대용량 데이터를 내용을 삽입하면, 추가하는 속도가 매우 느립니다. 그 해결 방법을 알려드립니다. 해결 방법 1. 정확한 크기를 알 경우 void SetSize( int nNewSize, int nGrowBy = -1 ); 알고 있는 크기를 SetSize 의 nNewSize 로 설정한다. ex) array.SetSize( 9900000 ); 2. 정확한 값을 모를 경우 (대략적인 커지는 크기는 알 경우) void SetSize( int nNewSize, int nGrowBy = -1 ); 커지는 크기를 SetSize 의 nGrowBy 을 크게 설정한다. ex) ex) array.SetSize( 0, 100000 );
개요.. Visual C++ 6.0 에서 COM 또는 ATL, ActiveX 빌드 완료 이후에, regsvr32가 실행되지 않아서 등록이 되지 않고, 아래와 같은 메세지가 나오는 경우가 있습니다. 'regsvr32'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 이유는 "Visual C++" 이 "regsvr32.exe" 파일을 찾지 못하는 경우 발생되는 현상입니다. 해결방법 - 프로젝트와 동일한 폴더에 regsvr32.exe을 복사를 합니다. - Visual C++ 가 설치된 폴더에 regsvr32.exe을 복사합니다. (C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin에 regsvr32.exe복사) 아무래..
개요.. int, int64 사용 할 경우 억, 조와 같은 돈(Money) 단위에서 오버플로우를 조심해야 합니다. 특히 define, 상수를 사용할 경우, 내부에서는 32비트 int로 처리되어 값이 오버플로우가 발생되기 때문에 더욱 주의를 해야 합니다. 따라서 define 대신 static const 을 이용하여 값을 처리하면 좋습니다. 코드 // 한글 돈 단위 // 영문 돈단위는 영국과 미국의 해석이 틀리고 동일 나라에서도 뜻하는 바가 틀리기 때문에 한국식으로 표기한다. ststic const INT64 UK = 100000000; // 억 #define DEFINE_UK 100000000; // 억 // 테스트 INT64 nMoney = 500 * UK; // nMoney = 50000000000 :..
개요.. 파일의 날짜와 시간을 설정하는 GetFileTime과 SetFileTime함수는 파일 시스템에 따라서 시간 오차가 생길 수 있습니다. 특히 WriteTime 함수는 2초가량의 오차가 발생되므로 사용시 많은 주의가 필요합니다. 압축 프로그램 역시 시간 오차가 많이 발생하는 프로그램 입니다. 특히 공개된 압축 ZLib 소스는 오차가 존재하지요. 참고 Remarks Not all file systems can record creation and last access time and not all file systems record them in the same manner. For example, on Windows NT FAT, create time has a resolution of 10 mill..
개요.. Visual Studio 6.0 에서 2005 로 버전이 올라가면서 발생되는 프로그래밍 관련 변경사항을 정리합니다. for 구문에서 선언한 변수들은 for 구문을 벗어나면 변수의 수명이 다한다. for( int i = 0; i st..
개요.. Windows 2000 / XP에서 정상 작동되는 프로그램이 Windows 98 에서 정상 작동 되지 않는 현상을 발견하여, 시행착오와 테스트를 통하여 윈도우 API 함수인 IntersectRect 함수의 결함을 발견하였습니다. IntersectRect 함수는 BOOL을 반환하도록 설계가 되어있지만, 이상한 원인으로 Window 98 에서는 리턴값이 TRUE(1), FALSE(0)이 아닌 0, Not 0 을 리턴하는 사실을 발견하였습니다. 따라서 그 함수의 리턴값을 사용할 경우 0 과 Not 0으로 비교해야 올바른 결과를 얻을 수 있습니다. 테스트 코드 void IntersectRectTest() { // 겹친 사각형 테스트 // rtn 이 TRUE(1)이 나오면 정상, Window XP /20..
개요.. MFC 자료구조용 템플릿 클래스인 CArray는 정렬에서 불편함을 느끼게 됩니다. C++ 표준 함수인 qsort 함수를 이용하기도 어렵고, 자체로는 알고리즘은 제공되지 않으니 qsort 함수와 CArray클래스를 활용하여 하나의 함수로 정렬을 구현을 해 보았습니다. ( STL 의 vector과 같이 쉽게 정렬할 수 있으면 좋으련만…) 코드 다음은 CArray 를 qsort 함수를 이용하여 쉽게 정렬하는 템플릿입니다. #include "afxtempl.h" // CArray 정렬템플릿함수 template void QSortCArray( T& t, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ) { if( t.GetSize() *p..
개요.. AfxGetMainWnd() 함수는 MFC 프로그래밍에서 어플리케이션의 메인 윈도우를 얻기 위하여 자주 사용하는 함수입니다. 하지만 문제는 이 함수가 항상 원하는 윈도우를 리턴하지 않을 수 도 있다는 것입니다. 즉 MVC 구조에서 CMainFrameWnd, 다이얼로그에서 CMainDialog 를 항상 리턴하지 않습니다. 따라서 MainWindow 가 완전하게 생성되기 전에 AfxGetMainWnd() 을 호출할 경우 리턴되는 윈도우를 주의하여 사용해야 합니다. (특히 스플레시 윈도우가 있을 경우) 내용 AfxGetMainWnd()는 다음과 같은 순위로 윈도우를 리턴 합니다. 1순위 : CWinThread::m_pActiveWnd (주의 : CWinThread 의 m_pActiveWnd 는 CWn..
개요.. Visaul C++ 에서 디버깅 도중 '중단점이 현재 적중되지 않습니다. 이 문서의 기호가 로드되지 않았습니다.' 라고 나오면서 중단점 디버깅이 되지 않을 경우 해결 방법을 알려드립니다. 올바른 소스임에도 불구하고 아래와 같은 원인이 발생되는 원인은 VC에서 유니코드 즉 한글이 올바르게 지원되지 않기 때문입니다. 중단점 오류 스크린샷 : 해결방법 도구 ->옵션 -> 디버깅 -> 일반 "소스 파일이 원래 버전과 정확하게 일치해야 함" 체크를 제거합니다.
개요.. GetLastError() 함수로 HRESULT 형태의 오류를 찾았을 경우, 오류 값(HRESULT)으로 @err 및 Error Lookup을 사용하여 오류 내용을 파악하는 방법을 알려드립니다. 방법 1. Error Lookup 사용 - Error Lookup 을 실행시켜 오류값을 입력합니다. ("C:Program FilesMicrosoft Visual StudioCommonToolsERRLOOK.EXE") 2. 디버그 모드에서 Watch 창 사용 Watch 창에 @err,hr 구문을 삽입합니다. 예제 아래 함수를 실행하여 오류가 발생할 경우 오류를 찾아보세요. CFile file; file.Open( "D:no.dat", 0 );
개요.. 프로그램이 최초 실행 시 트레이에서 실행되는 메신저 프로그램처럼, 창으로 뜨지 않고 시작하는 프로그래밍 방법을 설명합니다. 핵심.. 화면에 보이지 않는 모달리스 다이알로그(Modaless Dialog)로 개발합니다. 사용방법.. 0. 헤더에 선언한다. CNorazoClientLauncherDlg* m_pDlg; 1. 다이알로그를 모달리스윈도우로 생성한다. BOOL CNorazoClientLauncherApp::InitInstance() { ... ... m_pDlg = new CNorazoClientLauncherDlg; m_pDlg->Create( CNorazoClientLauncherDlg::IDD ); m_pDlg->ShowWindow( SW_HIDE ); m_pMainWnd = m_pDl..
개요.. 종종 게임 서버에서는 이벤트나 특정 날짜에만 실행되는 부분을 추가할 일이 생깁니다. 하지만 그 시간에 맞추어서 서버를 업데이트하기도 힘들지요. 그러한 경우 아래 코드를 사용하면 쉽게 해결됩니다. 코드 2005년 10월 1일 0시 0분 0초 ~ 2005년 10월 19일 59분 59초 까지 하는 이벤트의 예... // 날짜 계산 CTime timeCurrent = CTime::GetCurrentTime(); CTime timeStart( 2005, 10, 1, 0, 0, 0 ); CTime timeEnd( 2005, 10, 20, 0, 0, 0 ); // 이벤트 가능 날짜 if( timeCurrent >= timeStart && timeCurrent < timeEnd ) { // 아싸 이벤트~ 추가..
개요.. MFC 프로그래밍에서 이미지 뷰어나 노트 패드와 처럼 탐색기에서 더블클릭으로 실행하는 프로그램은, 매우 긴 경로가 인자로 있다면 '게임~3.dat'와 같이 짧은 경로로 변환이 되어 입력이 됩니다. 이와 같은 단축 경로명이 보기 좋지 않기 때문에 아래와 같이 코드를 수정하면 전체 경로명으로 표현이 됩니다. 코드 BOOL CRSeeApp::InitInstance() { ... ... // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 짧은 주소를 길게 바꾼다. char szLongPathName[1024]; if( GetLongPath..
개요.. 다수의 아이피(IP)를 가지고 있는 경우 자신의 아이피(IP) 주소 목록을 얻는 프로그램입니다. 아래와 같이 winsock의 gethostname(), gethostbyname()을 이용하면 아이피 목록을 쉽게 알아낼 수 있습니다. 다운로드 핵심코드: 코드 참고 : http://www.debuglab.com/knowledge/getip.html void GetMyIPArray( CArray& raIP ) { WSADATA WsaData; if( WSAStartup( 0x202, &WsaData ) == SOCKET_ERROR ) return; char name[256]; PHOSTENT pHostInfo; struct sockaddr_in addr; // 자..
개요.. Visual Studio 2003에서 WCHAR (wchar_t) 을 이용한 프로그래밍에서 주의사항에 대하여 설명해드립니다. 오류 재현 // wchar_t 사용 클래스 class CTest { public: CTest(void); ~CTest(void); int Get( char c ); int Get2( wchar_t s ); }; // 외부에서 위 클래스 함수 호출시 오류 _mfc_testDlg.obj : error LNK2019: "public: int __thiscall CTest::Get2(wchar_t)" (?Get2@CTest@@QAEH_W@Z) 외부 기호("protected: virtual int __thiscall Cmfc_testDlg::OnInitDialog(void)" (?..
개요.. Visual C++ 6.0 과 달리 Visual C++ 7.1 (Visual Studio 2003) 에서는 Trace가 유니코드(Unicode)를 지원하지 않아 올바른 작동을 하지 않습니다. 따라서 올바른 작동을 위해서는 반드시 Trace의 인자를 Ansi 코드로 입력해야 합니다. 참고 TRACE See Also MFC Macros and Globals | AfxDump | afxTraceEnabled Sends the specified string to the debugger of the current application. TRACE(exp ) TRACE(DWORD category, UINT level, LPCSTR lpszFormat, ... ) Remarks See ATLTRACE2 fo..
개요.. Visual C++ 6.0 과는 달리 Visual 2003, 2005 에서는 str.Empty(); 와 str = _T(""); 가 동일한 작동을 합니다. 따라서 str = "" 과 같은 코드 보다 str.Empty() 함수를 사용하는 것이 미학적, 개념적으로 더 좋습니다. MFC 코드의 모습 ATL.CSimpleStringT void SetString( PCXSTR pszSrc ) { SetString( pszSrc, StringLength( pszSrc ) ); } void SetString( PCXSTR pszSrc, int nLength ) { if( nLength == 0 ) { Empty(); } else { ...
개요.. 응용 프로그램 인증서는 인터넷을 통한 프로그램(OCX, DLL, EXE) 배포 시 필요한 파일입니다. 가격과 제공 회사가 다양하여 정리를 해 보았습니다. 개인적으로는 펀그랩, 티케이 게임에서 사용중인 가격이 저렴한 코모도 인증서를 추천해드립니다. 응용 프로그램 인증서(Active X 인증서)가 장착된 파일을 실행하는 모습 인증서 목록 비교 한국 전자인증 http://www.crosscert.com/service_global/active_2/certification.htm?OVRAW=%EC%95%A1%ED%8B%B0%EB%B8%8C%20%EC%95%A1%EC%8A%A4%20%EC%9D%B8%EC%A6%9D%EC%84%9C&OVKEY=%EC%95%A1%ED%8B%B0%EB%B8%8C%20%EC%97..
개요.. InterlockedExchange는 스레드(Thread)에 안전하게 32bit( INT, LONG, DWORD )형 변수를 교환하는 함수입니다. Visual C++ 6.0 에서는 time_t 자료 형이 4 바이트이지만 Visual Studio 2005에서는 8바이트로 변경되었습니다. 따라서 InterlockedExchange에서는 time_t 자료 형의 변수를 사용하면 안됩니다. 코드 int n = sizeof(time_t ); // n == 8 InterlockedExchange( ( long* ) &m_ttReceive, ( long ) time( NULL ) ); time_t 에서는 이와 같은 InterlockedExchange 는 더이상 쓰면 안됩니다.