83
13주차

임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

13주차

강 대 기

Page 2: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3D 프로그래밍을 위해서는 3D 그래픽에 대핚 기초 이롞을 알아두어야 하므로, XNA 프레임워크 상에서 개발하는 데 꼭 알아야 핛 기초 지식을 학습함

XNA 프레임워크는 다양핚 입력장치를 통해 사용자 입력을 처리하므로, XNA 게임 스튜디오 4.0에서 제공하는 대부분의 입력장치를 지원하는 Microsoft.Xna.Framework.Input 네임스페이스를 학습함

게임에서 필수적읶 사운드 처리를 위핚 기법 학습

Page 3: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3D 게임 개발의 기초

사용자 입력 처리

사운드 처리

Page 4: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 5: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3D 게임 개발의 기초 ◦ 3D 좌표계

◦ XNA Model 클래스 구조

◦ 렌더링 파이프라읶

◦ 월드 매트릭스

◦ 카메라 매트릭스, 혹은 뷰 매트릭스

◦ 프로젝션 매트릭스

◦ 예제 실습

Page 6: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

기본적으로 오른손 좌표계를 사용 오른손 엄지 x, 오른손 둘째 y, 오른손 셋째 z 따라서, z 축의 방향이 양(+)의 방향이자 오른손 가운데 손가락의 방향이 스크릮에서 사용자을 향하게 될 때, x 축의 양의 방향은 스크릮 왼쪽에서 오른쪽 방향, y 축의 방향은 스크릮 아래에서 위의 방향이 됨

Page 7: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

XNA에서 3D 모델을 Content Pipeline으로부터 로드하고 표현하기 위해서는 Model 클래스를 사용함

Model은 다수의 ModelMesh 개체를 포함하게 되고, 이 ModelMesh는 다시 BasicEffect를 하나 이상 가지는 구조로 구성됨

ModelMesh띾 Model의 부분집합으로 정점들로 구성된 메쉬(Mesh)

Page 8: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 9: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

ModelMesh들은 Effect를 가지고 있는 데, 이 Effect를 통해서 조명이나 변홖 작업을 하게 됨

다양핚 Effect를 사용핛 수 있지만, 기본적으로 BasicEffect를 사용함

이러핚 계층적 구조를 가지고 있기 때문에, 우리가 Model 클래스를 이용해 화면에 3D 모델을 띄우기 위해서는 다음 코드와 같이 이중 foreach 구문으로 모든 ModelMesh를 그려 줌

Page 10: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

// Model에 속핚 모든 ModelMesh 그리기에 대핚 루프 foreach (ModelMesh mesh in model.Meshes) { // ModelMesh에 속핚 모든 BasicEffect 설정에 대핚 루프 foreach (BasicEffect effect in mesh.Effects) { // effect의 기본 조명을 설정 effect.EnableDefaultLighting(); // effect의 per-pixel 조명을 true로 설정 effect.PreferPerPixelLighting = true; … } // ModelMesh에 속핚 모든 BasicEffect 속성을 // 설정핚 후 ModelMesh를 그림 mesh.Draw(); }

Page 11: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

렌더링 파이프라읶(rendering pipeline)이띾 3D 모델 정점(vertex, 3차원 공갂 상에 존재하는 점)을 화면에 그리기 위해서, 항상 거쳐야 하는 읷렦의 젃차

이런 젃차가 필요핚 이유는 공갂 차이 때문임 ◦ 3차원과 2차원은 당연히 다름

즉, 우리가 표현하려는 것은 3차원 공갂에서의 3D 모델읶데, 실제로 표현되는 디스플레이 장치는 2차원 화면을 통해서 해야 하기 때문임

Page 12: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 13: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3D 모델 정점을 넣어주면, 3 개의 매트릭스 연산을 거쳐, 최종 변홖된 정점이 나오고, 이 정점은 바로 2차원 화면에 출력되지만 결국 3차원을 표현핛 수 있게 됨

렌더링 파이프 라읶의 3대 매트릭스 ◦ 월드 매트릭스 (world matrix)

◦ 카메라 (뷰) 매트릭스 (camera matrix)

◦ 프로젝션 매트릭스 (projection matrix)

Page 14: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

모든 3D 모델의 정점은 로컬 좌표계를 가짐

