슬라이드 1

Similar documents
<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

슬라이드 1

슬라이드 1

슬라이드 1

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

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

슬라이드 1

슬라이드 1

<353120C0CCB8E9C0E72D4E504320C0CEB0F820C1F6B4C9C0BB20C0A7C7D120B9ABB8AEC1FEB1E220B1B8C7F62E687770>

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

슬라이드 1

설계란 무엇인가?

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

Chapter #01 Subject

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

슬라이드 1

Microsoft PowerPoint - Chapter 6.ppt

<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

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

Design Issues

PowerPoint Template

슬라이드 1

(Microsoft PowerPoint - \301\24611\260\255 - \276\326\264\317\270\336\300\314\274\307)

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

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

JUNIT 실습및발표

K&R2 Reference Manual 번역본

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

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

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

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

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

PowerPoint 프레젠테이션

API 매뉴얼

유니티 변수-함수.key

윈도우시스템프로그래밍

C 언어 프로그래밊 과제 풀이

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

PowerPoint 프레젠테이션

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

chap10.PDF

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

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

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

C++ Programming

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint - 07-Data Manipulation.pptx

C++ Programming

PowerPoint Presentation

PowerPoint Presentation

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint Presentation

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

쉽게 풀어쓴 C 프로그래밍

오버라이딩 (Overriding)

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

untitled

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

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

제11장 프로세스와 쓰레드

PowerPoint Presentation

UI TASK & KEY EVENT

Chapter_02-3_NativeApp

Microsoft PowerPoint - 02-Class Review.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Template

chap 5: Trees

PowerPoint Presentation

Microsoft PowerPoint - 14주차 강의자료

쉽게 풀어쓴 C 프로그래밍

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

슬라이드 1

슬라이드 1

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

No Slide Title

Microsoft PowerPoint - 06-Body Data Class.pptx

API 매뉴얼

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

금오공대 컴퓨터공학전공 강의자료

쉽게 풀어쓴 C 프로그래밍

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

( )부록

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint - polling.pptx

1장. 유닉스 시스템 프로그래밍 개요

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

C++ Programming

슬라이드 1

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

Transcription:

한국산업기술대학교 제 4 강프레임리스너 (Frame Listener) 이대현교수

학습안내 학습목표 프레임리스너를이용하여게임루프를구현하는방법을이해한다. 오우거엔짂의키입력처리방식을이해한다. 학습내용 프레임리스너의개념프레임리스너를이용한게임캐릭터의이동캐릭터의이동속도조절 OIS 입력시스템을이용한키보드입력의처리

기본게임루프 Initialization Game Logic Drawing N Exit? Y Finish

실제게임루프

오우거엔진의메인렌더링루프 Root::startRendering() 함수에서이루어짐. 메인루프수행내용 프레임리스너 (Frame Listener) 들의 framestarted() 함수호출 모든렌더타겟들이 GPU 에게렌더링요청을완료 프레임리스너 (Frame Listener) 들의 framerenderingqueued() 함수호출 렌더타겟버퍼갱신 (back buffer swap) 루프의중단 프레임리스너 (Frame Listener) 들의 frameended() 함수호출 framestarted(), frameended(), framerenderingqueued() 에서하나라도 false 리턴.

framerenderingqueued() Ogre 1.7 부터 FrameListener 에서사용되기시작함. GPU 에 rendering command 를 issue 한후, 그결과가넘어오기전까지기다리는시간을이용하여, frame 구성로직을 CPU 를이용할수있음. 이에따라, framestarted(), frameended() 만을이용하는것보다성능측면에서유리함.

Ogre::FrameListener 클래스 프레임리스너 (frame listener) 장면이화면에렌더링되기직전및직후에호출되는함수를지니고있는객체 한프레임의렌더링전후에처리해야할일을프레임리스너를통해서구현할수있다. 프레임리스너객체를생성한후, 반드시프레임리스너로등록을시켜야비로소렌더링전후에호출이된다. 여러개의프레임리스너객체가존재할수있다.

실습 Move Professor & Ninja 캐릭터움직이기

main.cpp (1) 실습 class MainListener : public FrameListener public: MainListener(Root* root, OIS::Keyboard *keyboard) : mkeyboard(keyboard), mroot(root) mprofessornode = mroot->getscenemanager("main")->getscenenode("professor"); mninjanode = mroot->getscenemanager("main")->getscenenode("ninja"); } bool framestarted(const FrameEvent &evt) static float professorvelocity = -50.0f; if (mprofessornode->getposition().x < -200.f mprofessornode->getposition().x > 200.f) professorvelocity *= -1; mprofessornode->translate(professorvelocity * evt.timesincelastframe, 0, 0); } }; static float ninjavelocity = 100.0f; if (mninjanode->getposition().x < -400.f mninjanode->getposition().x > 400.0f) ninjavelocity *= -1; mninjanode->translate(ninjavelocity * evt.timesincelastframe, 0, 0); return true;

