반응형


BLOG main image




아래 번역한 것은 CEGUI 튜토리얼을 번역한 것입니다

원래 용도는 혼자만 볼것이였습니다, 얼추 번역한다음 소스에 넣었지만 결국엔 유니코드지원이 안되기때문에 빼버리게 된부분입니다만

그냥 지워버리긴 좀 아깝고 혹여나 필요한 분이 있을지도 모른다는 생각에 올려놓습니다

번역은 얼추 번역한것이라 약간 매끄럽진 않을 수도 있습니다

중간 중간 보이는 소스는 개인 프로젝트에 적용하기위해 테스트했던 코드 조각들입니다


번역사이트는 http://www.cegui.org.uk/docs 에서 튜토리얼 부분 입니다






 =================== CEGUI 파일 구성 부분 =================



//@brief CEGUI 를 활용한 GUI 클래스

//@ 아래내용은 http://www.cegui.org.uk/docs 일부 내용을 이해하기 쉽도록 번역한것,  나중에 잊어먹을 경우를 위해서.. [sjh]

//@ 

//CEGUI 는 XML 기반이다

//notice 확장자가 꼭 .xml 이 아니고 의미에 맞는 확장자가 붙는다 ,for example .imageset for an Imageset and .font for a Font 

//또한 이름짖는 규칙은 없다

//1) Imageset : Imageset은 몇몇 소스윤곽에 대해서 지정된 지역들의 모음들이다, 이미지파일 또는 텍스쳐와 같은...

//  imageset 은 scheme의 부분으로서 로드되어지는 한 Imageset을 지정한다

//2) Font : CEGUI 안에서 사용하기위한 폰트를 정의한다, 이것은 두가지 타입이 있다

//  Font는 scheme의 부분으로서 로드되어지는 한 Font를 지정한다

// 1. FreeTypeFont : 표준폰트 .ttf 폰트에 기반되어지는 폰트, 이것은 속성에서 Type="FreeType" 으로 쓰일 수 있고 .font   XML 안에서 사용된다

// 2. PixmapFont : 이 폰트의 타입은  [폰트 glyphs]에대한 이미지들을 정의한 Imageset으로 정의되어진다

// 그리고 비트맵된 폰트로서의 생각되어진 최상이다, .font XML 파일 속성에서  Type="Pixmap" 으로 쓸 수 있다

//3) LookNFeel :  LookNFeel은 CEGUI의 skinning system의 주요한부분으로부터 보관한다

//   WidgetLook과 그 자식에 대한것들을 담고있다

//   LookNFeel은 scheme의 부분으로서 로드되어지는 한 LookNFeel파일을 지정한다

//   

//4) Scheme : Scheme 파일은 다른 데이터 파일들과 리소스들과 함께 그룹화하는 넓은 의미이다 그리고 그것들의

//  상호작용의 몇몇을 정의는 그리고 싱글포인터로부터 CEGUI의 windows와 widgets 를위해서 

//  'skin' 으로 간주되어지는것을 로드하는 의미이다

//  

//5) Layout :  레이아웃파일은 window 레이아웃의 XML표현을 포함한다. 각 집합된 'Window' 속성은 만들어질수있는 

//   window 또는 widget을 정의한다,

//   'Property'요소들은 바랬던 세팅과 각각 정의되어지는 window를 위한 property 값들을 정의한다

//   

//6) Config : CEGUI의 config파일지원은 모든 system default들,  로드되어지는 initial resource들을 지정하는것을 당신에게 허ㅎ ㅓ락한다.

//  뿐만아니라 초기화와 실행하기위한 종료 스크립트파일들(ScriptModule을 사용할때)

// , Renderer와 System오브젝트들을 만들수있는것을 넘어 C++코드의 쓰여지는 라인없이도...

//













 ===================  초기화 부분 ===================



using namespace CEGUI;


//@brief CEGUI 를 활용한 GUI 클래스

//@ 아래내용은 http://www.cegui.org.uk/docs  내용을(전체는 아니지만 중요 부분을 번역한것[SJH], 나중을 위해..



//----------------==========-----------------[ CEGUI의 기본적인 리소스 로딩 sjh]----------------==========-----------------



//CEGUI 의 기본적인 bootstrapSystem() 을 수동으로 만들어주는 구문은 

//http://www.cegui.org.uk/docs/current/rendering_tutorial.html   에서 The Hard Way: Manual object creation. 이하의 구문을

// 따라하면 된다, Call the function to render the GUI 이것 전까지


//리소스 그룹 생성