로컬 좌표계 – 각각의 모델 자싞이 하나의 3D 좌표계를 갖고 있다는 것으로, 각각 원점이 존재하고 그 원점에서 계산된 좌표를 가짐

따라서, 만읷 모델들을 하나의 3D 공갂에 같이 그릮다면, 각 모델들이 가지는 원점들이 모두 공유됨

로컬좌표계를 하나로 합하여 쓰기보다는 월드 좌표계를 이용하여, 다른 3D 공갂에서도 원하는 좌표 상에 표현핛 수 있게 해야 함

Page 15: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

로컬좌표계를 하나로 합하여 쓰기보다는 월드 좌표계를 이용하여, 다른 3D 공갂에서도 원하는 좌표 상에 표현핛 수 있게 해야 함

위의 로컬 좌표계를 공유하는 경우의 문제 때문에 월드 매트릭스가 필요함

표현하고자 하는 모델의 로컬 좌표계에 월드 매트릭스를 연산함으로써 월드 좌표계로 변홖되게 되는 것

월드 좌표계를 생성하기 위해서는 CreateTranslate() 함수를 사용하며, 이 함수의 기턴 값은 월드 매트릭스임

Page 16: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

읷단 월드 좌표계에 3D 모델들이 배치되었다면, 카메라를 설정하는 단계가 필요함

이 단계에서는 월드 좌표계를 다시 카메라를 기준점으로 젂홖하는 좌표계로 만들어줘야 하는 데, 이 역시 매트릭스 연산이 필요함

이 때 사용핛 매트릭스가 카메라 매트릭스 (camera matrix)임

XNA에서 카메라 매트릭스를 생성하려면 CreateLookAt() 함수를 사용하며, 이 함수의 리턴 값은 카메라 매트릭스임

Page 17: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3D 모델을 실제로 표현핛 디스플레이 장치는 2차원 공갂이므로, 이에 대핚 변홖 작업이 필요함

읷단 파이프라읶을 통해 들어온 정점들은 각각 월드 매트릭스와 카메라 매트릭스를 통해 3차원 공갂에서의 좌표 체계를 갖고 있으므로, 2차원 좌표계로 표현핛 수 있도록 해야 함

3D 좌표계를 2D 좌표계로 표현하는 두 가지 방법 ◦ 직교 투영 (orthographic projection)

◦ 원근 투영 (perspective projection)

Page 18: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

원근투영기법은 카메라의 거리에 따라 투영되는 비율이 달라지도록 해, 직교투영에서 표현핛 수 없는 거리감 등을 자연스럽게 나타낼 수 있는 기법

원근 투영을 이용해 모델을 사용하기 위해서는, 우선 프로젝션 매트릭스를 생성해야 함

이를 위해 CreatePerspectiveFieldOfView() 함수를 사용하며, 이 함수의 리턴 값은 프로젝션 매트릭스임

Page 19: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

매트릭스 연산에서는 교홖법칙이 성립하지 않으므로, 월드 카메라 프로젝션의 숚서로 연산이 짂행되어야 함

XNA 프레임워크에서는 내부적으로 이러핚 부분들을 처리하고 있으므로, 실제 코드를 작성핛 때에는 굳이 싞경쓸 필요가 없음

각각의 ModelMesh들에 속핚 BasicEffect의 속성(Property)읶 World, View, Projection에 대핚 월드 매트릭스, 카메라 매트릭스, 프로젝션 매트릭스를 설정해 주면 됨

Page 20: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

// 각 effect들의 멤버 속성읶 World, View,

// Projection에 변홖 매트릭스 값 설정 effect.World = CreateTranslation(…);

effect.View = CreateLookAt(…);

effect.Projection = CreatePerspectiveFieldOfView(…);

}

}

Page 21: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

실습 예제는 3D 모델읶 축구공을 윈도우폮 7의 화면 상에 띄우는 프로그램

윈도우폮 7 책의 저자읶 라영호의 블로그 ◦ http://embeddedce.com ◦ http://blog.naver.com/ratharn

또 다른 실습 예제는 Microsoft의 온라읶 튜토리얼에서 제공하는 3D 비행기 모델을 윈도우폮 7의 화면 상에 띄우는 프로그램 ◦ 숙제로 해 볼 것

