template<typename T>
struct is_vector_impl
{
enum { value = false };
};

template<typename T>
struct is_vector_impl< std::vector<T> >
{
enum { value = true };
};

template<typename T>
struct is_vector
{
enum { value = is_vector_impl< boost::remove_volatile< boost::remove_const< boost::remove_reference<T>::type >::type >::type >::value };
};

BOOST_STATIC_ASSERT( (is_vector<int>::value == false) );
BOOST_STATIC_ASSERT( (is_vector< std::vector<int> >::value == true) );
BOOST_STATIC_ASSERT( (is_vector< const std::vector<int> >::value == true) );
BOOST_STATIC_ASSERT( (is_vector< std::vector<int>& >::value == true) );
BOOST_STATIC_ASSERT( (is_vector< const std::vector<int>& >::value == true) );

레이옷 블로그에 댓글 달고 있다가 자꾸 글자들을 먹어버려서 여기에 포스팅-_-;

'자료 > 내자료' 카테고리의 다른 글

SPE 길찾기용 지형구조 - V2  (1) 2007.02.22
SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10
혹시 궁금해 하시는 분이 계실까봐 스샷 몇장올립니다.
자세한 내용은 일단 http://www.larosel.com/209 를 참고하세요..;

사용자 삽입 이미지

대략 이런 형태가 나왔습니다.

사용자 삽입 이미지
원래는 이런 형태죠;;

사용자 삽입 이미지
와이어 프레임은 이런 느낌입니다.

사용자 삽입 이미지
걸을수 있는 바닥면에 대한 데이터도 여전히 있습니다.

사용자 삽입 이미지
마을전경은 대략 이런느낌;;

점점 김성민씨의 Space Filling Volume와 모냥이 비슷해집니다..;;

일단은 버전2로 올라오면서 용량 최적화가 많이 됐습니다.
이전 구조에 공간데이터를 넣었으면 좌절할만한 용량이-_-;;

일단 기본설명은 버전1에서 설명했으니 생략하도록 하겠습니다..;

데이터가 같은 셀들을 묶어서 용량최적화를 했고..
공간의 데이터를 가지고 있을 수 있도록 내용을 추가했습니다.
알고리즘은 V1에서 높이만 뽑던걸 Pair로 뽑도록 변경한거라 별다른 내용은 없습니다.

렌더링 되고 있는 화면은 닫힌 공간(실제 공간을 차지하고 있는)을 렌더링 하고 있지만
실제 데이터는 열린 공간을 가지고 있습니다.
닫힌 공간으로는 충돌처리를 할수가 없게 되어 버리더군요;;
이유는 캐릭터가 점..; 이라면 닫힌공간에 부딪히나..를 검사하면 되지만
캐릭터가 세로부피가 있기 때문에(머 대략2m라고 치고) 이 공간에 내가 들어갈 수 있나..를 검사하도록 만들어야 합니다.
다리가 있다고 쳤을때 다리하고 지면이 1미터 간격밖에 안되는데 지나가 버리면 이상하겠죠;;

거창하게 공간데이터 이긴 하지만 실제 사용은 높이만 가지고 있던 내용이랑 큰차이가 없어서 3D상의 공간 충돌뿐만이 아니라 공간상의 길찾기도 내용만 약간 수정해서 그대로 넣어도 사용하는데 지장은 없습니다. 속도적인 부분도 가만할수 있을정도일듯 싶습니다.

잠수나 날아다니거나 하는경우는 사실 1인칭형으로 이동이 될거기 때문에 3D길찾기가 필요한 경우는 없겠지만 혹시나 수중전투-_-같은 경우는 필요하겠죠..; 혹시 몹이 하늘을 날아다니거나..하는 경우도 써먹을수도 있을거고..;;

그리고 걸을수 있는 데이터...의 경우에는 공간데이터와는 따로 가지고 있습니다.
공간데이터쪽에 플래그 같은걸 넣어도 되지만 길찾기 할 때 속도를 높이려고 그냥 중복해서 가지고 있습니다.;;

전과 달라진 내용은 지면데이터 쪽에도 지면에 대한 공간으로 가지고 있습니다.
혹시 캐릭터나 몬스터 이동시 높이에 대한 부피체크(위에서 설명한)가 들어갈 일이 있을까봐 같이 넣었습니다. ( 사실은 따로 만들기 귀찮아서;; )

머 그외에는 버전1에 비해 특별한 내용은 없군요..;

사용자 삽입 이미지

용량을 궁금해 하실까봐 용량을 캡쳐했습니다.
dat파일이 실제 서버에서 사용하는 파일입니다.

메모리 구조와 파일구조가 거의 비슷해서 실제 셀데이터 올릴때 vector에 공간차지하는거 약간 1~2메가 정도 말고는 실제 메모리에 올라가는 용량 그대로입니다.

