MyAlbum   Pet
DirectX   openGL   Java   C/C++   STL   C#   Python   Window   ActiveX   SE & Refactoring   Game   Unicode   googleDesktop   Network   Database   Web   php   asp   asp.net   Library   QT   wxWidget   Something to read  
ToDo
zelon's WebAlbum
Google Tools
Google Naver map
ToRearrange
OpenOffice.org
Eclipse
Check W3 validator
Game Programming
e i R f
Anonymous

Contents

1 speed hacking
2 게임 서버 개발자 커뮤니티
3 일반
3.1 HDR
3.2 아이디등을 한글, 영어, 숫자로 제한하기
3.3 액션 게임에서의 키보드 입력 처리
3.4 게임 프로그래밍 읽을 거리들
3.5 Keyboard hooking
3.6 게임 인공지능
3.7 윈도우에서 리눅스로 게임 서버 전환하기
3.8 탐색의 기초
3.9 게임 클라이언트 프로그래밍 관련 오픈 소스
3.10 ogg DirectSound8 로 출력하기
3.11 시스템 키 및 윈도우 키 막기
3.12 Seamless Server 에 관한 논의
3.13 상용급 엔진 분석해보기
3.14 ase 파일을 불러올 때 bad suffix on number 에러
3.15 파일을 압축해서 virtual file system 구축하기
3.16 3d object 파일을 구할 수 있는 곳
4 네트워크 관련
4.1 스타크래프트의 네트워크
4.2 게임 서버 프로그래밍 관련 오픈 소스
4.3 서버의 용량, 접속자 수
4.4 Game Server Programming Gem
4.5 dead reckoning
4.6 게임 클라이언트끼리 동시에 시작하기
4.7 NAT P2P
5 기타
5.1 윈도우2000 이상에서의 thread pool
5.2 크래킹 프로그램 방지
6 링크들

1 speed hacking #


2 게임 서버 개발자 커뮤니티 #


3 일반 #


3.1 HDR #


3.2 아이디등을 한글, 영어, 숫자로 제한하기 #


유니코드로 바꾼 다음 범위를 체크한다.

int main( )
{
	while ( true )
	{
		std::string strInput;
		cin >> strInput;

		WCHAR wbuf[50] = { 0 };

		if ( 0 >= MultiByteToWideChar(CP_ACP, 0, strInput.c_str(), strInput.size(), wbuf, 50) )
		{
			cout << "can't convert" << endl;
			return -1;
		}

		bool bOK = true;

		for ( int i=0; i<50; ++i)
		{
			if ( wbuf[i] == 0 ) break;

			// 한글인가
			if ( wbuf[i] >= L'가' && wbuf[i] <=	L'ㅤㅎㅣㅎ' )
			{
			}
			else if ( wbuf[i] >= L'a' && wbuf[i] <= L'z' )
			{
			}
			else if ( wbuf[i] >= L'A' && wbuf[i] <= L'Z' )
			{
			}
			else if ( wbuf[i] >= L'0' && wbuf[i] <= L'9' )
			{
			}
			else
			{
				bOK = false;
				break;
			}
		}

		if ( bOK )
		{
			cout << "ok" << endl;
		}
		else
		{
			cout << "not ok" << endl;
		}
	}
	return 0;
}

3.3 액션 게임에서의 키보드 입력 처리 #


3.4 게임 프로그래밍 읽을 거리들 #


[http]Game Programming Damns

[http]MS의 얼리언스 소스공개

3.5 Keyboard hooking #

http://www.codeproject.com/system/KeyHook.asp

3.6 게임 인공지능 #


http://www.gameai.net

3.7 윈도우에서 리눅스로 게임 서버 전환하기 #


3.8 탐색의 기초 #


http://aiwiz.2ing.net/wiki/%C5%BD%BB%F6%C0%C7%B1%E2%C3%CA


3.9 게임 클라이언트 프로그래밍 관련 오픈 소스 #

http://www.cs.auc.dk/~olau/monster-masher/ 액션게임 몬스터 매셔 http://sourceforge.net/projects/gamedev/ Scrolling Game Development Kit


3.10 ogg DirectSound8 로 출력하기 #

http://www.icarusindie.com/devzone/oggvorbistut.php

3.11 시스템 키 및 윈도우 키 막기 #


http://msdn.microsoft.com/msdnmag/issues/02/09/cqa/default.aspx

from GPGStudy : http://gpgstudy.com/forum/viewtopic.php?topic=3146

3.12 Seamless Server 에 관한 논의 #


3.13 상용급 엔진 분석해보기 #