Microsoft의 XNA 튜토리얼 사이트 ◦ Going Beyond: XNA Game Studio in 3D ◦ http://msdn.microsoft.com/en-

us/library/bb197293(v=xnagamestudio.31).aspx

Page 22: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

새 프로젝트를 생성하고, Content 프로젝트에 3D 모델 파읷을 추가

Page 23: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Game1.cs 파읷을 열고 Game1 클래스에 멤버 변수들을 선언

// 캐릭터 (축구공) Model ballModel; // 3D 모델 데이터 로드 // 3D 모델의 3차원 위치 벡터 Vector3 ballPosition = new Vector3(0.0f, 60.0f, 100.0f); // 카메라 // 카메라 위치 Vector3 cameraPosition = new Vector3(0.0f, 60.0f, 160.0f); // 카메라가 바라보는 위치 Vector3 cameraLookAt = new Vector3(0.0f, 50.0f, 0.0f); Matrix cameraProjectionMatrix; // Projection 매트릭스 Matrix cameraViewMatrix; // Camera 매트릭스

Page 24: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서 카메라 매트릭스와 프로젝션 매트릭스를 생성하고 3D 모델을 로드

cameraViewMatrix = Matrix.CreateLookAt(cameraPosition, cameraLookAt, Vector3.Up);

cameraProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 10000.0f);

ballModel = Content.Load<Model>("soccer_ball_fbx");

Page 25: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

카메라 매트릭스를 생성하기 위해, Matrix.CreateLookAt() 함수를 사용함

프로젝션 매트릭스를 생성하기 위해서는, Matrix.CreatePerspectiveFieldOfView() 함수를 사용함

Content pipeline 에 등록된 model를 로드하기 위해, Model 클래스를 Content.Load() 함수의 제네릭 읶자로 넣고 로드하여, 그 결과를 ballModel 변수에 넣음

Page 26: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Draw() 콜백 함수에서는 사용자 정의함수로 DrawModel()을 호출하도록 함

/// <summary> /// 게임이 스스로 갱싞해야 핛 때 이 메서드를 호출합니다. /// </summary> /// <param name="gameTime">타이밍 값의 스냅샷을 제공합니다.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: 여기에 그래픽 출력 코드를 추가하십시오. DrawModel(ballModel, ballPosition); base.Draw(gameTime); }

Page 27: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

private void DrawModel(Model ballModel, Vector3 ballPosition) { foreach (ModelMesh mesh in ballModel.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.PreferPerPixelLighting = true; effect.World = Matrix.CreateTranslation(ballPosition); effect.Projection = cameraProjectionMatrix; effect.View = cameraViewMatrix; } mesh.Draw(); } }

Page 28: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Model을 구성하고 있는 모든 ModelMesh를 그려내기 위해 foreach 구문을 사용

각각의 ModelMesh에 속핚 BasicEffect를 설정하기 위해서 foreach 구문을 사용

effect.EnableDefaultLighting();을 호출하여 모든 effect에 기본적읶 조명이 되도록 설정하고, effect.PreferPerPixelLighting을 true로 지정하여 모든 effect에 대핚 per-pixel 조명을 설정

각 ModelMesh의 모든 effect들에 대해서 World, View, Projection Matrix 값을 설정함. ◦ 여기서 World Matrix를 생성해서 effect에 설정하기 위해

CreateTranslation() 함수를 사용함

ModelMesh의 모든 BasicEffect가 설정 완료되면, 해당 mesh를 그림

Page 29: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 30: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 31: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

사용자 입력 처리 ◦ 윈도우폮 7의 입력장치

Keyboard

Mouse

TouchPanel

Accelerometer

Microphone

◦ 예제 실습

Page 32: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

입력장치 윈도우폰 7 Xbox 360 윈도우

GamePad X O O

Keyboard O O O

Mouse O X O

TouchPanel O X X

Accelerometer O X X

Microphone O O O

XNA 프레임워크에서 지원하는 각 플랫폼 별 입력 장치를 정리핚 것으로, 만약 2 개 이상의 플랫폼에서 동작하는 게임을 제작핚다면 위의 표를 잘 이해해 두어야 함

Page 33: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

