간단한 코드 작성시에 콘솔로 테스트를 거친후에 본격적으로 작업을 시작한다. 
 
그러다보면 콘솔 명령어를 자주 사용하게 되는데.
 
예를 들면 콘솔 창에 값들을 출력을 할때 그냥 출력만 하면 금방 화면이 지나가서 해당 부분을 알기 힘든다.
 
그래서 도스명령어를 이용하여 잠시 멈추거나 화면을 클리어 하는데 그에 대한 간단한 명령들을 정리해보았다.
 
system(const char* _command);
이 함수는 도스 명령어를 사용할수 있다록 하는 함수이다.
 
도스명령어
cls : 화면 클리어
pause : 키 이벤트를 받기전까지 멈춰있는다.
echo : 메세지를 표시하거나 사용하지 않는다. 
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (WORD)생상 인덱스); 
enum _Attribute
 {
  BLACK = 0,   // 검정
  DARK_BLUE,          // 어두운 파랑
  DARK_GREEN,         // 어두운 초록
  DARK_SKY_BLUE,      // 어두운 하늘
  DARK_RED,   // 어두운 빨강
  DARK_VOILET,  // 어두운 보라
  DARK_YELLOW,  // 어두운 노랑
  GRAY,    // 회색
  DARK_GRAY,   // 어두운 회색
  BLUE,    // 파랑
  GREEN,    // 초록
  SKY_BLUE,   // 하늘
  RED,    // 빨강
  VIOLET,    // 보라
  YELLOW,    // 노랑
  WHITE,    // 흰색
  COUNT,
};
위 인덱스값은 인위적인 것이다.
 
windows.h 헤더를 인크루드 해야 되고
생상을 지정하면 그이후에 출력 되는 모든 텍스트는 지정된 색상으로 나온다.
그러므로 특정 텍스트만 색상을 주고 싶다면
 
CONSOLE_SCREEN_BUFFER_INFO kInfo;
 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &kInfo);
 
를 사용하여 kInfo.wAttributes 이값으로 다시 Set 해주면 된다.
 
위 인덱스값외에 더 있다. 일정한 반복을 통해서 나오며 위의 인덱스값이 하나의 주기로
16부터 위순서대로 텍스트 색상은 출력이 되지만 배경이 틀리게 된다.
 
예를 들어 0 ~ 15개를 하나의 주기이고 이때 배경색은 검정
16 ~ 31개 첫번째 주기의 텍스트 색상은 같지만 배경은 어두운 파랑이다.
 

배치파일 연산자 및 명령어

 정의

 %

명령어줄 매개변수 접두어 

명령어 옵션 플래그 

 \

디렉토리 패스 구분자 

== 

문자열비교, 같음 

 !==!

문자열비교, 다름 

 |

파이프, 또는 

 @

현재 명령어를 출력(echo)하지 말것 

 *

파일명, 와일드카드 

 >

파일 재지향(덮어쓰기) 

 >>

파일 재지향(덧붙여쓰기) 

 <

표준입력 재지향 

 %VAR%

환경 변수 

 REM

주석 

 NOT

뒤에 나오는 명령어 부정 

 NUL

명령어 출력 없애기 

 ECHO

화명출력 

 ECHO.

화면출력(빈줄하나) 

 ECHO OFF

다음에 나오는 명령어를 화면출력하지 말것. 

 FOR %%VAR IN (LIST) DO

루프 

 GOTO

지정된 곳으로 건너뜀 

 PAUSE

잠시 멈춤 

 CHOISE

메뉴 선택 

 IF

조건문 

 IF EXIT filename

파일이 존재하는지 확인 

 IF !%N==! 

변경 가능한 매개변수인 N이 없다면.. 

 CALL

다른 스크립을 호출 

 COMMAND /C

다른 스크립을 호출 

 SET

환경 변수를 세트 

 SHIFT

명령어줄 변수 목록을 왼쪽으로 이동 

 SGN

부호(정수) 

 ERRORLEVEL

종료 상태 

 CON

콘솔(표준입력) 

 PRN

프린터 디바이스(일반) 

 LP1

프린터 디바이스 (LP) 

 COM1

시리얼 포트 디바이스 

 ASSIGN

파일 디렉토리 링크 

 ATTRIB

파일 퍼미션 변경 

 CD

디렉토리 변경 

 CHDIR

디렉토리 변경 

 CLS

출력화면 깨끗이 

 COMP

파일 비교 

 Ctl - C

정지 

 Ctl - Z

끝(EOF) 

 DEL

삭제 

 DELTREE

하위모두 삭제 

 DIR

