monogame 튜토리얼 네번째는

스크린에 문자열을 그립니다.

 

보통 콘솔 앱에서는 문자열을 스크린에

출력하는 것에 대해 신경쓸일이 없습니다.

왜냐하면 콘솔앱은 모니터 스크린이

standard output (표준출력)으로

설정되어 있습니다. 너무나 당연하게

사용하던 거라 그게 무슨 차이인지

느끼지 못할 수가 있습니다.

 

윈도우에서는 명령프롬프트(cmd)가

콘솔의 표준출력을 합니다.

파워셸(Powershell)도 비슷하고

리눅스의 Bash 같은 셸도 표준출력입니다.

 

터미널, 콘솔, 명령프롬프트, 셸 등

여러가지 용어를 혼용합니다.

같은 개념을 상황에 따라 다르게

부르기 때문에 혼동스럽습니다만,

일반 앱 프로그램을 할 때는 이들을

싸잡아서 CLI(Command Line Interface)

라고 불러도 됩니다.

 

Standard Output(표준 출력) 은 운영체제가

입출력시스템을 관리하기 위해 사용하는

추상적인 도구입니다. 표준출력이 꼭

모니터일 필요는 없지만 C#을 시작할 때

배우는 System.Console.WriteLine 함수는

운영체제가 표준출력으로 지정한

모니터 스크린에 출력합니다.

 

무엇이 표준출력인지 결정하는 것은

운영체제의 역할입니다.

 

암튼 이것을 길게 설명하는 이유는

monogame에서는 기본출력이 아니라

Draw 메소드로 텍스트를 스크린에

직접 그려야 하기 때문입니다.

 

복잡한 것 같지만 다행히

SpriteFont 객체로 쉽게 해결할 수 있습니다.

 

텍스트는 게임의 여러가지 문자열 표현

(지시문, 대화문, 스코어 표시 등)에

사용할 수 있습니다.

 

문자열 그리기

 

일단 콘솔앱처럼 Hello World 를

한번 찍어보겠습니다.

(뭐든지 Hello World 부터 시작하면 된다)

 

역시 길어보이지만 DesktopGL 스켈레톤 코드에