CEGUI_TRY{

//[ CEGUI 렌더링을 얻기위한 가이드 ] http://www.cegui.org.uk/docs/current/rendering_tutorial.html

//1. 오브젝트로 기반된 CEGUI::Renderer의 인스턴스를 생성한다

//2. CEGUI::System 오브젝트를 생성한다(오브젝트 : 위에서 생성되어진 renderer에서 파싱한것)

//3. 각 프레임,  렌더링을 수행하기위한 CEGUI::System::renderGUI 함수를 호출한다.


// bootstrapSystem 함수는 아래3개를 생성한다, 인자는 CEGUI의 렌더링연산을 위해서 사용되어질 디바이스를 넘긴다

// * 리턴값 : 생성되어졌던  CEGUI::Direct3D9Renderer 오브젝트에 레퍼런스 

//- CEGUI::Direct3D9Renderer

//- CEGUI::DefaultResourceProvider

//- CEGUI::System

//CEGUI 의 기본적인 모든걸 자동적으로 만들어주는 명령문

Direct3D9Renderer& tempRenderer = Direct3D9Renderer::bootstrapSystem( _pD3dDevice );

//initializeManually();





//[ ResourceProviders로 리소스 로딩에 대한 가이드] http://www.cegui.org.uk/docs/current/resprov_tutorial.html

//


// 우리는 당신이 리소스 그룹들과 

// CEGUI와 함께 제공되는 datafiles(C:\sjhPhysics\datafiles\.) 디렉토리안에 data file들을 접근하는 

// 그것들의(리소스 그룹들의) 대상 디렉토리들의 초기화를 수행할 방법, 

// 그리고 우리가 모든 리소스 타입들에 대해 사용되기 위해서 defaultgroups를 할당하는 방법을  보여줄것이다



// 흔히있는 것으로서 핵심 CEGUI::System 오브젝트를 초기화한 후에, 우리는 리소스 그룹들의 한 set과

// 그것들의 타겟 디렉토리들의 한 set을 그때 지정한다.

// ( 타겟 디렉토리들 : 이것은 워킹 디렉토리가 CEGUI 패키지와 함께 'bin' 다렉토리가 될것을  맡는다.)


// DefaultResourceProvider에 대해 필요되는 dirs 를 초기화한다

CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>

(CEGUI::System::getSingleton().getResourceProvider());

rp->setResourceGroupDirectory("schemes", "../CEGUI/datafiles/schemes/"); //schemes

rp->setResourceGroupDirectory("imagesets", "../CEGUI/datafiles/imagesets/"); //imagesets

rp->setResourceGroupDirectory("fonts", "../CEGUI/datafiles/fonts/"); //font

rp->setResourceGroupDirectory("layouts", "../CEGUI/datafiles/layouts/"); //layouts

rp->setResourceGroupDirectory("looknfeels", "../CEGUI/datafiles/looknfeel/"); //looknfeel

rp->setResourceGroupDirectory("lua_scripts", "../CEGUI/datafiles/lua_scripts/"); //lua_scripts


// 만약 당신이 Xerces를 사용하는 중이고 schemas 위치(locatin)를 지정해야한다면

// 이것은 오직 실제로 필요가 되어진다.

rp->setResourceGroupDirectory("schemas", "../datafiles/xml_schemas/"); //xml_schemas


// 지금 완료되었다, 

// 우리는 그것들(리소스 그룹들)의 대상 디렉토리들 set과 함께 정의되는 리소스 그룹들의 한 멋진 set을 가지고있다.



// 끝으로, 그것들(리소스 그룹들)의 디렉토리들을 사용하는 system을 얻기위해서, 

// 우리는 사용되어지는 default resource groups를 설정한다




//유효성 스키마( validation schemas)를 위한 설치기본그룹 (setup default group)

CEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();

if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))

parser->setProperty("SchemaDefaultResourceGroup", "schemas");


// 사용어지는 default resource groups을 설정한다

CEGUI::Scheme::setDefaultResourceGroup("schemes"); //schemes 를 default 그룹으로 설정

CEGUI::Imageset::setDefaultResourceGroup("imagesets"); //imagesets 을 default 그룹으로 설정

CEGUI::Font::setDefaultResourceGroup("fonts"); // fonts 를 default 그룹으로 설정

CEGUI::WindowManager::setDefaultResourceGroup("layouts"); //layouts를 default 그룹으로 설정

CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels"); //looknfeels 를 default 그룹으로 설정

CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts"); //lua_scripts를 default 그룹으로 설정







// 아래 내용을 정리해보면 schema는 어떤 .xsd 파일

// schme는 .xsd 파일안에 있는 내용들의 그룹지어지는 묶음을들을 각각 scheme라고 칭하는 듯



//[ 데이터 파일과 Defaults 초기화에 대한 가이드 ] http://www.cegui.org.uk/docs/current/datafile_tutorial.html

//[소개]

// CEGUI는 다양한 다른 data 파일들을 사용하고

// (적어도 처음에)정확하게 모든 이 파일들이 있는것으로서 몇몇의 혼란과 그것들이 서로 관계되는 방법이 있다.

// 게다가, 당신들이 CEGUI을 사용하는 당신의 다수의 응용프로그램을 위해서 대부분 분명히 

// 설정 할( 설정하기위해서 기술적으로 필요없는 반면에 ) 몇몇의 system 전체 default들이 있다.

// 이 튜토리얼은 당신이 CEGUI와 함께 사용되는 기본 default 옵션들을 설정하는것과 데이터와 함께 더 쉬울 수 있도록

// 명령에 대한 이 주제들에 대한 소개로서 제공될것이다.


//[Font, Imagest, LookNFeel,Scheme, XSD?   그것은 모두 XML 이다]

//

