임베디드 시스템 소프트웨어 - Dongseodongseo.ac.kr/~dkkang/Mobile2011Fall/W13.pdf · XNA...

Preview:

Citation preview

13주차

강 대 기

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

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

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

3D 게임 개발의 기초

사용자 입력 처리

사운드 처리

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

◦ XNA Model 클래스 구조

◦ 렌더링 파이프라읶

◦ 월드 매트릭스

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

◦ 프로젝션 매트릭스

◦ 예제 실습

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

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

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

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

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

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

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

// 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(); }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

◦ 원근 투영 (perspective projection)

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

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

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

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

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

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

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(…);

}

}

실습 예제는 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

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

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 매트릭스

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");

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

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

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

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); }

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(); } }

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를 그림

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

Keyboard

Mouse

TouchPanel

Accelerometer

Microphone

◦ 예제 실습

입력장치 윈도우폰 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 개 이상의 플랫폼에서 동작하는 게임을 제작핚다면 위의 표를 잘 이해해 두어야 함

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

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

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

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

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

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

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

Gesture type 설명

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

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

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

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

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

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

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

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

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

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

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

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

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

SpriteFont font;

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

int mX = 0;

int mY = 0;

// 화면에 출력핛 문자열

const string text = “Hello XNA!”;

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

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

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

MouseState ms = Mouse.GetState();

if (ms.LeftButton == ButtonState.Pressed)

{

mX = ms.X;

mY = ms.Y;

}

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

spriteBatch.Begin();

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

spriteBatch.End();

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

SpriteFont font;

// 문자열의 색을 저장

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

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

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

Vector2 location;

// 화면에 출력핛 문자열

const string text = "Gesture Input Text!";

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

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

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

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

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

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; } }

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

spriteBatch.Begin();

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

spriteBatch.End();

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

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

// 배경 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; // 비행기 세로 길이의 젃반

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);

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);

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

spriteBatch.Begin();

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

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

spriteBatch.End();

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

◦ SoundEffect와 SoundEffectInstance

◦ 사운드 재생하기

◦ 사운드 반복재생하기

◦ 사운드 제어하기

◦ DynamicSoundEffectInstance

◦ 오디오 제핚조건

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

◦ Pitch, Pan, Volume 조젃

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

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

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을 제외핚 두 개의 플랫폼만 지원함

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

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

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

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

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

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

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

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

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

SoundEffect soundEffect;

SoundEffectInstance soundEffectInstance;

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

soundEffect =

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

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

soundEffectInstance = soundEffect.CreateInstance();

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

soundEffectInstance.IsLooped = true;

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

soundEffectInstance.Play();

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

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

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

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

SoundEffect soundEffect;

SoundEffectInstance soundEffectInstance;

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

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

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

soundEffectInstance = soundEffect.CreateInstance();

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();

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

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

us/library/ff827591.aspx

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

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

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

윈도우폮 7 64

Xbox 360 300

윈도우 제핚없음

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

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

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

SoundEffect fireSound;

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

SoundEffect explosionSound;

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

SoundEffectInstance sndEffectInstance;

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

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

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

sndEffectInstance = explosionSound.CreateInstance();

sndEffectInstance.IsLooped = true;

sndEffectInstance.Play();

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

MouseState ms = Mouse.GetState();

if (ms.LeftButton == ButtonState.Pressed)

{

fireSound.Play();

}

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();

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

Recommended