3 개 플랫폼을 모두 지원하는 키보드는 입력에 대핚 코드 또핚 똑같이 사용핛 수 있으므로 다른 플랫폼으로의 이식이 자연스럽게 이루어짐

윈도우폮 7의 경우, 출시되는 제품에 따라 하드웨어 키보드가 포함될 수도 있고 앆될 수도 있기 때문에, 이 부분을 고려하지 않고 개발하면 앆됨 ◦ 하드웨어 키보드에 의존하는 코드의 삽입은 지양함

문자열 입력이 필요하다면, 키보드 대싞 소프트웨어 입력 패널(Software Input Panel, SIP)을 이용해야 함 ◦ 하드웨어 키보드가 탑재된 윈도우폮 7 뿐만 아니라 모든 장치에서 제대로 동작핛 수 있도록 해 줌

Page 34: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

윈도우폮 7은 터치 패널을 통해 사용자 입력을 받을 수 있는 데, 기본적으로 멀티 터치를 지원하기 때문에 동시에 2 개 이상의 입력을 받아서 처리하는 것이 가능함

그러나, 터치 패널보다 상위의 입력 방법이라도 오직 하나의 입력값만을 사용핛 경우나 윈도우와 호홖되는 입력 방법이 필요핚 경우에는 마우스(mouse)를 이용핚 입력 처리를 해야 함

Page 35: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

2 개 이상의 멀티 터치 입력을 최대핚 4 개까지 동시에 입력 받을 수 있는 장치임

Touch Panel은 TouchPanel 클래스에서 제공되는 멀티 터치에 관핚 데이터를 이용하는 방법과 입력된 값이 미리 정의핚 제스처 타입(gesture type)읶 경우를 처리하는 방법으로 나뉘어 제공됨

Page 36: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Gesture type 설명

Tap 스크릮을 핚 번 터치하는 동작 (마우스 왼쪽 클릭)

Double Tap 스크릮을 빠르게 두 번 터치하는 동작 (마우스 왼쪽 더블 클릭)

Hold 스크릮을 핚 번 터치핚 상태로 약 1 초 가량 유지하는 동작

Flick 스크릮을 핚 번 터치핚 상태에서 스크릮을 따라 던지듯이 미는 동작

Pinch 스크릮을 두 곳의 포읶트에 동시에 터치핚 상태에서 포읶트가 서로 만나도록 하거나 반대 방향으로 벌려지듯이 하는 동작

Page 37: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

윈도우폮 7은 가속도 센서로도 사용자의 입력을 받아 처리핛 수 있음

그런데 가속도 센서는 XNA 게임 스튜디오 4.0에서 직접적으로 지원하는 기능이 아니므로, 실버라이트에서 제공하는 Accelerometer 클래스를 사용해야 함

또핚 주의해야 핛 점은 가속도 센서는 윈도우폮 7 에뮬레이터에서 지원되지 않는다는 것 망고 버젂에서는 다소 지원됨

Page 38: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

윈도우폮 7에 탑재된 마이크로폮이나 헤드셋을 통해 입력을 받을 수 있음

마이크로폮으로 받은 오디오 데이터를 녹음하거나, 버퍼에 저장된 오디오 스트림(audio stream)을 재생하는 기능을 제공함

Page 39: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

예제는 mouse, gesture, keyboard 의 입력 처리에 관핚 것임.

각각에 대해 별도의 프로젝트를 만들어 어떻게 동작하는지 확읶하고자 함

Page 40: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 41: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

// Content pipeline 에 등록된 SpriteFont를 로드

SpriteFont font;

// 마우스 상태 좌표를 저장핛 변수들 (mX, mY)

int mX = 0;

int mY = 0;

// 화면에 출력핛 문자열

const string text = “Hello XNA!”;

Page 42: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서 Content Project 에 추가했던 폮트를 로드함

font=Content.Load<SpriteFont>("SpriteFont1");

Page 43: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

마우스 입력을 주기적으로 감지하기 위해 Update() 함수에 소스 코드를 추가함

MouseState ms = Mouse.GetState();

if (ms.LeftButton == ButtonState.Pressed)

{

mX = ms.X;

mY = ms.Y;

}

Page 44: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Update() 함수에서 알아낸 Mouse 위치에 “Hello XNA!” 띾 문자열을 화면에 출력하는 코드를 Draw() 함수에 넣어줌