4020*4020 1미터 단위 4개..와 2040*2040 1미터 단위 2개..맵이 185메가 정도군요..;
원래는 좀 더되야 하는데 내부에서 중복셀을 줄이기 위해 16분할로 데이터를 가지고 있습니다.
용량의 대부분이 셀데이터와 실제 지형을 연결시켜주는 인덱스 데이터이기 때문에
중복셀이 많으면 4바이트를 쓰고 적으면 1, 2바이트를 사용하기 때문에 분할하는것과 안하는것이 차이가 꽤 납니다. ( 많게는 2배까지 )

사실 실제 서버는 존서버 방식이라 한서버에 몇개의 존만 올라가서 그냥 써도 상관은 없지만 나중에 테스트 서버같은데는 모든존을 다 올려버리게 될거 같아서 가능한 다이어트를 했습니다.

_ST가 붙은 파일들은 클라이언트용 패킹파일입니다.
파일 내용자체는 100%같습니다.

사용자 삽입 이미지
안에는 대략 이런 모냥이죠;;

서버파일은 그냥 파일을 줄줄줄 붙여논거 밖에 없습니다. 파일 합치는 방식만 다르고 실제파일은 같습니다.

클라이언트용 패킹파일샷은 압축했을때 얼마나 압축이 되나.. 참고하시라고 올렸습니다.
185메가 짜리가 72메가 가량이 되었군요..
실제 클라이언트에서 그대로 쓰는 구조라 압축률이 낮은걸 쓰고 있어서 저정도 용량입니다.
zip방식으로 걍 압축하면 50메가 정도입니다.

대충 내용은 이정도입니다..
소스를 만들어서 배포를 하거나 할 예정은 없습니다..;;;; ( 이 내용외의 기본 내용들을 만들어서 붙이기도 귀찮고 같이 딸려있는 다른 모듈들;; 덕분에;; )

알고리즘은 내용에 설명을 다 해놨으니 공간개념이 있는 프로그래머분들은 아마 내용만 보고 만드시는데 별 지장은 없을듯 싶습니다.

실제 소스도 공간데이터 만드는 부분 200라인 정도 데이터 구조랑, 로드, 세이브가 500라인정도밖에 안됩니다.

혹시 궁금하신 내용이 있으면 답변 해드리도록 하겠습니다.

'자료 > 내자료' 카테고리의 다른 글

mpl::is_vector  (2) 2009.02.17
SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10
대략 Ssook Path Engine라는 이름이다..;
사실은 지형데이터이지만 Level이란 네이밍은 지형렌더링쪽에 쓰고 있고, Space란 네이밍은 실제 폴리곤용 네이밍에 쓰고 있는데다..공간 데이터도 아닌지라..;;
마땅히 쓸 네이밍이 없어서 결국 Path라는 네이밍을 썼다..;

알고리즘의 내용은 Multi Height Tile정도가 되겠다.
여러개의 높이를 가지고 있는 타일 데이터다..

김성민씨의 Space Filling Volume을 보고 나니 이럴바엔 예전 2D때 쓰던 방식을 그냥 쓰는게...으흠? 그거 괜찮겠는걸... 하고 만든 내용이다..
사실 만든 내용이라기보단 말한대로 2D때 많이 쓰던 내용이다.
( 아닌가 나만 쓴 내용인가-_-a 2D때도 어디서 보고 만든건 아니긴 했지만 )

일단 잡설은 접어두고 스샷부터 보쟈
사용자 삽입 이미지

대충 이런식이다.
보면 다리위와 아래에 높이 데이터가 있고 오브젝트가 있는부분은 높이 데이터가 없다.
그냥 타일로 나누었고, 하나의 타일은 갈 수 있다/없다가 아니라 높이 값을 가진다.
그리고 여러개의 높이 값을 가지고, 그 높이 값을 비교해서 갈 수 있다/없다 를 판단한다는 내용이다.

내용이 긴 관계로 자세한 내용을 보실분은 more를 클릭해서 보세요.


어쨋건 전에 패스엔진을 고려해서 테스트 해보았는데 위에 있는 내용처럼 높이에 대한 처리라던가 메모리라던가 하는 내용들이 감당이 안되서 만든 시스템인데..
필요하신 분들이 있을까봐 정리해서 공개해둔다.

'자료 > 내자료' 카테고리의 다른 글

mpl::is_vector  (2) 2009.02.17
SPE 길찾기용 지형구조 - V2  (1) 2007.02.22
게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10

처음작성 : 2006-06-27

PNG항목 추가 : 2006-07-31

글 다쓰고 마무리 하고 있었는데 노트북 다운되서 대략 orz

다시 쓰쟈..-_-

참고로 개인 블로그에 올리는 용도이므로 말은 편하게 하겠습니다..;;

