본문 바로가기
프로그래밍

헬로 월드! in XNA

by 건우아빠유리남편 2009. 7. 9.
반응형

 

지난시간(Hello World)에 이어 이번에는 헬로 월드!를 출력하는 프로그램을 만들어 보겠습니다.

 

 

XNA로 영어가 아닌 언어를 출력하기 위해서는 몇가지 조정이 필요합니다.

 

XNA 어플리케이션에서 이용하는 한국어 문자 지정

 

XNA어플리케이션에서 문자열을 표시하기 위해서는 XNA어플리케이션에 이용할 문자를 추가해야만 합니다.

ASCII문자는 폰트정의 파일 (*.spritefont) <CharacterRegions>에 지정합니다.

한국어문자는 message.txt에 기술하여 프로젝트에 추가합니다.

1.     “Kor_hello”라는 이름의 프로젝트를 작성한다.

2.     솔루션탐색기의 프로젝트이름을 우 클릭한 후, 팝업의 추가->새로운 항목을 선택하여 Sprite Font SpriteFont1.spritefont라는 이름으로 추가한다. FontName“MS UI Gothic”으로 한다.

3.     솔루션탐색기의 프로젝트 명을 우 클릭한 후, 팝업의 추가->새로운 항목을 선택하여 textfile“message.txt”라는 이름으로 추가한다.

4.     “message.txt”에 이용할 문자를 기술한다. 문자코드의 지정은 Visual Studio의 메뉴에서 파일->세이브옵션의 세부설정에서 Unicode(UTF8 signature(BOM)없음)을 선택한다.

 

 

컨텐트 프로세서의 프로젝트 생성

 

message.txt에 기술되어있는 한국어문자를 컨텐트로서 XNA어플리케이션에 추가하는 컨텐트프로세서를 생성합니다.

컨텐트 파이프라인은 빌드 처리의 일부이므로, 게임용 프로젝트 “Kor_hello”와는 별개로 할 필요가 있습니다.

 

1.     솔루션탐색기의 솔루션이름을 우 클릭하여, 팝업에서 추가 -> 새로운 프로젝트를 선택하여
“Windows Game Library”
“FontProcessors”라는 이름으로 추가한다.

2.     프로젝트 “FontProcessors”의 참조설정을 우 클릭하여 참조추가를 선택하여
Microsoft.Xna.Framework.Content.Pipeline
을 추가한다.

3.     디폴트에서 추가된 Class1.cs의 이름을 “MyFontProcessor”로 변경하여 다음과 같이 편집
한다.

 

MyFontProcessor.cs

using System;

using System.Collections.Generic;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Storage;

using Microsoft.Xna.Framework.Content;

using System.IO;

using Microsoft.Xna.Framework.Content.Pipeline;

using Microsoft.Xna.Framework.Content.Pipeline.Graphics;

using Microsoft.Xna.Framework.Content.Pipeline.Processors;

 

[ContentProcessor]

public class MyFontProcessor : FontDescriptionProcessor {

    public override SpriteFontContent Process(FontDescription input,

        ContentProcessorContext context) {

        //파일 읽어오기

        string fullPath = Path.GetFullPath("message.txt");

        context.AddDependency(fullPath);

        string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8);

 

        //폰트추가

        foreach (char c in letters) {

            input.Characters.Add(c);

        }

        return base.Process(input, context);

    }

}

 

4.     솔루션탐색기의 프로젝트 “FontProcessors”의 프로젝트 이름을 우 클릭하여 팝업에서 빌드를 선택한다.

  

컨텐츠프로세서와 폰트정의파일을 이어주기

 

1.     솔루션탐색기의 프로젝트 “Kor_hello”의 프로젝트 이름을 우 클릭하여 속성(property)를 선택한다.

     Content Pipeline탭을 선택하여 FontProcessors.dll을 추가한다. (아까 컴파일할때 생긴겁니다.)

2.     솔루션탐색기에서 솔루션이름을 우 클릭하여 project Dependencies를 선택하여 콤보박스에서 “Kor_hello”를 선택하여 체크박스의 FontProcessors를 체크한다. 이것으로 “Kor_hello” FontProcessors의 영향을 받도록 지정된다.

3.     폰트정의파일(SpriteFont1.spritefont)를 선택하여, property Content Processor Font Description-XNA Framework로부터 MyFontProcessor로 변경한다.

 

 

 

소스코드의 편집

Game1.cs를 편집

Game1.cs

using System;

using System.Collections.Generic;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Storage;

 

//한국어를 표시한다.

namespace Kor_hello {

    public class Game1 : Microsoft.Xna.Framework.Game {

        private GraphicsDeviceManager graphics;

        private ContentManager        content;  

        private SpriteBatch           spBatch;

        private SpriteFont            font;   

 

        //Constructor

        public Game1() {

            graphics = new GraphicsDeviceManager(this);

            content = new ContentManager(Services);

        }

 

        //초기화

        protected override void Initialize() {

            base.Initialize();

        }

 

        //그래픽스 컨텐츠 읽어오기

        protected override void LoadGraphicsContent(bool loadAllContent) {

            if (loadAllContent) {

                spBatch = new SpriteBatch(graphics.GraphicsDevice);

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

            }

        }

 

        //그래픽스 컨텐츠 놓아주기

        protected override void UnloadGraphicsContent(bool unloadAllContent) {

            if (unloadAllContent == true) {

                content.Unload();

            }

        }

 

        //그리기

        protected override void Draw(GameTime gameTime) {

            //배경색 지정

            graphics.GraphicsDevice.Clear(Color.White);

 

            //텍스트 그리기

            spBatch.Begin();

            Vector2 pos = new Vector2(10, 10);

            spBatch.DrawString(font, "헬로 월드, 헬로 XNA!", pos, Color.Aquamarine);

            spBatch.End();

 

            //base그리기

            base.Draw(gameTime);

        }

    }

}

 

자아.. 이제 컴파일을 하면 헬로 월드 ㄱㄱ..

 

그런데 보시면 아시겠지만, message.txt파일에서는 영어가 아닌 언어를 표시하기 위해 해당 언어를 읽어오도록 하는것이 목적인데요

그렇다면 이런 도전도 가능하겠지요..

 

 


반응형

'프로그래밍' 카테고리의 다른 글

이미지에 애니메이션 붙이기  (0) 2009.07.09
이미지 파일 읽어오기  (0) 2009.07.09
XNA의 컨텐츠와 파이프라인  (0) 2009.07.09
그래프의 용어  (0) 2009.05.26
수많은 예문  (0) 2009.05.13

댓글