SpriteFont 만 추가한 것 입니다.

 

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace MyMonogame
{
    public class Game1 : Game
    {
        private GraphicsDeviceManager _graphics;
        private SpriteBatch _spriteBatch;

        private SpriteFont font;
        private int someScore = 10;

        public Game1()
        {
            _graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            IsMouseVisible = true;
        }

        protected override void Initialize()
        {
            base.Initialize();

            SetupWindows();
        }
        private void SetupWindows()
        {
            // 화면 해상도 초기화
            _graphics.PreferredBackBufferWidth = 600;
            _graphics.PreferredBackBufferHeight = 400;
            _graphics.ApplyChanges();  
        }

        protected override void LoadContent()
        {
            _spriteBatch = new SpriteBatch(GraphicsDevice);

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

        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                Exit();
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Chocolate);

            // 스프라이트를 추가합니다.
            _spriteBatch.Begin();
            _spriteBatch.DrawString(font, "Hello monogame! " + someScore, new Vector2(100,100), Color.White);
            _spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

 

SpriteFont 를 사용하려면 Font 도 게임의

콘텐트의 하나이기 때문에 Content.mgcb을

열어서 SpriteFont 를 추가해야 합니다.

SpriteFont 파일은 폰트에 대한 정의가

들어있는 xml 파일입니다.

 

Content -> Add -> new Item ->

SpriteFont Description 을 선택하고

파일 이름을 적어주면 됩니다.

 

에디터를 종료하기 전에 rebuild 합니다.

 

 

 

 

VSC의 탐색기를 보면 xml 파일이 생깁니다.

확장자는 .spritefont이며 폰트에 대한

여러가지 정의를 변경할 수 있습니다.

 

FontName 은 기본이 Arial 인데 거의

모든 컴퓨터에 들어있는 기본 폰트라서

설정이 되어 있습니다. 이 폰트가

시스템에서 사용가능해야 합니다.

 

물론 예쁜 트루타입 폰트를 직접

포함하는 방법도 있습니다만,

여기서는 모든 시스템에 깔려있다고

가정하기 쉬운 Arial 을 사용합니다.

 

 

코드를 실행하면 아래처럼 문자열이 표시됩니다.

 

+로 문자열 결합 연산을 하여 int 형 등

숫자도 넣을 수 있습니다. 스코어나

캐릭터 레벨 등 각종 정보 표시에

사용할 수 있습니다.

 

monogame 문자열 출력, DrawString

 

폰트에 대한 주의사항

폰트는 저작권에 까다롭습니다.

많은 사람들의 시스템에 기본으로

설치되어 있는 폰트라 할지라도

앱 개발자가 상업용 혹은 무료 배포라

할지라도 저작권 침해의 문제가 있습니다.

 

때문에 반드시 사용하려는 그 특정폰트에

대해서 라이센스 정보를 확인하도록 합니다.

 

상업용 배포를 위해서는 눈누같은 웹사이트의

라이선스 요약표를 참고한 후 폰트 제작사에

사전 확인을 하는 것을 권장합니다.

 

그리고 또 중요한 것 monogame 에서

유니코드는 사용방법이 다릅니다.

기본적으로 영문 아스키 코드를

스프라이트로 변환해서 사용합니다.

 

monogame에서 한글 폰트를

그리려면 별도 작업이 필요합니다.

SpriteFont 의 의미

게임창에 그래픽으로 보이는

모든 객체(object)는 스프라이트입니다.

 

폰트는 사이즈를 줄이거나 늘려야 해서

거의 벡터 그래픽 방식을 사용합니다.

예를 들어 오래동안 MS사 윈도우 계열

OS에서 사용한 Arial 폰트는 true type font 라는

방식으로 베지어 곡선을 사용하는데

게임에서 문자열 하나 표현하기 위해

매번 벡터 계산을 하는 것은 비효율적입니다.

 

그래서 처음에 게임을 빌드할 때

그냥 monogame 프레임워크에서

빠르게 사용가능한 스프라이트 파일로

변환시켜 버립니다. 그래서 폰트 사이즈

같은 정보를 xml 파일에 미리 정의해놓습니다.

 

벡터 계산과정을 삭제해버리기 때문에

폰트 정보의 빠른 로딩이 가능합니다.

 

그래서 그냥 Font 가 아니라 SpriteFont 가 됩니다.

(스프라이트 화된 폰트이다)

 

DebugView 사용하기

DebugView는 윈도우즈의 디버그 출력을

모니터할 수 있는 앱입니다.

 

monogame 은 Console.WriteLine 이

먹히지 않는데 비주얼 스튜디오는 IDE에서

Console 창이나 Output 창에 출력되도록

설정할 수 있지만 비주얼 스튜디오 코드는

딱히 그런 기능이 없는 것 같습니다.

뭔가 확장 플러그인 같은게 있을 것 같은데

그냥 속편하게 DebugView를 사용하는 것도

나쁘지 않을 듯 합니다.

 

윈도우 서버 관리 등을 위해 사용된

좀 오래된 프로그램인데 MS에서 꾸준히

업데이트는 하고 있는 앱입니다.

 

https://docs.microsoft.com/en-us/sysinternals/downloads/debugview

 

DebugView - Windows Sysinternals

This program intercepts calls made to DbgPrint by device drivers and OutputDebugString made by Win32 programs.

docs.microsoft.com

 

다운로드 후 압축을 풀고 dbgview64.exe를 실행합니다.

 

위의 monogame 소스코드에서 Update에

아래와 같은 코드를 추가합니다.

A키보드를 누르면 DebugView 에

메시지를 출력하는 코드입니다.

 

            if (Keyboard.GetState().IsKeyDown(Keys.A))
                Debug.WriteLine("A is pressed");

 

맨위에다가 using 지시자로 아래

네임스페이스를 포함시켜야 합니다.

using System.Diagnostics;

 

DebugView 에 출력됩니다.

숫자 7492는 프로세스 ID 입니다.

 

여러 프로세스에서 메시지가 전달되기 때문에

구분하기 위해 프로세스 ID가 표시됩니다.

 

 

 

이렇게 DebugView로도 monogame 프레임워크에서

Console.WriteLine 을 대체할 수 있습니다.

 

물론 위에서 설명한 SpriteFont로도

게임화면에 출력이 가능하니까

어느쪽이건 편한 쪽으로 사용하면 됩니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band