그래픽스 프로그래밍(321190) 실습 #2

- 3D graphics & hierarchical transformation & mouse picking

(321190)

강사: 박경신

2009년 4월 28일

제출 방법: 2009년 5월 18일(월) 밤12시까지

(e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 “학번이름_숙제2.zip”으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 .cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더를 담기 바랍니다.)

참고자료: monster_shooter_starter.zip

0. Display window 크기는 600 x 600로 한다.

1. Simple Monster Shooter 게임을 만든다. (30점)

-gluPerspective(60, 1, 0.1, 1000)를 사용한다.

-게임의 Finite State Machine을 구현한다.

-게임의 상태는 시작, 게임중, 종료로 한다.

-passivemouse

-마우스의 현재 위치를 받아서 총구 (Crosshair)를 그리는데 사용된다.

-mouse

-‘게임 시작’ 상태에서 왼쪽 마우스 버튼을 누르면, 게임 플레이가 시작된다.

-‘게임 종료’ 상태에서 왼쪽 마우스 버튼을 누르면, 게임을 다시 플레이할 수 있다.

-‘게임 중’ 상태에서 왼쪽 마우스 버튼을 누르면, Selection Mode Picking 기법을

이용하여 괴물 (Monster)을 맞혔는지 확인하고, 맞혔으면 맞힌횟수 (Kill)을

증가시키고 해당 괴물을 리스트에서 지우고 1개당 100점씩 점수를 높여준다.

-만약, 왼쪽 마우스 버튼을 눌러서 충돌하지 않았을 경우, 빗맞힌 횟수(Miss)가

증가된다.

-만약, 왼쪽 마우스 버튼을 눌러서 빗맞힌 횟수(Miss)가 10번을 넘었을 경우,

게임은 ‘종료 (GAME OVER)’된다.

-display

-게임의 상태에 따라서, ‘게임 시작 시’에는 'Press Left Mouse Button to Start'

메시지를 화면에 출력한다.

-‘게임 중’에는 3차원 게임 환경을 그리고 움직이는 괴물(Monster)를 그린다. 또한

현재 Text 클래스를 사용하여 화면에 현재 점수 (Score), 레벨 (Level), 빗맞힌

횟수(Miss)를 출력한다.

-‘게임 종료’되면 ‘Game Over' 메시지를 알리고 점수 (예시: ‘Your Score is

1000')와 ’Press Left Mouse Button to Restart'와 ‘Press ESC-Key to Quit'

메시지를 화면에 출력한다.

-update

-‘게임 중’에는 레벨에 따라서 움직이는 괴물 (Monster)들이 계속 나타난다.

2. Monster, MonsterShooter 클래스를 작성한다. (20점)

-Monster

-x,y,z 괴물의 위치 (glTranslatef에서 사용)

-size 괴물의 크기 (glScalef에서 사용)

-angle 괴물의 회전양 (glRotatef에서 사용)

-direction 괴물의 움직임 방향 (0-왼쪽에서 오른쪽, 1-오른쪽에서 왼쪽,

2-위에서 아래로, 3-아래에서 위로 움직임)

-spin 괴물의 회전 방향 (0-회전없음, 1-시계방향, 2-반시계방향)

-type 괴물의 종류 (0-A, 1-B, 2-C, 3-D)

-draw()에서는 hierarchical transformation을 사용하여 4가지 종류의 괴물을

구성하도록 하고, 괴물의 종류에 따라서 화면에 출력한다.

-MonsterShooter

-MonsterShooter() 생성자에서는 괴물이 무작위적으로 배치될 x, y, z 위치와

크기(size)의 범위를 지정한다. 그 외에 초기화에 필요한 변수를 지정한다.

-add(Monster *m), erase(int id), eraseAll(), deadAll()는 monsterList에 새 괴물

추가하기, ID를 이용하여 해당 괴물 지우기, 모든 괴물 지우기, 모든 괴물이

죽었는지 확인하기이다.

-reset()에서는 리스트를 지우고 게임 수명(life)과 레벨을 초기화하고 launch 한다.

-launch()에서는 레벨이 증가하면 동시에 나타나는 괴물의 개수가 같이 증가한다.

(레벨1에서는 괴물이 1개 나타나고, 레벨2에서는 괴물이 2개 나타나고..)

새로운 괴물은 무작위적인 위치(x, y, z)와 크기(size), 그리고 4가지 중의 하나의

방향(direction)에 따라서 spin과 시작 위치를 달리 해준다.

direction = 0일 경우, spin = 1이고 x = xmin

direction = 1일 경우, spin = 2이고 x = xmax

direction = 2일 경우, spin = 1이고 y = ymax

direction = 3일 경우, spin = 0이고 y = ymin

-update()에서는 시간이 증가되면 게임 수명(life)을 증가시키고 maxLife을

넘어가면 레벨에 따라서 새로운 괴물을 추가한다. 그 외의 다른 경우는 리스트의

모든 괴물에 위치, 회전 등이 정해진 방향으로 움직인다.

direction = 0일 경우, x를 오른쪽으로

direction = 1일 경우, x를 왼쪽으로

direction = 2일 경우, y를 아래쪽으로

direction = 3일 경우, y를 위쪽으로 증가 & y > ymin 이면, direction = 2

-draw(GLenum mode)에서는 GL_SELECT 모드이면 glLoadName을 부르고

모든 괴물을 그린다. GL_RENDER 모드이면 그냥 그린다.

-processHits(..)에서는 selection list 버퍼에서 하나의 객체 ID를 선택한다.

-pick(..)에서는 selection list 버퍼를 생성하고 gluPickMatrix()와

draw(GL_SELECT)를 부르고 난 후 다시 일반 렌더모드로 돌려서 processHits를

부르면, hit된 객체의 ID를 돌려받는다.

3. Crosshair 클래스를 작성한다. (10점)

-x, y, z 총구(Crosshair)의 위치

-draw() 함수에서는 ortho projection으로 마우스의 위치에 총구 (crosshair)를 그린다. (참고 http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho)

4. 추가적인 클래스를 작성하여, 집과 나무가 있는 MonsterTown을 구성한다. (10점)

-집과 나무에 괴물이 충돌하지 않도록, 최대한 지면 사각형의 바깥쪽에 배치한다.

5. 창의성, 소스코드 주석처리, 리포트 (30점)

6. 사운드 추가 (extra 10점)