참고로 각 참고용 이미지는 풍류공작소(http://p.paran.com)..;; 1차 클베버전UI의 스샷이고, 홈페이지에도 많이 공개되어 있으므로, 개발중인 내용을 공개하는게 절대-_- 아니며, 편집기능 같은 경우는 찍을수 있는 사람이 내부 개발자 몇명-_- 밖에 없기는 하지만, 공개되도 별 상관없는 내용이고, 일부러 부분 스샷이 아니라 하단에 로고가 잘 들어가 있는 풀~ 스샷으로 넣었으니까.. 스샷 유출했다고 혼내지 마세요ㅠ.

--------------------------


지금 쓰고 있는 UI모듈을 만든게 2004 2월이니 꽤 오래되었다.

처음 만들때는 새프로젝트를 시작한지 얼마 안됐었지만 기존 프로젝트도 유지보수를 같이 해야 하는 상황이었고, 한참 해외화다 머다 정신 없는 시절이었어서..

작업시간은 퇴근후에 시간을 내어서 할 수 밖에 없었고, 기한은 두달정도라 시간에 쫒겨서 꽤 대충..;; 만들었다.


그래도 몇년간 UI에 대해서 구상해왔던지라 구조적인 부분은 꽤 신경써서 만들어 놨었어서.. 현재까지도 편집의 편의를 위한 몇가지 기능과 lua연동, 이미지매핑을 추가 한것 말고는 별다른 수정없이 잘 쓰고 있다.

꽤 오래쓰다 보니 여러가지 기능 추가나 리펙토링을 하고 싶은게 잔뜩이지만, 항상 다른 스케줄에 밀리는 관계로 아마 회사내에 있는 상태로는 힘들것 같다..;;

혹시 다음에 회사를 옮기게 되면 한 3개월 정도 쉬면서 공개를 할 수 있도록 처음부터 새로 만들고 싶다..;;


어쨋건 처음 게임용 GUI를 만들게 된다면 MFC DXUT UI를 참고하는게 꽤 도움이 된다..

현재 모듈 만들때는 DXUT가 없었기 때문에 이쪽은 별로 참고를 안했고(사실 참고할것도 별로 없다..)

MFC를 꽤 많이 참고를 했고... 기능적인 부분은 마비노기를 베꼈다..벤치마킹 했다


해외게임까지 통틀어 놓고 봐도 마비노기의 인터페이스는 쵝오다 >_<)=b

기능적인 부분을 빼고 보더라도 UI본연의 기능인 접근성과 0에 가까운 학습시간..은 경이로울 정도다..;

하지만...;; 이건 개인의 취향일 뿐이고, 보통의 MMORPG를 개발한때는 좀 더 게임틱-_- UI를 원하므로 너무 마비노기에 집착하는건 좋지 않다..;; ( 난 너무 집착했다-_- )


덕분에 프로그램으로 구현된 그래픽(실제로 마비노기가 이런방식을 사용하는지는 모른다)에 너무 집중했다-_-;;

대부분의 내용을 프로그램으로 그리고 가끔 이미지가 필요한 부분에만 이미지를 넣는다..라고 컨셉을 잡았는데.. 그렇게....되기는 힘들다. _ _;;;

사실 프로그램으로 그릴수 있는건 이미지로 대부분 커버가 되기 때문에 쓸데 없기도 하고..;;


이미지코드노가다-_-;의 시간은 둘째치고(사실은 xml에서 폴리곤이나 line등의 데이터를 읽도록 했기 때문에 그다지 오래걸리지는 않았지만..)

구조를 코드로 그리는 쪽으로 맞춰버린 덕에 지금도 고생하고 있다..;;

이건 잡담이지만 UI용어를 위젯이라고 쓰기도 하고 컨트롤이라고 쓰기도 하고, 다른 용어를 쓰기도 하는데..현재 모듈은 컨트롤이라고 쓰고 있다.

어쨋건 내가 생각하는 게임용 GUI를 만들 때 고려해야할 점은 다음과 같다.


1.
컨트롤의 구조가 Tree형태가 되도록 하쟈

어플리케이션의 UI는 다이얼로그에 각 컨트롤들이 올라가는 형태지만...

게임에서는 창안에 창이 들어가야하는 경우가 비일비재하게 발생한다..

이부분은 사실 그렇게 안만들려면 안만들수도 있다-_-;

사실 전에 전에 만들던 게임같은 경우도 그냥 윈도우는 루트바로 밑에 존재하고, 그 하위에 버튼이나 등등등이 들어가도록 사용했었다.

막상 Tree형태가 필요한걸 생각하려고 하니 생각이 잘 안난다..;;

현재는 구조상에 강제하는 부분은 없는데 Static밑에 Window가 들어간다거나..할 수 있는 형태다.

