슬라이드 1

Similar documents
슬라이드 1

슬라이드 1

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

슬라이드 1

K&R2 Reference Manual 번역본

슬라이드 1

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

슬라이드 1

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

UI TASK & KEY EVENT

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

C프로-3장c03逞풚

Chapter_02-3_NativeApp

슬라이드 1

리니어레이아웃 - 2 -

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

Microsoft PowerPoint - es-arduino-lecture-03

UI TASK & KEY EVENT

슬라이드 1

Lab 3. 실습문제 (Single linked list)_해답.hwp

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

윈도우시스템프로그래밍

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

JDK이클립스

untitled

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

KARAAUTO_4¿ù.qxd-ÀÌÆå.ps, page Normalize

( )부록

PowerPoint 프레젠테이션

윈도우시스템프로그래밍

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

03장.스택.key

Chapter 1

초보자를 위한 C# 21일 완성

<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

PowerPoint Presentation

UI TASK & KEY EVENT

PowerPoint 프레젠테이션

슬라이드 1

(Microsoft PowerPoint - \270\266\300\314\305\251\267\316\304\250USB_Host_Device_\272\316\306\256\267\316\264\365\275\307\275\300_Philip.ppt)

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

제8장 자바 GUI 프로그래밍 II

어댑터뷰

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Microsoft PowerPoint - ccs33_bios_PRD.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - 14주차 강의자료

슬라이드 1

Install stm32cubemx and st-link utility

5.스택(강의자료).key

gnu-lee-oop-kor-lec10-1-chap10

Microsoft PowerPoint - chap01-C언어개요.pptx

캐빈의iOS프로그램팁01

설계란 무엇인가?

<BEC8BEE7B4EBBDC7BDC0C0DAB7E12E687770>

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Microsoft PowerPoint - polling.pptx

PowerPoint Template

윈도 모바일 6.1을 OS로 사용하는 스마트폰(옴니아2 등)에서의 Tcl/Tk의 사용

슬라이드 1

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint 프레젠테이션

고급 프로그래밍 설계

슬라이드 1

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

Chapter #01 Subject

untitled

ePapyrus PDF Document


10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

chap 5: Trees

Chapter 4. LISTS

PowerPoint 프레젠테이션

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

Microsoft Word - src.doc

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter 1-rev

Data structure: Assignment 3 Seung-Hoon Na December 14, 2018 레드 블랙 트리 (Red-Black Tree) 1 본 절에서는 레드 블랙 트리를 2-3트리 또는 2-3-4트리 대한 동등한 자료구조로 보고, 두 가지 유형의 레

게임 기획서 표준양식 연구보고서

Microsoft PowerPoint - [Practice #1] APM InstalI.ppt

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

Microsoft PowerPoint - C++ 5 .pptx

<4D F736F F D D31312D30312D53572D30312DBBE7BFEBC0DABCB3B8EDBCAD5FBFDCBACEB9E8C6F7BFEB2E646F63>

PowerPoint 프레젠테이션

Transcription:

핚국산업기술대학교 제 14 강 GUI (III) 이대현교수

학습안내 학습목표 CEGUI 라이브러리를이용하여, 게임메뉴 UI 를구현해본다. 학습내용 CEGUI 레이아웃의로딩및렌더링. OIS 와 CEGUI 의연결. CEGUI 위젯과이벤트의연동.

UI 구현 : 하드코딩방식 C++ 코드를이용하여, 코드내에서직접위젯들을생성및설정 CEGUI::PushButton* resumebutton = (CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/ Button", Resume"); meditorguisheet->addchildwindow(resumebutton); resumebutton->setposition(cegui::uvector2(cegui::udim(0.35f,0),cegui::udim(0.45f,0))); resumebutton->setsize(cegui::uvector2(cegui::udim(0.3f, 0), CEGUI::UDim(0.1f, 0))); resumebutton->settext("resume");

UI 구현 :.layout 파일의이용 레이아웃에디터를이용하여구성설정 코드내에서.layout 파일을로딩하면서, 화면구성 loadwindowlayout("lecturetitle.layout");

마우스및키입력과 CEGUI 의연동 CEGUI 는자체적으로키및마우스입력을받아들이는로직을갖고있지않음. 외부입력을 CEGUI 측으로전달 (Injection) 해주는연결부를따로구현해야함. injectmousemove, injectmousewheelchange injectmousebuttonup, injectmousebuttondown injectkeyup, injectkeydown injectchar OIS Layer CEGUI Layer

위젯과이벤트의연결 PushButton::EventClicked bool TitleState::startGame(const CEGUI::EventArgs &evt)... 이벤트처리루틴...

실습 TitleUI 게임타이틀 UI 의구현

CEGUI Library Download 강의홈페이지에서 Visual Studio version 에맞는라이브러리를다운로드및압축해제. CEGUI_HOME 환경변수설정.

CEGUI 설정 : include 디렉토리설정

CEGUI 설정 : CEGUI 라이브러리설정

CEGUI 설정 : DLL 준비 CEGUI 의 DLL 파일들을실행폴더에담아야함 CEGUIBase_d.dll CEGUIExpatParser_d.dll CEGUIFalagardWRBase_d.dll CEGUIOgreRenderer_d.dll CEGUITinyXMLParser_d.dll Release mode 의경우는 _d 를뺀 DLL 복사필요

TitleState.cpp bool TitleState::startGame(const CEGUI::EventArgs &evt) mgamestart = true; 실습 return true; void TitleState::enter(void) mcontinue = true; mgamestart = false; mtitlelayout = ceguiwindowmanager->loadwindowlayout("lecturetitle.layout"); ceguisystem->setguisheet(mtitlelayout); ceguiwindowmanager->getwindow("startgamebutton")->subscribeevent( CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&TitleState::startGame, this)); void TitleState::exit(void) ceguisystem->setguisheet(null); ceguiwindowmanager->getwindow("startgamebutton")->removeevent(cegui::pushbutton::eventclicked); ceguiwindowmanager->destroywindow(mtitlelayout); bool TitleState::frameEnded(GameManager* game, const FrameEvent& evt) if (mgamestart) game->changestate(playstate::getinstance()); return mcontinue;