//스크립트 언어 파일들과 로드할수있는 모듈들(.dll/.so files, 등등), 그래픽컬 이미지의 예외와 함께 

// CEGUI를 가지고 사용되어지는 모든 데이터 파일들은 XML기반이다.

// 이것은 당신이 실행 할(.xsd schema 파일들) 첫번째의 가능성있는 방해물로 우리를 실제로 이끈다.

// 

//  스키마 유효성(Schema Validation )

// 비록 Expat 기반 XML 파서 모듈이 XML 데이터 파일들을 파싱하는 것을 위해 지금 default 선택이되었다고 할지라도,

// 이전에 오랬동안 default는 (그리고 여전히 이 저자가 선택을 선호한다) 아파치 소프트웨어 재단(http://xerces.apache.org/xerces-c)

// 으로부터 Xerces-c++ 라이브러리에 대해 기반된 파서이다.

// 이 특별한 파서를 사용하는것의 이점은 그것이 스키마 유효성(schema validation)을 제공하는 것이다.

// 특별한 경험이 없는 사람들을 위해서, 스키마 유효성(schema validation)은 새로온 XML data가 

// 그것이(XML data) 잘 구성되어있고 그것이(XML data) 필요되어지는 정보를 포함한다는것을 보장하기 위해서

// 확인할 수 있는 방법이다.

// 작동하기위한 이 유효성(validation)을 위해서, 몇몇의 추가적인 파일들이 필요되어진다

// 

// ( schema 파일 : schema 파일들로서 알려진 놀랄것도 없이 

//   아래에 설명되어진 CEGUI's 자신의 scheme 파일들에 혼란되지 않기위한 파일들이다 )

//   

// schema 파일들은 XML 입증에 사용된다 왜냐하면 CEGUI는 CEGUI 범위에  datafiles/xml_schema/ 디렉토리안서

// 발견 되어질수 있기때문에, 그리고 .xsd 파일 확장자를 가진다.

//   

// 당신이 현재는 알아야하는 중요한 것은 XML 파서를 기반으로 한 Xerces-C++ 을 사용하는 중일때, 이 .xsd 파일들이

// ResourceProvider system에서 반드시 이용가능하다는 것이다.

// 

// 이것은  schema 파일들을 포함하고있는 디렉토리에서 리소스 그룹들을 세팅하는 것에의해 그리고  

// schema 파일들을 로딩하는 중일때 CEGUI::XercesParser에 의해 사용되는 default 로서 그 그룹을 세팅하는것에

// 대게 가장 잘맞게 달성되어지진다.

// 

// ( schema 파일들 :   The Beginners Guide to resource loading with ResourceProviders

// [http://www.cegui.org.uk/docs/current/resprov_tutorial.html] 이  안에서 

// 이것이(스키마 파일) 다뤄지고있는것을 수행하기위한 세부사항  )



//[데이터 파일]

// 이전에 언급된 것으로서, CEGUI에 대다수의 데이터 파일은 XML기반이다. 

// 일반적 '.xml' 파일 확장자를 사용하는 것 보다, 데이터 파일은 파일들이 실제로 나타내는 것에따라 보통  지정된다

// 예를들어, Imageset을 위한 .imageset과 Font를 위한 .font

// (그렇지만, 이 이름짓는 system의 필요조건은 없다 - 당신은 당신이 좋아하는 어떠한 방법을 이름짓는것은 자유다)

// 목적 각 파일 타입의 매우 간략한 개요를 이제 따른다.

// 

// [Imageset]

// Imageset은 몇몇의 소스외면에 이름지어진 지역들의 모음이다, image파일 또는 texture 와 같은..

// CEGUI 전문용어안에서, 각각의 이 명명된 지역들은 Image 이며 CEGUI에 의해 사용 되어지는 사진의 기본 레벨이다.

// 소스 image파일 또는 텍스쳐 컨텐츠를 수정하는것에 의해서, 또는 Imageset 파일을 가지고 정의되는 지역들의 범위들을

// 수정하는것에 의해서 , 당신은 CEGUI에 의해 그려지는 것의 표현을 쉽게 변화시킨다.

// 

// Imageset 파일들의 완벽한 설명을 위해서, Imageset XML 파일들을 보아라. ( Imageset XML files [http://www.cegui.org.uk/docs/current/xml_imageset.html] )

// 

// [Font]

// 놀랄것도 없이, Font 파일은 CEGUI안에서 사용을위한 폰트를 정의한다.

// 정의되어질 수 있는 폰트는 존재하는 두가지 타입들에 있다  :

// 

// FreeTypeFont) : 이것은 표준 폰트 파일에 기반되어진 폰트이다( true-type '.ttf' font 와 같이 ).

// FreeTypeFont은 .font XML 파일안에서 속성 Type="FreeType"을 통해서 지정된다.

// Imageset 파일들의 완전한 설명을 위해서, Imageset XML files를 보아라

//   (Imageset XML files [http://www.cegui.org.uk/docs/current/xml_imageset.html] )

//

// PixmapFont) : 폰트의 이 타입은 폰트 문자를 위해서 Image들을 정의하는 Imageset에 기반되는 폰트이다,