우훔 장점은 창안에 세부창을 두고 각 창을 hide/visible시킨다던가 enable/disable시킨다던가 하는 그룹형태로 쓸 수 있다...;;

탭기능 같은 경우도 편하다. 탭을 선택하면 각 탭에 연결된 창을 hide/visible시키면 된다.

머 대충 그렇다-_-;;

2. UI편집툴을 만들지 말고 자체 편집이 가능하도록 하쟈...

처음에 상당히 고생한 부분인데 먼가 UI테스트를 하려고 보니 편집관련 UI가 필요해져서 닭이 먼저냐 닭알이 먼저냐의 상황이 되서 상당히 난감했었다-_-;;

결국은 편집UI가 완성될때까지는 xml에서 직접 편집해줬었다..


사실은 여기서 더 중요한건 UI툴이 있어야 한다-_-;

UI툴을 만들지 않고 xml을 직접 편집하는 형태로 작업을 하는 경우도 있는데..

그런형태의 작업에서는 좌표같은걸 맞춘다거나 이미지 매핑을 하는게 수치 바꿔보고 다시 로딩해보고.. 를 반복해야 하기때문에 (물론 포토샵에서 좌표를 가져오는 법도 있지만 번거롭긴 마찬가지다)..

실제 작업시간이 상당히 많이 차이가 난다.


그리고 그 기능이 별도의 툴이 아니라 자체 편집이 필요한 이유는 게임화면을 보면서 실제 작동을 바로 테스트 할 수 있다는 장점이 있다..;;


처음 레이아웃 잡는건 툴에서 한다고 해도..

조금 작업하다보면 게임화면을 보면서 작업을 해야하게 되기 때문에 게임내에서 바로 편집할 수 있도록 만들어 두면 작업효율이 몇배의 차이가 난다.

현재의 UI는 게임중에 Control+Space Bar를 누르면 바로 편집모드로 전환되며(물론 개발용 빌드에서만 이다.. 배포용 빌드에는 막혀있다. )

덕분에 경영진 앞에서 시연하다가도 먼가 UI위치가 이상하다고 하면 바로 편집모드로 들어가서 쓱 끌어다가 옮겨주는 센스를 발휘할 수 있다.(처음보면 다들 신기해한다-_-a)


물론 경영진을 보여주기 위한건 아니고-_-;;

게임 상황에서 보면서 편집하기 위한 용도이며 기획자나 디자이너의 의견을 바로 적용해서 보여줄 수 있다는건 상당한 이득이다..

UI작업은 안그래도노가다성이 짙은데 작업시간마저 길다면 대략 재미없어지므로 가능한 작업시간을 단축시킬 수 있는 방법을 다각도로 연구하는게 좋다...;;


3.
이미지 매핑 기능을 넣쟈..

자체 UI편집기능이 있다면 바로 이미지 매핑을 해서 게임화면에서 볼 수 있도록 하는게 좋다.


꽤 오래전에 N모사의 L게임 2-_-에서 포토샵에서 이미지의 좌표를 보고 xml에 편집하도록 하는 알바-_-를 뽑는걸 보고 경악한적이 있다..


 
2D
스프라이트 툴을 만들어봤다면 이미지에서 적당한 영역을 체크해서 RECT를 뽑아오는 기능을 만드는게 별로 어렵지 않고 작업기간도 얼마 걸리지 않는 일인데...


이걸 사람이 수동으로 하다니-_-;;;;;;

어쨋건 UI작업의 30%정도는 좌표랑 크기 맞추기이고 50%정도는 이미지 세팅이기 때문에 마비노기나 라그나로크처럼 대부분의 UI를 같은 이미지 형태를 사용하는게 아니라면... 필수적인 기능이다..

게다가 편집기능이 이미 존재하면 별로 어렵지도 않고, 비용대비 효과는 환상적이다..;


4.
프라퍼티를 제어하쟈

똑같은 창이라고 해도 어떤창은 이동이 가능하고 어떤창은 폰트 크기가 다르다거나... 하는 식의 내용들이 많은데.. 자체 편집이 가능하다면 프라퍼티도 실시간으로 바꿀 수 있도록 하면 작동을 바로 확인할 수 있다..

현재 사용하는 속성은 대략 20개가 약간 넘는데.. 컨트롤 이름부터 Text, align, 좌표, 크기, 폰트, 처음에 열려 있을것인가..등등등과 각 컨트롤의 고유속성이 있다.

5. 이벤트 편집 기능을 만들쟈..

이벤트란 머 예를 들면, 메뉴의 한 버튼의 Click(Excute)이벤트가 발생하면 Inventory창에 Toggle(Visible/Hide) 메세지를 던진다.. 라는 내용이다.

타겟 컨트롤을 선택하고, 발생 이벤트를 선택하고 어떤 메세지를 던질지를 편집할 수 있게 하쟈