GameManager.cpp (1) 실습 void GameManager::init(void)... 중략... mceguirenderer = &CEGUI::OgreRenderer::bootstrapSystem(); ceguischememanager->create("lectureskin.scheme"); unsigned int w, h, d; int left, top; mwindow->getmetrics(w, h, d, left, top); const OIS::MouseState &ms = mmouse->getmousestate(); ms.width = w; ms.height = h;

GameManager.cpp (2) CEGUI::MouseButton GameManager::convertButton(OIS::MouseButtonID buttonid) switch (buttonid) case OIS::MB_Left: return CEGUI::LeftButton; case OIS::MB_Right: return CEGUI::RightButton; case OIS::MB_Middle: return CEGUI::MiddleButton; default: return CEGUI::LeftButton; bool GameManager::mouseMoved(const OIS::MouseEvent &e) CEGUI::Point mousepos = CEGUI::MouseCursor::getSingleton().getPosition(); mousepos.d_x = e.state.x.abs; mousepos.d_y = e.state.y.abs; CEGUI::MouseCursor::getSingleton().setPosition(mousePos); ceguisystem->injectmousemove(e.state.x.rel, e.state.y.rel); ceguisystem->injectmousewheelchange(e.state.z.rel); return states.back()->mousemoved(this, e); bool GameManager::mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id ) ceguisystem->injectmousebuttondown(convertbutton(id)); return states.back()->mousepressed(this, e, id); bool GameManager::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id ) ceguisystem->injectmousebuttonup(convertbutton(id)); return states.back()->mousereleased(this, e, id); 실습

GameManager.cpp (3) 실습 bool GameManager::keyPressed(const OIS::KeyEvent &e) ceguisystem->injectkeydown(e.key); ceguisystem->injectchar(e.text); return states.back()->keypressed(this, e); bool GameManager::keyReleased(const OIS::KeyEvent &e) ceguisystem->injectkeyup(e.key); return states.back()->keyreleased(this, e);

실행화면 : Title UI ( 화면크기를 1024x768 로설정필요 )

CEGUI 라이브러리초기화 mceguirenderer = &CEGUI::OgreRenderer::bootstrapSystem(); ceguischememanager->create("lectureskin.scheme"); #define ceguiwindowmanager (CEGUI::WindowManager::getSingletonPtr()) #define ceguisystem (CEGUI::System::getSingletonPtr()) #define ceguischememanager (CEGUI::SchemeManager::getSingletonPtr()) GameManager.h unsigned int w, h, d; int left, top; mwindow->getmetrics(w, h, d, left, top); const OIS::MouseState &ms = mmouse->getmousestate(); ms.width = w; ms.height = h;

OIS 마우스클릭을 CEGUI 의연결 CEGUI::MouseButton GameManager::convertButton(OIS::MouseButtonID buttonid) switch (buttonid) case OIS::MB_Left: return CEGUI::LeftButton; case OIS::MB_Right: return CEGUI::RightButton; case OIS::MB_Middle: return CEGUI::MiddleButton; default: return CEGUI::LeftButton; bool GameManager::mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id ) ceguisystem->injectmousebuttondown(convertbutton(id)); return states.back()->mousepressed(this, e, id); bool GameManager::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id ) ceguisystem->injectmousebuttonup(convertbutton(id)); return states.back()->mousereleased(this, e, id);

OIS 의마우스움직임을 CEGUI 의연결 bool GameManager::mouseMoved(const OIS::MouseEvent &e) CEGUI::Point mousepos = CEGUI::MouseCursor::getSingleton().getPosition(); mousepos.d_x = e.state.x.abs; mousepos.d_y = e.state.y.abs; CEGUI::MouseCursor::getSingleton().setPosition(mousePos); ceguisystem->injectmousemove(e.state.x.rel, e.state.y.rel); ceguisystem->injectmousewheelchange(e.state.z.rel); return states.back()->mousemoved(this, e);