상용 게임엔진 말고도 공부해볼만한 게임엔진들은 많습니다. 퀘이크 BSP 계통의 엔진인 CrystalSpace (엔진과 호환되는 맵툴, 캐릭터툴 등의 툴들이 존재합니다. 그래픽api는 DX7시절 수준입니다만 하프라이프나 퀘이크 맵들을 돌려볼 수 있습니다. http://crystal.sourceforge.net 현재 괜찮아보이는 공개3DMMORPG게임 프로젝트가 이 엔진으로 진행중입니다. http://www.planeshift.it/ ), 그리고 python과 완전히 결합된 게임엔진인 nebula device (이 엔진으로는 상용게임도 제작되었습니다. python만으로도 게임제작이 가능할 정도로 파이썬 스크립트를 제대로 지원하는 객체지향 게임엔진입니다. http://nebuladevice.sourceforge.net ) 같은 것들은 상용게임엔진 못지않은 구조를 자랑합니다. 사실 이런 엔진들을 보고 있노라면 적어도 "기술적인 측면"에서는 상용게임엔진이 굳이 필요없을 수도 있다는 생각을 하기도 합니다.


3.14 ase 파일을 불러올 때 bad suffix on number 에러 #


매크로를 하나 만들었는데 매크로 인수로 O(알파벳) 와 0(숫자)를 
혼돈하여 잘못 넣었을 때 그런 에러를 내더군요....

3.15 파일을 압축해서 virtual file system 구축하기 #

3.16 3d object 파일을 구할 수 있는 곳 #

http://www.kgdb.or.kr/


4 네트워크 관련 #


4.1 스타크래프트의 네트워크 #


4.2 게임 서버 프로그래밍 관련 오픈 소스 #

http://sourceforge.net/projects/uox3/ 울티마 온라인 http://sourceforge.net/projects/wpdev/ 울티마 온라인


4.3 서버의 용량, 접속자 수 #

http://gpgstudy.com/forum/viewtopic.php?t=3013

4.4 Game Server Programming Gem #


[http]창필이형의 위키에서

4.5 dead reckoning #


4.6 게임 클라이언트끼리 동시에 시작하기 #


기준이 되는 컴퓨터의 시간과 클라이언트 컴퓨터의 시간 차이를 잰다.

기준이 되는 컴퓨터의 시작 이벤트를 적당한 시간 후에 할 것이라고 클라이언트에 알린다.

클라이언트는 이벤트를 받은 후 앞에서 잰 시간 차이를 계산해서(Ping 이용) 같은 시간에 시작 이벤트를 발생시킨다.

4.7 NAT P2P #



5 기타 #


5.1 윈도우2000 이상에서의 thread pool #



  • msdn 에서 QueueUserWorkItem 를 시작으로 찾아보자. OS 차원에서 thread pool 을 제공해준다는데...

  • 5.2 크래킹 프로그램 방지 #



  • get process list
  • #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
    					   LPMODULEENTRY32 lpMe32, DWORD cbMe32)
    {
    	BOOL          bRet        = FALSE;
    	BOOL          bFound      = FALSE;
    	HANDLE        hModuleSnap = NULL;
    	MODULEENTRY32 me32        = {0};
    
    	// Take a snapshot of all modules in the specified process.
    
    	hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    	if (hModuleSnap == INVALID_HANDLE_VALUE)
    		return (FALSE);
    
    	// Fill the size of the structure before using it.
    
    	me32.dwSize = sizeof(MODULEENTRY32);
    
    	// Walk the module list of the process, and find the module of
    	// interest. Then copy the information to the buffer pointed
    	// to by lpMe32 so that it can be returned to the caller.
    
    	if (Module32First(hModuleSnap, &me32))
    	{
    		do
    		{
    			if (me32.th32ModuleID == dwModuleID)
    			{
    				CopyMemory (lpMe32, &me32, cbMe32);
    				bFound = TRUE;
    			}
    		}
    		while (!bFound && Module32Next(hModuleSnap, &me32));
    
    		bRet = bFound;   // if this sets bRet to FALSE, dwModuleID
    		// no longer exists in specified process
    	}
    	else
    		bRet = FALSE;           // could not walk module list
    
    	// Do not forget to clean up the snapshot object.
    
    	CloseHandle (hModuleSnap);
    
    	return (bRet);
    }
    
    BOOL GetProcessList ()
    {
    	HANDLE         hProcessSnap = NULL;
    	BOOL           bRet      = FALSE;
    	PROCESSENTRY32 pe32      = {0};
    
    	//  Take a snapshot of all processes in the system.
    
    	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    	if (hProcessSnap == INVALID_HANDLE_VALUE)
    		return (FALSE);
    
    	//  Fill in the size of the structure before using it.
    
    	pe32.dwSize = sizeof(PROCESSENTRY32);
    
    	//  Walk the snapshot of the processes, and for each process,
    	//  display information.
    
    	if (Process32First(hProcessSnap, &pe32))
    	{
    		DWORD         dwPriorityClass;
    		BOOL          bGotModule = FALSE;
    		MODULEENTRY32 me32       = {0};
    
    
    		do
    		{
    			printf("szExeFile : %s\n", pe32.szExeFile);
    
    			bGotModule = GetProcessModule(pe32.th32ProcessID,
    				pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
    
    			if (bGotModule)
    			{
    				HANDLE hProcess;
    
    				printf("Work on process\n");
    
    				// Get the actual priority class.
    				hProcess = OpenProcess (PROCESS_ALL_ACCESS,
    					FALSE, pe32.th32ProcessID);
    				dwPriorityClass = GetPriorityClass (hProcess);
    				CloseHandle (hProcess);
    
    				// Print the process's information.
    				printf( "\nPriority Class Base\t%d\n",
    					pe32.pcPriClassBase);
    				printf( "PID\t\t\t%d\n", pe32.th32ProcessID);
    				printf( "Thread Count\t\t%d\n", pe32.cntThreads);
    				printf( "Module Name\t\t%s\n", me32.szModule);
    				printf( "Full Path\t\t%s\n\n", me32.szExePath);
    			}
    		}
    		while (Process32Next(hProcessSnap, &pe32));
    		bRet = TRUE;
    
    	}
    	else{
    		bRet = FALSE;    // could not walk the list of processes
    	}
    
    	// Do not forget to clean up the snapshot object.
    
    	CloseHandle (hProcessSnap);
    	return (bRet);
    }
    
    

    • wndclass 로 윈도우 찾기
    HWND hwnd = FindWindow("TGM8", NULL);
    
    if ( hwnd )
    {
       /// ....
    }
    

    6 링크들 #