그리고 UI자체내에서 가능한 내용(Visible, Check)은 바로 처리해준다..

그리고 클라이언트와의 연동이 필요하다거나 한 경우를 위해 커스텀 메세지를 지원한다.


현재의 모듈은 커스텀 메세지를 처리할 수 있는 C++콜백을 코드에서 수동으로 설정하거나, lua파일에 자동으로 연동되도록 되어 있다.


6.
다른 컨트롤을 포함하쟈.

예를 들어 콤보박스라고 하면(게임에선 DropList만 있으면 된다-_-)

현재 선택되어 있는 항목을 보여주는 Static과 선택창(List), 선택창을 여는 버튼(Button) 세개의 컨트롤로 구성 할 수 있다.

현재 이게 콤보박스라는 하나의 클래스에서 다 처리를 하게끔 되어 있는데 대략 낭패다..;;

현재는 분리가 안되있는 상태여서 쓸데없이 SubList가 열리는 이벤트라던가 하는 쓸데없는 이벤트와 메세지들이 생겨버렸다-_-;;

Static List Button의 각 이미지를 따로 세팅해야 하는데 물론 콤보박스의 이미지 종류를 늘려서 각각 세팅하도록 할수도 있지만..

이미 만들어져서 Focus처리나 이미지 처리, 속성처리, 이벤트처리까지 다 되는걸 만들어 놓고.. 따로 만들 필요는 없다..;

ComboBox라는 컨트롤을 만들고 위 세개의 컨트롤을 하위로 가지고 있도록 하고, 셀렉트 관련 몇가지 인터페이스만 만들어주면 쉽게 끝난다-_-;


7. Template
기능을 만들쟈

이건 워드같은데 있는 문서 템플릿 같은걸 말한다..

일반 창이라고 하면, 적당한 크기에 윈도우용 크기가변 이미지가 세팅되어 있고, RightTop으로 Close버튼이 있고, 버튼에는 X모양의 이미지가 매핑되어 있고, Execute이벤트에 부모윈도우에 Invisible Message를 보내는 이벤트가 설치되어 있는...


형태가 자주 쓰는 창이라고 하면 이 창을 템플릿으로 따로 저장하게 하쟈..

어차피 저장기능은 있을거고 그게 전체 저장이 아니라 컨트롤 하나로 부터 하위로 저장을 하도록 하면 되니까 별로 어렵지는 않다.

응용하면 쉽게 컨트롤의 Copy&Paste기능을 만들 수 있다.

이 기능 하나로 지루한 작업을 꽤 줄여줄 수 있다..

만약 이미지가 같다고 하면 이미지와 이벤트가 모두 설정되어 있는 템플릿을 추가하면 바로 새로운 창하나 뚝딱 완성이다.


8. PixelScroll
을 만들쟈..

스크롤 기능을 각 리스트컨트롤이나 콤보박스에 넣고, 따로 스크롤바컨트롤 하나 만들어서 창에서 Draw할때 참고하도록 할 수도 있지만..

PixelScroll이 되면 꽤 할 수 있는게 많다.

각 컨트롤별로 기능따로 만들고 창에 스크롤바 하나 달때마다 고생할거 생각하면 PixelScroll을 만들어서 속편하게 쓰쟈


9.
다국어 IME는 미리 만들쟈..

IME는 미리 만들어 놓는게 좋다. 그리고, 유니코드용으로 만들어서 UniScribe를 사용하도록 하는게 좋다.

나중에 해외화할때는 다른것도 할거 많은데 IME까지 신경쓰려면 대략 정신이 멍해진다..

UniScribe는 윈도우에서 제공해주는 텍스트 파서? 같은 형태인데. DX에서 Rect를 넣고 Text출력을 하면 줄바꿈 처리가 되는게 내부에서 UniScribe를 사용한다..(일반 어플리케이션에서도 사용한다..)

IME는 기본 IME Candidate외에 따로 처리해줘야 하는 언어가 몇개 있는데...

한국어, 중국어, 일본어, 태국어, 아랍어-_- 이다..

아랍에 수출할일은 없겠지.. ( __);

GPGStudy자료실을 뒤져보면 zupet님께서 한국어, 중국어, 일본어, 태국어.. Candidate처리까지 되는 소스를 올려놓으신게 있으니 그쪽을 참고하고.. 혹시나 모자른 내용은 MSDN-_-)=b

IME는 예전에 다 처리해두었는데 블록 설정하고 Copy&Paste기능 따위를 넣다가 현재는 버그가 있는 상황이다ㅠ.


10. 이미지 파일 포맷은 PNG를 사용하자.

PNG파일은 무손실 압축 포맷이며, 압축률이 상당히 높은 편이다.