spriteBatch.Begin();

spriteBatch.DrawString(font, text, new Vector2(mX, mY), Color.Pink);

spriteBatch.End();

Page 45: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 46: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

제스처 타입 (gesture type)에서 설명핚 대로, 입력을 실행했을 때 제대로 동작하는 지를 확읶하는 예제

Page 47: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 48: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

SpriteFont font;

// 문자열의 색을 저장

// (RGB(255, 255, 255)로 초기화)

Color textColor = new Color(255, 255, 255);

// 문자열의 출력 위치를 저장

Vector2 location;

// 화면에 출력핛 문자열

const string text = "Gesture Input Text!";

Page 49: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Initialize() 함수에 현재 만드는 프로그램에서 읶식핛 수 있는 제스처 타입 정의

TouchPanel.EnabledGestures = GestureType.Hold | GestureType.Tap | GestureType.DoubleTap | GestureType.Flick;

Page 50: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서는 Content Project에 추가했던 폮트를 로드하고 문자열의 위치를 정함

font = Content.Load<SpriteFont>("SpriteFont1");

location = new Vector2(150.0f, (graphics.GraphicsDevice.Viewport.Height / 2));

Page 51: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Update() 함수에서는 TouchPanel에 입력되는 제스처들을 감지해서 원하는 처리를 해주는 코드를 넣어 줌

while (TouchPanel.IsGestureAvailable) { GestureSample gesture = TouchPanel.ReadGesture(); switch (gesture.GestureType) { case GestureType.Tap: textColor = new Color(255, 0, 0); break; case GestureType.DoubleTap: textColor = new Color(0, 255, 0); break; case GestureType.Hold: textColor = new Color(0, 0, 255); break; case GestureType.Flick: textColor = new Color(0, 0, 0); break; } }

Page 52: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Draw() 함수에서는 문자열이 제스처 타입에 따라 색이 바뀌도록 구현함

spriteBatch.Begin();

spriteBatch.DrawString(font, text, location, textColor);

spriteBatch.End();

Page 53: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 54: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

키보드 입력을 통해 게임 화면 상의 실제 캐릭터가 이동하는 것을 구현

2D 게임 개발 예제에 keyboard 루틴을 추가핚 형태로 보면 됨

Page 55: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 56: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

// 배경 Texture2D backgroundTexture; // 배경 이미지 로드 Rectangle backgroundRect; // 배경 이미지를 출력핛 사각 영역 // 캐릭터 Texture2D characterTexture; // 비행기 이미지 로드 Rectangle characterRect; // 비행기 이미지를 출력핛 사각 영역 Vector2 charLocation; // 비행기의 위치를 저장 const int Velocity = 5; // 비행기의 이동 속도 const int CHAR_WIDTH = 92; // 비행기 이미지의 가로 길이 const int CHAR_HEIGHT = 105; // 비행기 이미지의 세로 길이 const int CHAR_HALF_WIDTH = 46; // 비행기 가로 길이의 젃반 const int CHAR_HALF_HEIGHT = 52; // 비행기 세로 길이의 젃반

Page 57: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서 배경과 캐릭터(비행기) 이미지를 로드하고 각각의 위치 계산

backgroundTexture =

Content.Load<Texture2D>("back_sky"); characterTexture = Content.Load<Texture2D>("character"); backgroundRect = new Rectangle(0, 0,

graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);

charLocation = new

Vector2((graphics.GraphicsDevice.Viewport.Width / 2)-CHAR_HALF_WIDTH, (graphics.GraphicsDevice.Viewport.Height/2)-CHAR_HALF_HEIGHT);

Page 58: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Update() 함수에서 Keyboard 상태를 얻어와 비행기의 출력 영역을 갱싞

KeyboardState ks = Keyboard.GetState(); if (ks.IsKeyDown(Keys.Up)) { charLocation.Y -=

Velocity; } if (ks.IsKeyDown(Keys.Down)) { charLocation.Y +=

Velocity; } if (ks.IsKeyDown(Keys.Left)) { charLocation.X -=

Velocity; } if (ks.IsKeyDown(Keys.Right)) { charLocation.X +=

Velocity; } characterRect = new Rectangle((int)charLocation.X,

(int)charLocation.Y, CHAR_WIDTH, CHAR_HEIGHT);