디렉토리 보이기 

 ERASE

파일삭제 

 EXIT

프로세스 종료 

 FC

파일비교 

 FIND

찾기 

 MD

디렉토리 생성 

 MKDIR

디렉토리 생성 

 MORE

텍스트 파일 쪽단위 필러 

 MOVE

이동 

 PATH

경로 

 REN

이름바꾸기 

 RENAME

이름바꾸기 

 RD

디렉토리 삭제 

 RMDIR

디렉토리 삭제 

 SORT

파일 정렬 

 TIME

시스템 시간 보여주기 

 TYPE

파일을 출력 

 XCOPY

파일복사(확장) 


WINVER not defined. Defaulting to 0x0600 (Windows Vista)

와 같은 메세지가 나오면 현재 프로젝트의 stdafx.h 파일의 맨 위 부분에 다음과 같이 정의 해 놓는다.

// Visual C++ 4.0 -> 1000
// Visual C++ 5.0 -> 1100
// Visual C++ 6.0 -> 1200
// Visual C++ 7.1(2003) -> 1310
// Visual C++ 8.0(2005) -> 1400

// Visual C++ 9.0(2008) -> 1500
#if _MSC_VER > 1400
// bhyoon, 20080919
// 0x0600 -> Windows Vista
// 0x0502 -> Windows Server 2003
// 0x0501 -> Windows XP
// 0x0500 -> Windows 2000
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#endif

회사에서 클라이언트 팀에서 처음으로 세미나라는 것을 했다.
그때 발표를 할 때 내머리 속의 지우개가 있는 듯 했다.
그때 아직 3개월도 채 되지 않은 나이기에.... 음. 다시 생각 해보니 지금은 3개월 하고 일주일이 넘었군...
아무튼 그때 발표할 때 썼던 문서를 다시 정리 해 보겠다. 귀찮아서... 대충만... ㅡ.,ㅡ;;
완전 허접하지만 이뿌게 봐주시길...

* 스크립트란?
초기 스크립트언어는 일련의 반복적인 명령들을 일종의 명령 처리기에 집어넣는 수단이었다.
이가 발전 함에 따라서 용도가 변하여 빠른 개발을 위해 쓰이며 비 프로그래머가 읽고 쓰기 쉬운 텍스트 기반 구문을 채용하는
도구로 변모하였다.
일정한 지식을 갖춘 사용자라면 프로그래머의 개입 없이도 스스로 스크립트를 작성하고 사용할 수 있다.

* 루아란?
루아는 “접착제(glue)” 언어라는 점에서 위의 스크립트언어와 차별된다.
기존의 스크립트 언어들은 반복적인 작업을 처리하는 용도지만 루아는 사용자가 다른 언어의 기능과 공정을 함께 “접착해서”
통합하기 위한 도구로 만들어진 것이다.
이런 방식은 단순히 명령들을 수행하는 것 이상의 일을 할 수는 강력한 도구이다.

* 루아의 장단점
- 장점
루아는 애초부터 좀 더 큰 응용 프로그램에 내장 시킬 것을 목적으로 고안된 언어이기에
확장성이 크다. 루아와 C언어의 통신이 쉬우며 기술적 설계안에서 구현하기 비교적 쉽다.
루아는 작고 빠르며 이식성이 뛰어나다. 이 말인즉 실행시점 메모리 사용량 측면에서 부담이 적고, C보다는 느리지만 파이썬과
같은 언어보다 빠르다.
그리고 새로운 하드웨어로 옮긴다해도 큰 수정없이 가능하다.

- 단점
루아는 파이썬에 비해 지원 라이브러리가 부족하다.
루아에 대한 소개자료가 아직은 부족한 편이다.
단독 실행 인터프리터로서 사용하기에는 빈약하다.

* 루아가 게임 개발에 적합한 이유
- C++과 연동이 잘되며 C++을 이용해서 확장할 수 있다.
- 확장성이 뛰어나 기술적 설계안에서 구현하기 쉽다.
- 작고 빠르며, 이식성이 뛰어나다.
- C를 접해본 사람이라면 배우기 쉽다.
- 그리고 무료이다.