UI의 경우 DXT포맷을 사용하면 이미지가 손상되어 TGA를 사용하는 경우가 많은데

TGA에 비해서 PNG쪽이 훨씬 용량이 적다.

게다가 TGA의 경우는 알파값을 알파채널에 따로 넣는 작업을 디자이너가 해줘야 하지만

PNG의 경우 포토샵의 투명배경(격자로 되어있는..;;)의 투명값을 그대로 가져올 수 있다.

레이어로 편집하고 있던 데이터를 그냥 세이브 해도 된다는 얘기다..;;

TGA의 경우는 레이어를 머지해서 투명도 값을 따로 뽑아서 알파채널에 넣어줘야 해서 상당히 번거롭다..;

디자이너가 편해지면 프로그래머도 편해진다는 점을 명심하자.

ps. 그렇다고 UI외에도 다 png를 쓰지는 말쟈-_-;; 2d가 아닌 3d상황에서는 dxt가 단연 좋다


-----------------


물론 이외에도 다른 편의성 기능들이라던가 lua연동이라든가 만들면 좋은게 많겠지만.. 대략 이정도의 내용이면 지겨운 UI작업을 빠르고 쉽게 할 수 있으리라 생각된다.

당부를 하는건 vb mfc등의 어플리케이션용 UI를 참고하는건 좋지만, 어플리케이션과 게임은 사용목적이 전혀 다르기 때문에 중요하게 생각해야 하는것이 다르므로, 어플리케이션UI에 집착하면 좋지 않다..;

'자료 > 내자료' 카테고리의 다른 글

SPE 길찾기용 지형구조 - V2  (1) 2007.02.22
SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23

//////////////////////////////////////////////////////////////////
//
// MSB : most significant bit/byte
//
// bit : 최상위 비트
// byte : 최상위 바이트
//
// MSB<0>::bit == 0
// MSB<0>::byte == 0
// MSB<1>::bit == 1
// MSB<1>::byte == 1
// MSB<0x100>::bit == 9
// MSB<0x100>::byte == 2
// MSB<0x101>::bit == 9
// MSB<0x101>::byte == 2
// MSB<0x10000000>::bit == 32
// MSB<0x10000000>::byte == 4
// MSB<0x10000001>::bit == 32
// MSB<0x10000001>::byte == 4
//
//////////////////////////////////////////////////////////////////

template<DWORD N>
struct MSB
{
static unsigned const bit = MSB<(N>>1)>::bit + 1;
static unsigned const byte = MSB<(N>>8)>::byte + 1;
};

template<>
struct MSB<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};


//////////////////////////////////////////////////////////////////
//
// LSB : least significant bit/byte
//
// bit : 최하위 비트
// byte : 최하위 바이트
//
// LSB<0>::bit == 0
// LSB<0>::byte == 0
// LSB<1>::bit == 1
// LSB<1>::byte == 1
// LSB<0x100>::bit == 9
// LSB<0x100>::byte == 2
// LSB<0x101>::bit == 1
// LSB<0x101>::byte == 1
// LSB<0x10000000>::bit == 32
// LSB<0x10000000>::byte == 4
// LSB<0x10000001>::bit == 1
// LSB<0x10000001>::byte == 1
//
//////////////////////////////////////////////////////////////////

template<DWORD N>
struct LSB_temp
{
static unsigned const bit = LSB_temp<(N<<1)>::bit + 1;
static unsigned const byte = LSB_temp<(N<<8)>::byte + 1;
};

template<>
struct LSB_temp<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};

template<DWORD N>
struct LSB
{
static unsigned const bit = 33-LSB_temp<N>::bit;
static unsigned const byte = 5-LSB_temp<N>::byte;
};

template<>
struct LSB<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};

'자료 > 내자료' 카테고리의 다른 글

SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
게임을 위한 GUI모듈  (4) 2006.07.31
is_template  (0) 2006.05.10
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
enum string  (0) 2005.07.08

template<typename EnumType, EnumType EnumMax, template<typename, EnumType> class ContainerType >
class SEnum
{

...

};

이런 형태의 템플릿을 사용하고 있는데
자동화 코드에서 컴파일 타임에 이 템플릿으로 정의된 type인가..를 검사를 해야 했었다.

그래서 심플하게 인터페이스 클래스를 만들어서 상속받고 그 인터페이스 클래스를 Driven한 클래스인가...를 검사하는 방법으로 갔었다.

그르나-_-

사태는 그리 쉽게 흘러갈리 없고
인터페이스 클래스를 상속 받으면 안되는 상황이 발생하였다!! 두둥!!!

결국은 한시간여의 삽질 끝에 이런 코드를 만들어 냈다.

template<typename T>
struct SEnumTraits
{
enum { value = false };
};