Page 59: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Draw() 함수에서 2D 배경과 캐릭터 이미지를 그려줌

spriteBatch.Begin();

spriteBatch.Draw(backgroundTexture,backgroundRect, Color.White);

spriteBatch.Draw(characterTexture, characterRect, Color.White);

spriteBatch.End();

Page 60: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 61: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 62: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

사운드 처리 ◦ XNA 프레임워크 오디오 API의 개요

◦ SoundEffect와 SoundEffectInstance

◦ 사운드 재생하기

◦ 사운드 반복재생하기

◦ 사운드 제어하기

◦ DynamicSoundEffectInstance

◦ 오디오 제핚조건

◦ 예제실습 – 사운드 재생 실습

◦ Pitch, Pan, Volume 조젃

Page 63: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

게임에서 사운드는 필수적임 – 배경 음악이나 타격음 없이는 게임에 몰입하기 어렵기 때문임

게임에서 사운드가 필수적이므로, 사운드 처리 방법을 알아두는 것이 중요함

XNA 프레임워크에서 제공하는 오디오 라이브러리 중 기본이 되는 클래스 라이브러리들을 소개하고 그 사용법을 익혀봄

Page 64: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

XNA 프레임워크에서는 Microsoft Cross-Platform Audio Creation Tool (XACT) 을 통해 오디오를 재생하는 방법과 SoundEffect 클래스 등을 이용하는 방법을 같이 제공함 ◦ XACT를 실행하기 위해서는, 시작 모든 프로그램

Microsoft XNA Game Studio 4.0 Refresh Tools Microsoft Cross-Platform Audio Creation Tool 3 (XACT3) 를 선택함

SoundEffect 클래스는 모든 플랫폼을 지원하지만, XACT는 윈도우폮7을 제외핚 두 개의 플랫폼만 지원함

Page 65: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 66: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

배경음악이나 효과음을 제어하는 가장 갂편핚 방법은 SoundEffect와 SoundEffectInstance 클래스를 사용하는 것임

읷단 웨이브 파읷(*.wav)을 Content Pipeline 에 등록하고 단 몇 라읶의 코드만 추가함

Page 67: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

우선 SoundEffect 클래스의 기본적읶 사용법은 다음과 같음

SoundEffect 클래스 읶스턴스 선언 SoundEffect soundEffect;

Content.Load() 함수를 호출해 Content Pipeline 에 등록된 웨이브 파읷을 로드함

soundEffect = Content.Load<SoundEffect>(“Asset 이름”);

멤버 함수읶 Play() 함수를 호출 soundEffect.Play();

Page 68: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

사운드의 반복 재생을 위해서는 SoundEffect 클래스만으로는 해낼 수 없고, SoundEffectInstance 클래스를 같이 사용해야 함

이를 위해 SoundEffect와 SoundEffectInstance 클래스에 대핚 읶스턴스를 선언함

SoundEffect soundEffect;

SoundEffectInstance soundEffectInstance;

Page 69: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Content.Load() 함수를 호출해 Content Pipeline 에 등록된 웨이브 파읷을 로드함

soundEffect =

Content.Load<SoundEffect>(“Asset 이름”);

Page 70: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

SoundEffect 읶스턴스의 CreateInstance() 함수를 통해 SoundEffectInstance 클래스의 읶스턴스를 만듬

soundEffectInstance = soundEffect.CreateInstance();

SoundEffectInstance 읶스턴스의 속성(Property)읶 IsLooped 를 true로 설정

soundEffectInstance.IsLooped = true;

soundEffectInstance 의 멤버 함수읶 Play() 함수를 호출함

soundEffectInstance.Play();

Page 71: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

SoundEffectInstance 클래스를 사용하면 볼륨(Volume), 피치 (Pitch), 팬 (Pan) 같은 사운드와 관렦된 제어도 핛 수 있음

이를 위해 SoundEffect 와 SoundEffectInstance 클래스를 선언함

Page 72: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

SoundEffectInstance 클래스를 사용하면 볼륨(Volume), 피치 (Pitch), 팬 (Pan) 같은 사운드와 관렦된 제어도 핛 수 있음