//  그리고 비트맵된 폰트로서 생각되어지는 최상이다.

//  PixmapFont는 .font XML 파일안에서 속성 Type="Pixamp"을 통해서 지정된다.

// 폰트 파일의 완전한 설명을 위해서, Font XML 파일들을 보아라. 

//   (Font XML files. [http://www.cegui.org.uk/docs/current/xml_font.html] )

// 

// LookNFeel) : LookNFeel은 중요한 대부분의 CEGUI의 skinning system에서 보관한다. 

// 각각은 하나 또는 system 다수 이미지와 자식 widget 구성요소들, 그것들의 위치들, 

// 추가적은 속성 값, 등등에 설명된 더 많은 WidgetLook 정의들을 포함할 것이다.

// 이 WidgetLook 설명은 CEGUI안에 window들과  widget들로서 결국 나타나지는 것으로 system 내부의 요소들을

// 반드시 구체화한다.,


// 폰트 파일들의 완전한 설명을 위해서, Font XML files를 보아라 

// ( Font XML files [http://www.cegui.org.uk/docs/current/xml_font.html] )


// Scheme) :  Scheme 파일은 다른 데이터 파일들과 리소스들과 함께 그룹짓기위한 큰 수단이다.

//         그리고 그것들의 상호작용의 몇몇을 정의하기위해서, 

//         그리고 CEGUI의 window들과 widget들을 위해서 'skin' 으로 간주되어질 것들을 로딩하기위해서 싱글 포인터로부터.

//         Schme는 하나 또는 더 많은 아래것들을 포함할 수 있다.

//         1) Imageset은 scheme의 부분으로서 로드되어지는 Imageset 파일을 지정한다

//         2) Font는 scheme의 부분으로서 로드되어지는 Font 파일을 지정한다

//         3) LookNFeel은 scheme의 부분으로서 로드되어지는 LookNFeel 파일을 지정한다

//         4) WidowSet은 로드할 수있는 모듈의 이름을 지정한다,  widget 이름들의 set은 당신이 system을 등록하려는

//           모듈을(로드할 수있는 모듈의 이름을) 포함한다.

//           ( 비록 어떤 이름들이 열거되지 않더라도, 모듈에서 모든 이용가능한 타입들이 등록되어진다, system 에 )

//           이것은 CEGUI에 추가된 핵심 widget 타입을 더하는것의 편리한 방법이다.

//           ( 특별하게 비록 이 모듈이 타사에의해서 제공되어졌다 할지라도 )

//         5) WindowRendererSet은 로드할 수있는 모듈의 이름을 지정한다, 

//            그리고 window renderer의 set은 당신이 system을 등록하기 바라는 그 모듈(로드할 수있는 모듈의 이름) 내부를 포함한다

//            ( 비록 어떤 이름들이 열거되지 않더라도, 모듈에서 모든 이용가능한 타입들이 등록되어진다, system 에 )

//            'Window Renderer'는 몇몇 기본 window 타입(들)을 위해서 렌더링을 제어할 수있는 오브젝트이다.

//            CEGUI에 의해서 공급되어진 모든 window renderer 오브젝트들은 'Falagard' skinning system의 

//            활용에 의해서 렌더링을 수행한다 (비록 이것이 엄밀한 요구사항이 아닐지라도.. )

//                (Falagard는 웹에서 찾아보니 : CEGUI에서 사용하는 Falagard시스템. 즉 UI커스터마이징을 가능하게 해주는 시스템 

//                          이라 함 , 이 사람이 http://historyis.tistory.com/47 이것에 대한 설명서를 한글화 하여 파일 링크 걸어놓음)

//           6) WindowAlias는 대체 가능한 이름들에 의해서 window/widget 타입에 참조되는 방법을 제공한다.

//               또한 그리고 그것(WindowAlias)은 또 다른 widget 타입을 가지고 이미 등록되어진 Widget 타입을 'hide'  하는데에

//               사용되어질 수있다. ( 그래서 그 다른 widget타입이 대신에 사용되어진다. )

//           7) FalagarMapping은 구체적인 window/widget타입, window renderer타입 그리고 widget look 정의를 링크하는 것에

//               의해서 새로운 사용하기 편리한 window타입을 만든다.

//               

//               scheme파일들의 완벽한 설명을위해서, Scheme XML files를 보아라 [Scheme XML files: http://www.cegui.org.uk/docs/current/xml_scheme.html ]

//

//

// Layout) : layout 파일은 window layout의 XML 설명을 포함한다. 각 끼워넣어진 'Window' 요소는 window 또는 만들어지는 widget을 정의한다,

//               'Property' 요소들은 각 정의되어진 window를 위해서 바랬던 세팅들과 속성 값들을 정의한다.

//     ( layout 파일들의 완벽한 설명을 위해서, Layout XML files을 보아라 [Layout XML files : http://www.cegui.org.uk/docs/current/xml_layout.html ]  )

//  

// Config ) : CEGUI의 config 파일은 모든 system defaults, 로드되어지는 초기 리소스들, 뿐만 아니라 

// Renderer와 System 오브젝트들을 만드는 그것을 넘어 C++코드의 한 줄 쓰는것 없이