* 루아의 사용처
- 게임내의 UI를 제작
UI는 루아를 이용하여 조작할 수 있고 유저가 루아를 통해서 UI로 커스텀마이징 가능하다.
- 게임의 자료의 정의, 저장, 관리
데이터 주도적 설계를 할 수있다. 모든 객체의 매개변수와 특성을 정의하여 하드 코딩을 통한 구현보다 외부 데이터로
관리하는 편이 데이터 수정이나 추가면에서 많은 이득을 볼 수있다.
- 실시간 게임 사건들의 관리
일반적으로 게임 내부에서 상호작용간에는 이벤트가 발생하는데 , 이러한 것을 관리 할 수있다.
- 게임의 인공지능 시스템을 작성
인공지능을 루아로 제어가 가능하다. 이를 이용하여 스크립트 작업자가 프로그래머 없이 작성이 가능하고, 이후에 유저가
직접 AI를 구성할 수 있다.


* 루아 스택이란?
- 루아는 C에서 사용하는 메모리 공간과는 별도의 메모리 공간을 사용을 하는데
이를 스택이라고 부른다. 스택은 루아의 명령 및 변수등의 데이터를 저장하고 있다.
이 스택은 아래에서 부터 쌓여 나가며 이에 접근하기 위해서 인덱스를 사용하고 있는데
인덱스는 문자열을 이용하여 인덱스로 변환을 해서 사용을 한다. ( 이 부분은 뒤에 자세한 설명 )
사용자 삽입 이미지

사용자 삽입 이미지

에구... 연신 붙여넣기 하면서 귀찮은 부분은 않했는데... 나중에 다시 작업 하겠습니다. 흐미... 몇일 지나서 하는거야... ㅡ.,ㅡ;;; 현재 되는 기능을 나열 해보겠다. 나열하기 전에 용어에 대해서 정의를 하고 넘어 간다. C는 우리가 작업을 하는 C, C++을 통합적으로 말하는 것이고 당연히 닷넷등의 컴파일러상의 언어를 말한다. 루아는 루아문법을 말한다. 값( Value )은 Value 즉 포인터가 아닌 실제 값을 말한다. 1. C 와 루아간의 함수 호출 C함수를 루아스택에 등록을 하고 루아 함수를 C에서 호출 가능하고 2. C 와 루아간의 Value를 주고 받을 수 있다. 3. C의 클래스를 루아 스택에 등록을 한다. 4. 루아 스택에 등록이 된 C 클래스의 인스턴스 포인터를 넘겨서 루아 스택에서 바로 조작이 가능하다. 개인적으로 4번이 가장 유용하고 많이 쓰이는 것 같다. 언리얼 엔진은 메인 뷰어를 두고 밑에 에디트 창을 통해서 메인 뷰어( 게임 화면 )의 객체를 조잘 할 수 있다고 한다. 현재 작업은 그런식으로 가능하게 되는데 상당히 유용한 듯하다. 이번주에 작업을 해서 화면의 싸이즈를 변경한다 든지 백그라운드 색상을 바꿀수 있는데 어찌나 좋던지...^^ㅋㅋㅋㅋ 앞으로는 AI와 UI의 이벤트 처리를 해볼 것이다. 다른 사람들은 어떻게 사용하는지 모르겠지만 어째든 유용하게 사용하고 있는듯 하다.

보간을 한 256 텍스처
사용자 삽입 이미지

보간을 하지 않은 256 텍스처
사용자 삽입 이미지

float BlurWeight[7] = { 0.1, 0.358, 0.773, 1.0, 0.773, 0.358, 0.1 };
float BlurN = 3;
float2 ShadowUV = In.ShadowTex;
float MAP_CX = 1/256;
float4 ShadowColor = (float4)0;
float4 shadow[7];
if( false )
{
ShadowColor += BlurWeight[0] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( -3 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[1] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( -2 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[2] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( -1 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[3] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( 0 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[4] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( +1 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[5] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( +2 * MAP_CX, 0 ) ) );
ShadowColor += BlurWeight[6] * ( tex2D( Sampler_ProjectinShadow, ShadowUV + float2( +3 * MAP_CX, 0 ) ) );
ShadowColor = ShadowColor/BlurN;
}
else
ShadowColor = tex2D( Sampler_ProjectinShadow, ShadowUV );

shader 상에서 위와 같은 작업을 하였는데.
이상하게 보간을 한것과 하지 않은 것이 동일하게 나왔다.

주위 텍셀의 차이 만큼을 보간을 하여 하나의 그림자 픽셀의 색상을 만들어 내는데
위 사진과 같이 나온다는 말은 위 식이 잘못 되었던지. 아님 식은 맞지만 내가 적용을 제대로 시키지
못했다는 건데...
아무튼 이에 관련된 작업은 팀장님께서 뒤로 미루셨다.

앞으로 작업의 방향은 그림자 한것을 정리를 하고 맵툴에 연동과 클라이언트의 연동 이후에 이펙트 작업으로 넘어 간다.

+ Recent posts