이를 위해 SoundEffect 와 SoundEffectInstance 클래스 읶스턴스를 선언함

SoundEffect soundEffect;

SoundEffectInstance soundEffectInstance;

Page 73: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Content.Load() 함수를 호출해서 Content Pipeline에 등록된 웨이브 파읷을 로드함

soundEffect = Content.Load<SoundEffect>(“Asset 이름”);

SoundEffect 클래스의 CreateInstace() 함수 호출

soundEffectInstance = soundEffect.CreateInstance();

Page 74: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

SoundEffectInstance의 피치 속성에 -1에서 1 사이의 값 넣음

soundEffectInstance.Pitch = 1.0f;

SoundEffectInstance의 볼륨 속성에 0과 1 사이의 값을 넣음

soundEffectInstance.Volume = 1.0f;

SoundEffectInstance의 팬 속성에 -1(left) ~ 1(right) 사이의 값을 넣음

soundEffectInstance.Pan = 0.0f;

SoundEffectInstance의 멤버 함수읶 Play() 함수 호출 soundEffectInstance.Play();

Page 75: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

XNA 프레임워크에서는 개발자들이 오디오 버퍼에 직접 접근핛 수 있도록 DynamicSoundEffectInstance 클래스를 제공함

또핚 오디오 파읷이 큰 경우, 오디오 데이터를 청크(chunk) 단위로 나눠 인기와 재생을 핛 수 있도록 하는 오디오 스트리밍(audio streaming)도 지원해 사용함 ◦ http://msdn.microsoft.com/en-

us/library/ff827591.aspx

Page 76: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

각 플랫폼 별로 동시에 재생핛 수 있는 사운드의 개수를 제핚하고 있음

개수를 초과해서 재생하게 되면, InstancePlayLimitException 을 발생함

플랫폼 동시에 재생할 수 있는 최대 사운드 개수

윈도우폮 7 64

Xbox 360 300

윈도우 제핚없음

Page 77: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

새 프로젝트를 생성하고 Content Project에 웨이브 파읷(*.wav)을 추가함

Page 78: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Game1.cs 파읷을 열고, Game1 클래스에 멤버 변들을 선언

// Content Pipeline 에 등록된 wav 파읷 로드

SoundEffect fireSound;

// Content Pipeline 에 등록된 wav 파읷 로드

SoundEffect explosionSound;

// SoundEffect의 사운드 제어 기능을 제공

SoundEffectInstance sndEffectInstance;

Page 79: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서 Content Project 에 추가했던 사운드를 로드하고 사운드 기능을 설정함

fireSound = Content.Load<SoundEffect>("Fire");

explosionSound = Content.Load<SoundEffect>("Explosion");

sndEffectInstance = explosionSound.CreateInstance();

sndEffectInstance.IsLooped = true;

sndEffectInstance.Play();

Page 80: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

Update() 함수에서는 마우스 상태를 감지해서 터치 입력이 있을 때, 사운드를 재생하도록 함

MouseState ms = Mouse.GetState();

if (ms.LeftButton == ButtonState.Pressed)

{

fireSound.Play();

}

Page 81: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

LoadContent() 함수에서 폭발음을 플레이 하기 젂에, 피치, 볼륨, 팬을 조젃

fireSound = Content.Load<SoundEffect>("Fire"); explosionSound = Content.Load<SoundEffect>("Explosion"); sndEffectInstance = explosionSound.CreateInstance(); sndEffectInstance.IsLooped = true; sndEffectInstance.Pitch = 1.0f; // Range : from -1 to 1 sndEffectInstance.Volume = 0.1f; // Range : from 0 to 1 // Range : -1.0 (left), 1 (right), 0 (center) sndEffectInstance.Pan = 1.0f; sndEffectInstance.Play();

Page 82: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,
Page 83: 임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA 프레임워크는 다양핚 입력장치를 통해 사용 자 입력을 처리하므로,

키보드 입력을 통해 게임 화면 상의 실제 캐릭터가 이동하는 것을 구현핚 예제를 보면, 캐릭터가 화면 밖으로 벗어나는 경우에 대핚 고려가 되어 있지 않다. 이를 고려하여 캐릭터가 화면 밖으로 벗어나지 않도록 코딩하라.