// 실행하기( ScriptModule를 사용하는 중일때 ) 위한 초기화와 종료 스크립트 파일들을 지정하는것을 

// 당신에게 ㅎ ㅓ 락한다 

// ( config 파일의 완벽한 설명을 위해서, CEGUI Configuration XML files를 보아라 

//  [CEGUI Configuration XML files : http://www.cegui.org.uk/docs/current/xml_config.html ] )




// [ 기본 파일들을 로딩하는 것 ]

// 

// 것들(일,동작)을 설치하기 위해서 그리고 몇몇 파일들에서 당신이 로드해야만하는 것을 실행하는것.

// 필요되어지는 파일들의 전형적인 set은

// 1) Imageset

// 2) Font

// 3) LookNFeel

// 4) Scheme

// 이다.



//Scheme 파일에 대하여 유용한(당신이 위 설명으로부터 지금까지 쭉 수집되어왔을 것으로 )

// 것은 당신을 위해서 다른 파일들을 자동적으로 로딩할 수 있는것이다.

// 이 튜토리얼의 목적을 위해서, 우리는 scheme 파일들과 font 파일들 로드할 것이다.

// (그것(로드할)은  scheme가 우리를 위해서 Imageset과 LookNFeel을 자동적으로 로드한다는 것을 맡는다 )

// scheme와 font 파일들은 수행되어진다.

// 이와같이 :


// TaharezLook scheme 파일을 생성한다/로드한다

// 이 자동로드 TaharezLook looknfeel와 imageset file들

CEGUI::SchemeManager::getSingleton().create( "TaharezLook.scheme" );

// 폰트를 생성/로드한다

// 로드되어지는 첫번째 폰트는 자동적으로 default 폰트이다, 하지만

// scheme는 이미 로드되어지는 폰트를 가졌을 수있다는것에 주의해야한다,

// 그래서 이미 default set이 존재할것이다,

//  만약 우리가 확실하게 default이기 위해서 "Commonweath-10"폰트를 원한다면, 우리는 명시적으로 나중에

//  default를 설정해야만한다.

//CEGUI::FontManager::getSingleton().create( "DejaVuSans-10.font" );


//위의 코드는(그리고 CEGUI 샘들을안에) 리소스 그릅 위치들과 default 그룹들이 

//[ResourceProviders로 리소스 로딩에 대한 가이드] 에서 설명되어진것으로서 모두 지금까지 쭉

// 설정되어왔다는 것을 가정한다.



//----------------==========-----------------[System defaults 초기화 sjh]----------------==========-----------------

//당신은 System을 위한 몇몇의 default 옵션들을 지정해야한다

//이것은 system은  font와 마우스커서가 이용할수있는 것으로 항상 가지고 있는것을 보증한다

//window 또는widget이 자신의것의 선호가 없음을 지정할때..

//FontManager 는 system default로서  첫번째로 로드되어지는 font 를 자동적으로 세팅한다.

//만약 이것이 당신이 필요로하는 default font가 아니라면, 또는 만약 당신이 이전 font들이 로드되어졌다는것을 보증할수 없다면

// 당신은 명시적으로 default를 지정해야한다, 이 코드로

//System::getSingleton().setDefaultFont( "DejaVuSans-10" );



//또 하나의 당신이 일반적으로 설정 할수있는 오브젝트는 마우스 커서이다

// 이것은 당신이 그것의 커서를 설정하지않은 어떠한 요소의 위로 마우스를 움직일때 마우스커서는 사라지지않는다는것을 보증한다

// 설정하기위한 default 마우스 커서를위한 코드는 아래와 같고

// 이것은 scheme에의해 로드되어지는 TaharezLook imageset을 사용한다

System::getSingleton().setDefaultMouseCursor( "TaharezLook", "MouseArrow" );


//마지막으로, 만약 당신이 툴 팁들을 사용하길 생각한다면

//당신은 당신이 그것의 목적을위해서 사용되는것을 원하는 widget 타입 기반의 ToolTip의 이름을 지정해야한다

// window 단위당 기준에 대해 이것을 설정하는것은 실제로 가능하다

// 비록 이것이 일반적으로 필요되어지지 않고 이 서문의 튜토리얼의 범위를 넘어서는 것일지라도

// default tool tip window 타입을 설정하는 코드는 이것과 같다

System::getSingleton().setDefaultTooltip( "TaharezLook/Tooltip" ); //문서에는 setDefaultToolTip 이라고 되어있지만 T 가 CEGUI::SYSTEM 에서찾아보니 소문자이다

//여기까지가 가장 기본적인 초기화이고 CEGUI 을 초기화하는 최소한의 작업이다








 ===================  =================== ================[ 생성 부분 ]===================  ===================  ===================






using namespace CEGUI;

//CEGUI 창 생성