main.cpp (2) class LectureApp public: void go(void) mscenemgr = mroot->createscenemanager(st_generic, "main"); mcamera = mscenemgr->createcamera("main"); 실습 mesclistener =new ESCListener(mKeyboard); mroot->addframelistener(mesclistener); mmainlistener = new MainListener(mRoot, mkeyboard); mroot->addframelistener(mmainlistener); } };

실행화면

캐릭터를움직이는프레임리스너의구현 (1) class MainListener : public FrameListener FrameListener 클래스로부터상속. public: MainListener(Root* root, OIS::Keyboard *keyboard) : mkeyboard(keyboard), mroot(root) mprofessornode = mroot->getscenemanager("main")->getscenenode("professor"); mninjanode = mroot->getscenemanager("main")->getscenenode("ninja"); } mscenemgr = mroot->createscenemanager(st_generic, "main"); mcamera = mscenemgr->createcamera("main");

FrameListener 멤버함수 Public Member Functions virtual bool framestarted (const FrameEvent &evt) Called when a frame is about to begin rendering. virtual bool framerenderingqueued(const FrameEvent &evt) Called after all render targets have had their rendering commands issued, but before the render windows have been asked to flip their buffers over virtual bool frameended (const FrameEvent &evt) Called just after a frame has been rendered. virtual ~FrameListener () struct FrameEvent Real timesincelastevent; Real timesincelastframe; };

캐릭터를움직이는프레임리스너의구현 (2) bool framestarted(const FrameEvent &evt) static float professorvelocity = -50.0f; if (mprofessornode->getposition().x < -200.f mprofessornode->getposition().x > 200.f) professorvelocity *= -1; mprofessornode->translate(professorvelocity * evt.timesincelastframe, 0, 0); static float ninjavelocity = 100.0f; if (mninjanode->getposition().x < -400.f mninjanode->getposition().x > 400.0f) ninjavelocity *= -1; mninjanode->translate(ninjavelocity * evt.timesincelastframe, 0, 0); } return true;

프레임리스너의생성및등록 class LectureApp void go(void) mesclistener = new ESCListener(mKeyboard); mroot->addframelistener(mesclistener); 프레임리스너를생성. mmainlistener = new MainListener(mRoot, mkeyboard); mroot->addframelistener(mmainlistener); mroot->startrendering(); }; 프레임리스너를등록. 렌더링루프에서프레임리스너를계속호출하게됨.

실습 Move with Key 방향키로캐릭터움직이기

main.cpp professornode 처리부변경 class MainListener : public FrameListener 실습 bool framestarted(const FrameEvent &evt) static float professorvelocity = 50.0f; if (mkeyboard->iskeydown(ois::kc_left)) mprofessornode->translate(-professorvelocity * evt.timesincelastframe, 0, 0); else if (mkeyboard->iskeydown(ois::kc_right)) mprofessornode->translate(professorvelocity * evt.timesincelastframe, 0, 0); } };

실행화면 좌우키이로앞의캐릭터를좌우이동할수있음.

OIS InputManager 의생성및키보드입력장치등록 class LectureApp void go(void) 윈도우핸들러획득 size_t hwnd = 0; mwindow->getcustomattribute("window", &hwnd); InputManager 생성 minputmanager = OIS::InputManager::createInputSystem(hWnd); mkeyboard = static_cast<ois::keyboard*> (minputmanager->createinputobject(ois::oiskeyboard, false)); } }; 키보드입력장치의생성 무버퍼입력

ESC 처리프레임리스너의구현 class ESCListener : public FrameListener OIS::Keyboard *mkeyboard; public: ESCListener(OIS::Keyboard *keyboard) : mkeyboard(keyboard) } bool framestarted(const FrameEvent &evt) mkeyboard->capture(); } }; return!mkeyboard->iskeydown(ois::kc_escape);

방향키입력에따른이동속도방향조정 bool framestarted(const FrameEvent &evt) static float professorvelocity = 50.0f; if (mkeyboard->iskeydown(ois::kc_left)) mprofessornode->translate(-professorvelocity * evt.timesincelastframe, 0, 0); else if (mkeyboard->iskeydown(ois::kc_right)) mprofessornode->translate(professorvelocity * evt.timesincelastframe, 0, 0); }

학습정리 게임루프의구성 초기화, 게임로직, 렌더링, 종료프로세스로구성. 게임로직과렌더링이무한반복. 프레임리스너 오우거엔짂의렌더링프로세스전후에실행됨. 게임로직을구현해넣을수있는곳. 일정한속도의캐릭터이동 프레임타임을이용하여, 캐릭터의이동속도를설정함. OIS 입력시스템 키보드및마우스입력처리가능. 프레임리스너내에서입력처리함으로써사용자의입력을게임로직과연결시킬수있음.