template<typename EnumType, EnumType EnumMax, template<typename, EnumType> class ContainerType>
struct SEnumTraits< SEnum<EnumType, EnumMax, ContainerType> >
{
enum { value = true };
};

#define is_SEnum(T) ( SEnumTraits<T>::value )

이로써 상속을 안 받고 특정 템플릿을 사용한 type인지를 알 수 있게 되었다.
템플릿 인자가 제멋대로라 generic한 is_template는 실패-_-;

어쨋건 관련 코드들을 싹 새로 정리해야 하는 위기에 처했다....;;
이번주는 계속 메타때매 시간 다 쓰네.. 헹~

'자료 > 내자료' 카테고리의 다른 글

게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
enum string  (0) 2005.07.08
텍스쳐 포맷 변경해서 저장하기  (0) 2005.05.16

최초작성 : 2005-09-08 15:03

- 추가된 내용 ( 2006.02.23 )
max7은 맥스 자체내의 버그로 Edit Normals Modifier의 노멀값을 제대로 못뽑아온다.
그래서 이 방법은 max7에서는 사용못하고 max7이하에서는 face를 덧대서 만들어서 hide시키는 방식으로 해야한다.
max8에서는 정상적으로 나오는걸 확인함

ps. 귀찮아하시는 분들을 위해 원본, 쪼갠후, Modify넣은후의 맥스파일을 첨부한다


캐릭터에 분절을 넣어서 부위별 아이템 교체를 하기 위해서 팔다리를 자르다 보면 위와 같이 별도의 오브젝트여서 노멀이 연속되지 않는 경우가 발생한다.

노멀 수정을 해줄 오브젝트를 선택하고 Edit Normals Modifier를 넣어준다.
위 그림에서는 둘 다 같이 잡았음

그럼 이렇게 각 버택스의 노멀값이 라인으로 표시되는데 수정을 해줄 노멀들을 드래그 해서 선택해준다.

그리고 Average의 Use Threshold를 체크 해주고(체크하지 않으면 선택된 노멀의 전체 평균이 나와버린다)
Select를 눌러주면 위와 같이 같은 위치의 노멀들이 평균되게 수정되어 연속된 노멀을 구할 수 있다.

---------------------------------------------------

이걸 몰라서 한참 삽질했다-_-

엔진담당 프로그래머임에도 맥스를 잘 쓰지 못해 오브젝트 모양이 엉망인거는 양해해 주기 바란다-_-;;;
그나마 위에꺼처럼 오브젝트 찌그러트려서 두 개로 나누는것도 모델러 어깨너머로 컨닝했다-_-;



'자료 > 내자료' 카테고리의 다른 글

MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10
enum string  (0) 2005.07.08
텍스쳐 포맷 변경해서 저장하기  (0) 2005.05.16
Alkanoid프로젝트 완료  (0) 2004.12.23


2005.06.06 : 생성
2005.06.07 : lib에서 사용할 때의 버그 수정
2005.07.07 : 직접 스트링을 지정할 수 있도록 추가
2005.07.08 : type명 제외하고 사용하도록 수정
2005.07.08 : 버그 수정및 검증 루틴 추가

enum을 스트링으로 바꾸거나 스트링을 enum으로 바꾸는 문제에 대해서 계속 고민해왔는데.
결론은 내부에 map이 필요하다..였다.

map에 enum과 스트링을 연결시켜주는건 직접 해주는 방식으로 사용했었는데..
흐음..어쨋건 정리된 소스를 받아보시라

사용방법은 두가지 인데.

1번째 방법은 매크로 함수의 특성상 127개의 인자밖에 못받는다.
100개까지 받도록 정의해 놓았다.
2번째 방법의 개수의 제한이 없지만 1번째 방법이 기존의 enum에서 약간만 바꾸면 되는 반면
2번째 방법은 좀 더-_- 바꿔야 한다.

아래와 같이 사용할 수 있다.

// solution 1 limit size 100
SENUM_3( MODE, 1, 2, 3 );
// solution 2 no limit
#define ENUM_BODY_MODE( value ) ENUM_BODY( MODE, value )
#define SENUM_ADD_MODE( value ) SENUM_ADD( MODE, value )

#define MODE_ENUM_LIST( _ ) \
_( 1 )  \
_( 2 )  \
_( 3 )
DEFINE_ENUM( MODE, MODE_ENUM_LIST );

// use
auto define MODE_MAX : 3 not match string
const tstring& str1 = MODE_CONVERTER( MODE_1 );  // return "1"
MODE m = MODE_CONVERTER( _T( "1" ) );   // return MODE_1 : 0

// solition 3 is same soulution 2 but can use special string

#define ENUM_BODY_MODE( value, str ) ENUM_BODY_PAIR( MODE, value, str )
#define SENUM_ADD_MODE( value, str ) SENUM_ADD_PAIR( MODE, value, str )