CEGUI_TRY{


//http://www.cegui.org.uk/docs/current/window_tutorial.html

// The Beginners Guide to Creating a CEGUI Window

//이부분을 더중요한 부분이라 하니 번역해 놓는다.. 역시 나중에 시간이 지나 까먹었을때를 대비해서 [sjh]


// * brief : [모든 widget은 window이다]

// * 이것은 CEGUI로 작동할때 반드시 완전히이해되어져야하는 가장 중심의 개념이다(열라 강조한다...;;)

// * system에있는 모든 widget은 동일한 Window 기반 클래스로부터 상속되어진다.   [ http://www.cegui.org.uk/docs/current/window_tutorial.html 여기의 내용을 중요부분을 번역해놓는다, 다음 문장 번역을 위해 써놓음]

// * 그래서 나는(튜토리얼쓴사람) window를 언급할때는 언제든지, 이 튜토리얼의 목적들을 위해서,

// * 동일한 아이디어들은 push button 또는 스크롤바 widget으로 그냥 쉽게 적용되어질 수있다는 설명을 덧붙인다. (튜토리얼이 비기너 튜토리얼이라 이런 글을 써놓은듯..)

//

// * brief [많은 설정들은 상속되어진다]

// * CEGUI안에서 window들을 위해서 유용한 많은 설정들과 속성들은 window 계층구조아래로 전달되어진다.

// * 예를들어, 그때 default에 의해서, 만약 당신이 0.5로 특정한 window 에 대해 알파 투명도를 설정한다면 모든 window와 widgets은

// * window가 더 높은 값들에서 적용되어진 변화들에의해  또한 영향을받을것으로 붙여진다.

// * 예를들어, 비록 자식 window에대해 실질적으로 설정된것(마지막 값들)을 바뀌지않게 유지하고 그리고/또는 

// * 사용되어진 설정들은 현재 window로 상속된 계층구조안에서 모든 window들로부터 설정되는 값들의 몇몇의 조합들은 

// * 일반적일지라도..

//

//

// * 이것은 window 제거와 같은것들로 또한 적용한다; 예를들어, default에 의해서, window는 붙여진 자식 window들과 widges들을

// * 제거할 것이다 window가 파괴되어질때....

// * 이 방식의 주요 이점은 당신이 알파, visility, enabled/disabled 상태 와같은 것들을 위해서  

// * root window 설정들로 변화들을 만든것에의해 전체 GUI에 쉽게 영향을 줄수있다는 것이다

// *  그리고 root window를 간단하게 파괴하는것에 의해서 전체의 GUI layout을 쉽게 제거할수있다.

// *  

// *  default 상속된 동작들은 제어가 주어진 더 좋은것이 필요로 되어지는 또는

// *  관리 기술들이 향상된 일부가 사용되어지는 window 단위당에 대해 오버라이딩 되어질 수있다.

 


//brief [ window들을 생성한다]

// 동작하게하는 이것(window생성 하는것)의 두가지 방법이 있다, C++ 코드와 XML layout 파일들을 통해서...

// 각 접근은 아래에 논의되어진다

//

// brief [ C++ 코드를 통해 GUI 생성 ]

//  CEGUI에 있는 모든 window들은 WindowManager 싱글톤 오브젝트에 의해 생성되어진다

//  당신은 WindowManager::getSingleton 함수를 통해서 이 오브젝트들로 접근할수 있다.

WindowManager& wmgr = WindowManager::getSingleton();


//대게, 당신은 당신의 GUI 안에 'root' window로서 DefaultWindow(또는 그것의 이전 이름 DefaultGUISheet 을 사용하기위해서 ) 로서 

//알려진 것들을 사용할 것이다

// 이것은 필요하지않다, 하지만 CEGUI를 위해서 사용법의 받아들여지는 패턴이다.

// 그리고 당신이 더 많은 top-level window들을 더하는것을 시작하자마자 그것들(windows)을  배치하는것을 돕는다.

// 

// 본격적으로 시작하기위해서, 

// 그래서 우리는 GUI를 위해서 root 'GUI Sheet'로서 그것(DefaultWindow)을 설정함으로서 DefaultWindow를 생성할 수 있다

Window* myRoot = wmgr.createWindow( "DefaultWindow", "root" );

System::getSingleton().setGUISheet( myRoot ); //setGUISheet 는 Set the active GUI sheet (root) window. 


//WindowManager::createWindow함수는 그것의 파라미터들로서 두개의 스트링들을 취한다

//이 예제안에서 "DefaultWindow" 첫번째 파라미터는 system에게 type 또는당신이 생성하기 바라는

//window의 클래스를 말해준다.

// 일반적으로,  비록 일부일지라 하더라도, 당신이 이용할수있는것을 가지는 window는 

// 당신이 당신의 scheme 파일, DefaultWindow와 같은것을 로드했을때 등록되어지게되는 그것들이(window)

// global 타입들이고 항상 이용가능하다

// 

// 이 예제에서 "root" 두번째 파라미터는 window로 할당되어질 유일한 이름이다

// 이 이름은 나중에 WindowManager로부터 window에대한 포인터를 검색하는 것으로 사용되어질수있다

// 명칭된 당신의 root window "root" 는 필요하지 않지만 일반적인 문법인것을 주의해야한다

// 

// System::setGUISheet함수는 GUI의 root로서 주어진 window를 지정하는 것으로 사용되어진다.

// 이것은 어떤 현재 sheet/root window를 대체할 것이다

// 비록 이전 window계층구조가 실질적으로 소멸되어지지 않는다는것을 주의한다 할지라도(그것은

// 디스플레이로부터 단지 분리되는 것이다  ) 

// 당신은 System::setGUISheet 함수를 하용하는 그것들(window들) 사이에서 간단하게 flipping 에 의해서

// GUI 'pages' 사이에 쉽게 전환할 수있다

// 

// 지금 당신은 당신의 첫번째 윈도우를 지금까지 쭉 만들어왔고 그것을 GUI system으로 붙였다.

// 그리고 system은 그것이 GUI를 그릴때 GUI의 root 로서 이 window를 사용할것이다.

// 하지만 만약 당신이 이 코드를 사용하는 간단한 프로그램을 컴파일을 했다면, 당신은 어떤것도 아직 볼수없다 ;뭣때문이지? <- 내가쓴말 아님 

// 당신의 응용프로그램에 어떤문제는 없다,

// 위에 만들었던 DefaultWindow는 단지 전적으로 눈에 보이지않는다!

// 이것은 root window로서 완벽하게 적합작 DefaultWindow를 만드는 것이다; 그것은 다른 window와 widges들이 붙여질 수 있는

// 빈 도화지로서 제공한다

// 지금 그것들을 해보자...

// 

//여기에 frame window를 만들것이다;

// 이것은 당신의 테스트탑위의 window들에 유사한 방법으로 작동하는 window이다, 이 것은 title bar를 가지며 이동되어질 수있고, 사이즈가조절될 수있다.

FrameWindow* fWnd = static_cast<FrameWindow*>( wmgr.createWindow( "TaharezLook/FrameWindow", "testWindow" ));

//여기서 우리가 "TaharezLook/FramwWindow"  window를 만드는 중이다. 이것의 이름은 system도처에 보여지는 또다른 규칙을 사용한다

// window 타입은 widget set의 이름에 의해서 앞에 붙여진다

// (만약 당신이 WindowsLook scheme를 로드할경우, 당신은 대신에 "WidndowsLook/FramwWindow" 를 생성할수있다 )

// 우리는 우리의 새로운 window에게 "testWindow"의 간단한 테스트 이름을 부여했다

// 기억해야하는 한가지 마지막인것은 캐스트의 사용이다, 이것(캐스트)은 WindowManage::createWindow 함수가 Window 타입을 항상 리턴하기 때문에

// 필요되어진다

// 

// 많은 다른 이 경우에서 기본 window 포인터는 충분할것이다, 

// 하지만 당신이 하위클래스들에 도입된 함수를 접근 하기를 원할 때가있다

// 그래서 보여지게되는것으로서의 캐스트 사용은 CEGUI를 사용하는 중일때 공통이다.

// 우리의 새로운 window로 유용한 어떤것을 할수있는 system을 위해서, 우리는 몇가지 추가적인 단계들을 수행해야한다

// 

// 1) 첫번째,  우리는 위에 설정한 root window로 window를 붙여야한다

myRoot->addChildWindow( fWnd );


//지금 우리는 초기 위치를 설정할수있고 우리의 window를 위한 사이즈를 설정할WindowManager

//CEGUI는 동일한 시간에서 상대적(scale)과 절대적(offset) 구성요소들의 사용을 활성화하는 '통합된' 좌표system을 사용한다

//이것은 당신이 볼것인 각 좌표들이 두 부분을 가지고있는 이유이다.

// 이 개념의 약간 확장되어진 소개를 위해서Falagard skinning system for CEGUI [http://www.cegui.org.uk/docs/current/fal_man.html] 의 부분인

// The Unified Co-ordinate System[http://www.cegui.org.uk/docs/current/fal_intro.html#fal_unifiedsystem]

// 을 보세요. (음......;; 귀차니즘이... )

// 

// 예제로 돌아가서

// 부모의 top-left로부터 거리의 1/4의 위치

fWnd->setPosition( UVector2( UDim( 0.25f, 0 ), UDim( 0.25f, 0 ) ) );


//부모의 절반 사이즈인 크기를 설정한다

fWnd->setSize( UVector2( UDim( 0.5f, 0 ), UDim( 0.5f, 0 ) ) ); //(그럼 1 이 부모의 full 사이즈라는 거네(0.~1.) )


//끝으로, 우리는 framw window의 타이틀바의 설명을 설정한다.

fWnd->setText( "Hello World!" );


//그리고 그것이 전부다!  (ㅋㅋㅋ)

//응용프로그램안에서 컴파일되어질때, 당신이 디스플레이의 중간에 간단한 frame window를 지금 볼것이다.


//[XML layouts]

// 위의 모든것은 아주 훌룡하다, 하지만 하나의 주요한 결점이있다;

// 당신이 GUI layout을 조정하는것을 바라는 어떤 시간에, 당신은 당신의 코드를 수정해야하고 

// 재컴파일을 해야한다. (This will get  old pretty quick), 그래서 당신이 정말로 원하는 것은

// 외부적으로 당신의 GUI layout을 지정할수있는것이다, 그리고 당신의 코드는 파일을 

// 통해 layout을 로드한다.    이것은 CEGUI layout XML 파일들의 목적이다.

// 

// system은 XML layout파일들을 지원한다, 그것은 WindowManager::loadWindowLayout 함수를 통해서 로드되어질수있다.

// 이 함수는 당신을 위한 모든 window들을 만든다 그리고 로드되는 계층구조의 root window에 포인터를 리턴한다

// 그것은 GUI의 root 로서 할당된것으로서 이상적이다!

// 

// 그래서, 모든것의 첫번째로 우리는 layout 파일을 필요로한다, 다음의 XML은 text 파일로서 저장되었다,

// 우리가 위에서 논의했던 코드에  layout 파일에 대응하는 것이다.

// <?xml version="1.0" ?>

// <GUILayout>

// <Window Type="DefaultWindow" Name="root">

// <Window Type="TaharezLook/FrameWindow" Name="testWindow">

// <Property Name="UnifiedPosition" Value="{ {0.25, 0}, {0.25, 0} }" />

// <Property Name="UnifiedSize" Value="{ {0.5, 0}, {0.5, 0} }" />

// <Property Name="Text" Value="Hello World!" />

// </Window>

// </Window>

// </GUILayout>


// Window 요소들은 WindowManager::createWindow 함수들에 확실한 매핑을 보여준다

// -그것들은 이전에 논의되었던 파라미터들에 정확하게 일치하는 타입과 이름을 가진다.

// Window 구성요소들의 내포된것은 다른것으로 어떤 window들을 붙이기위해서 사용되어진다

// 당신이 layout 파일안에서 하나의 'root' level window를 단지 가질것이라는 것에 주의해야한다

// 그것은 당신이 그 밖의 window들과 widget들이 위치되는 캔버스(도화지같은 공간)로서 사용되어지는 

// DefaultWindow를 대게 볼수있는것이 또 하나의 이유이다.


//속성 요소들은 정의되어지는중인 Window에 대한 속성들을 설정하기 위해서 사용되어진다.

// 각 window/widget 클래스를 위해서 이용할수있는 많은 속성들이 있다, 그리고 각 클래스는 

// 그것의(window)의 부모 클래스로부터 모든 속성들이 또한 상속된다.

// 이용가능한 하드코딩된 속성들과 그것들의 value string formats에대한 문서에 대해서 API reference안에

// Properties namespace들을 보시오. 

// 'Falagard' skin들은 그것들 자신의 속성들을 만들 수 있는 때문에, 당신이 사용하는 중인 window들은

// 이전 링크(이 'soft' 속성들에 대한)에서 열거되는 것보다 더 많은 속성들을 포함할 가능성이 있다.

// 당신은 기록문서가 당신이 사용중인 skin과 함게 제공되어지는 어느것이든지 참고해야한다

// 예를들어, CEGUI Wiki를 보시오 : 

// TaharezLook Properties http://www.cegui.org.uk/wiki/index.php/SetProperty

// WindowsLook Properties http://www.cegui.org.uk/wiki/index.php/SetProperty_(WindowsLook)

// 

// 만약 "test.layout" 로 불리는 파일로서 저장했다면, 당신은 이  layout을 로드할 수 있고 다음과 같이 

// GUI root 로서 그것을 설정할 수 있다.

// 


// Window* myRoot = WindowManager::getSingleton().loadWindowLayout( "test.layout" );

// System::getSingleton().setGUISheet( myRoot );


//최종결과는 예상보다 일찍 C++ 코드에서 수행되었던 것으로서 정확하게 동일하다.

// 지금 우리는 수정할 수 있는것을 기대하고 상수편집과 application 코드의 재컴파일에 대해 필요없이

// GUI layout을 향상시킨다.


//[결론]

//여기서 우리는 기본 window 생성을 수행하는 방법, 간단한 window 계층구조를 만드는 방법,

//, 그리고 몇몇의 window 세팅들을 수정하는 방법을 지금까지 쭉 보아왔다

// 당신은 이것이 C++코드와 외부의 XML layout 파일 둘다 사용해서 얻게되어질수있는 방법을 지금까지 쭉 보아왔다

// 양쪽의 방법들을 사용해서 이용가능한 많이 향상된 기능성들이 있다.

// 비록 그런 기능성들은 이 소개의 튜토리얼의 범위를 넘어서 있을지라도



}CEGUI_CATCH(Exception e){


std::cout<<"CEGUI:생성 : "<<e.what()<<std::endl<<std::endl;

return false;

}

return true;

}






 ===================  종료  ===================


종료하면서 해제하는 부분은 따로 번역할 것은 없으며



최근엔


CEGUI::Direct3D9Renderer::destroySystem();

CEGUI::System::destroy(); //모든 실글톤의 객체들을 제거됨



을 하거나 CEGUI 버전에 따라 싱글톤 포인터를 얻어와 해당 포인터를 직접 해제해주거나 해야 하는 방식 입니다







p.s CEGUI나 기타 게임에 관한 공유하실 분 있으면 언제든 환영합니다~






반응형

'그래픽스(Graphics) > GUI Library' 카테고리의 다른 글

CEGUI 설치  (0) 2012.11.02
GUI 제공하는 사이트들  (0) 2012.11.02

+ Recent posts