Key 입력을 CEGUI 와연결 bool GameManager::keyPressed(const OIS::KeyEvent &e) ceguisystem->injectkeydown(e.key); ceguisystem->injectchar(e.text); return states.back()->keypressed(this, e); bool GameManager::keyReleased(const OIS::KeyEvent &e) ceguisystem->injectkeyup(e.key); return states.back()->keyreleased(this, e);

CEGUI 레이아웃로딩및버튼클릭이벤트연결 void TitleState::enter(void) mcontinue = true; mgamestart = false; mtitlelayout = ceguiwindowmanager->loadwindowlayout("lecturetitle.layout"); ceguisystem->setguisheet(mtitlelayout); ceguiwindowmanager->getwindow("startgamebutton")->subscribeevent( CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&TitleState::startGame, this)); void TitleState::exit(void) ceguisystem->setguisheet(null); ceguiwindowmanager->getwindow("startgamebutton")->removeevent(cegui::pushbutton::eventclicked); ceguiwindowmanager->destroywindow(mtitlelayout);

입력과게임로직의분리처리 bool TitleState::startGame(const CEGUI::EventArgs &evt) mgamestart = true; return true; bool TitleState::frameEnded(GameManager* game, const FrameEvent& evt) if (mgamestart) game->changestate(playstate::getinstance()); return mcontinue; bool TitleState::keyPressed(GameManager* game, const OIS::KeyEvent &e) switch(e.key) case OIS::KC_SPACE: mgamestart = true; break; case OIS::KC_ESCAPE: mcontinue = false; break; return true;

초간단실습과제 현재프로그램은종료버튼에대핚처리를하고있지않음. 종료버튼에이벤트를추가하여, 종료버튼을눌렀을경우, 게임이종료되게하시오.

실습 CharacterSelectUI 캐릭터선택 UI 구현

PlayState.cpp 실습 void PlayState::_createCharacterSelectUI(void) mback = false; mcharacterselectlayout = ceguiwindowmanager->loadwindowlayout("characterselect.layout"); ceguisystem->setguisheet(mcharacterselectlayout); ceguiwindowmanager->getwindow("professoricon")->subscribeevent( CEGUI::Window::EventMouseEnters, CEGUI::Event::Subscriber(&PlayState::professorSelected, this)); ceguiwindowmanager->getwindow("ninjaicon")->subscribeevent( CEGUI::Window::EventMouseEnters, CEGUI::Event::Subscriber(&PlayState::ninjaSelected, this)); ceguiwindowmanager->getwindow("backbutton")->subscribeevent( CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&PlayState::backButtonClicked, this)); void PlayState::_destroyCharacterSelectUI(void) ceguisystem->setguisheet(null); ceguiwindowmanager->getwindow("professoricon")->removeevent(cegui::window::eventmouseenters); ceguiwindowmanager->getwindow("ninjaicon")->removeevent(cegui::window::eventmouseenters); ceguiwindowmanager->getwindow("backbutton")->removeevent(cegui::pushbutton::eventclicked); ceguiwindowmanager->destroywindow(mcharacterselectlayout);

실행화면

마우스가위젯위에왔을때의이벤트처리 실습 ceguiwindowmanager->getwindow("professoricon")->subscribeevent( CEGUI::Window::EventMouseEnters, CEGUI::Event::Subscriber(&PlayState::professorSelected, this)); ceguiwindowmanager->getwindow("ninjaicon")->subscribeevent( CEGUI::Window::EventMouseEnters, CEGUI::Event::Subscriber(&PlayState::ninjaSelected, this));

캐릭터교체 mcharacteryaw->attachobject(mprofessorentity); mcharacteryaw->attachobject(mninjaentity); bool PlayState::professorSelected(const CEGUI::EventArgs &evt) mcharacterentity = mprofessorentity; mprofessorentity->setvisible(true); mninjaentity->setvisible(false); manimationstate = mprofessoranimationstate; mcharacteryaw->setorientation(ogre::quaternion::identity); return true; bool PlayState::ninjaSelected(const CEGUI::EventArgs &evt) mcharacterentity = mninjaentity; mprofessorentity->setvisible(false); mninjaentity->setvisible(true); manimationstate = mninjaanimationstate; mcharacteryaw->setorientation(ogre::quaternion(degree(180), Ogre::Vector3::UNIT_Y)); return true;

정리 CEGUI 의구현방식 하드코딩레이아웃파일로딩 입력시스템 ( 키및마우스입력 ) 과 CEGUI 의연결 입력시스템으로부터넘어온값을 CEGUI 로전달 (Inject) 해야함. 위젯이벤트의처리 위젯별로해당되는이벤트에대한함수를만들고, 이를연결시켜야 (Subscribe) 함.