#define MODE_ENUM_LIST( _ ) \
_( A, a )  \
_( B, b )  \
_( C, c )
DEFINE_ENUM( MODE, MODE_ENUM_LIST );

// use
auto define MODE_MAX : 3 not match string
const tstring& str1 = MODE_CONVERTER( MODE_A );  // return "a"
MODE m = MODE_CONVERTER( _T( "a" ) );   // return MODE_A : 0

ps. 자료를 함께 찾아주신 박대중 과장님께 감사의 말씀을 :)

'자료 > 내자료' 카테고리의 다른 글

is_template  (0) 2006.05.10
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
텍스쳐 포맷 변경해서 저장하기  (0) 2005.05.16
Alkanoid프로젝트 완료  (0) 2004.12.23
DX에서 쓰는 텍스쳐 썸네일 만들기  (0) 2004.10.02

LPD3DXBUFFER pBuffer = NULL;

if( D3DXSaveTextureToFileInMemory( &pBuffer, D3DXIFF_TGA, pTexture, NULL ) == D3D_OK )
{
SAFE_RELEASE( pTexture );

D3DXCreateTextureFromFileInMemoryEx( pd3dDevice, pBuffer->GetBufferPointer(), pBuffer->GetBufferSize(), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_DXT5, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, 0, &pTexture );
ASSERT( m_pLightMap != NULL );

SAFE_RELEASE( pBuffer );

D3DXSaveTextureToFile( pFilename, D3DXIFF_DDS, pTexture, NULL );
}


용문씨 가져가~

'자료 > 내자료' 카테고리의 다른 글

분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
enum string  (0) 2005.07.08
Alkanoid프로젝트 완료  (0) 2004.12.23
DX에서 쓰는 텍스쳐 썸네일 만들기  (0) 2004.10.02
크래시 리포트를 만들어 보쟈  (0) 2004.09.02

건빵군의 말을 빌리자면 알카노이드따위-_-에 서버씩이나-_-와 DB씩이나-_-를 붙이느라고 삽질 꽤 했다-_-;

머 어찌됐건 간만에 캐주얼-_-;;; 게임 하나 완성(은 아니지만 더이상 하기는 귀찮으니 대충 완성)했다-_-;

게임에 대한 개선요청은 쌩까도록 하겠습니다-ㅅ-;

사실은 게임 내용은 그렇다 쳐도 사운드는 넣고 싶었는데-.ㅜ

sqlite를 하는데 많은 도움을 주신 한민훈군께 감사의 말씀을 전합니다-ㅅ-;

실행파일 및 소스가 포함된 파일을 올리니 혹시나 설마 소스가 궁금하신분은....으음... 엔간하면 안보시는 편이-_-;;;;
어지간히 대충 만들어놔서-ㅅ-;;


아래는 안에 들어가는 readme.txt파일

--------------------------------------------------------

제작자 : 숭실대학교 컴퓨터학부 9844199 지성욱

본 프로그램은 DirectX 9.0c이상을 필요로 합니다.

1. bin폴더 아래의 Server.exe를 실행합니다.
Rank.db에서 랭킹 데이터를 읽도록 되어 있으며 DB가 존재하지 않는경우 새로 생성하여 디폴트 데이터를 삽입하도록 되어 있습니다.
DB로의 쿼리 및 데이터 추가 삭제, 클라이언트와 주고받는 소켓이 왼쪽의 LogList에 보입니다.
Log는 기본으로 50개까지 볼 수 있고, 50개가 넘어가면 오래된 순서로 삭제합니다.

2. bin폴더 아래의 alkanoid.exe를 실행합니다.
기본적으로 localhost에 접속하도록 되어 있습니다.
서버에 접속이 실패하는 경우에는 클라이언트로만 돌아가도록 되어 있으며,  실행동안에는 랭킹 데이터가 갱신되나 저장되지는 않습니다.
서버에 접속하게 되면 서버에서 랭킹데이터를 받아오도록 되어 있습니다.
타이틀 화면에서 SpaceBar를 누르면 게임 화면으로 넘어갑니다.
게임화면에서 SpaceBar를 누르면 게임이 시작되며 이때부터 시간을 기록하게 됩니다.
왼쪽 방향키와 오른쪽 방향키로 바를 움직일 수 있습니다.
5번의 기회가 있으며 왼쪽위에 하트표시로 남은 기회를 표시합니다.
게임을 클리어 하게 되면 이름을 입력하는 입력창이 뜨고, 이름을 입력한 후 엔터키를 누르면 서버에 접속되어 있는 경우는 서버에 자신의 기록을 보내게 됩니다.
그 후 다시 타이틀 화면이 나오며, 새로운 랭킹과 방금 자신이 플레이한 스코어를 표시해줍니다.

+ Recent posts