Программируем игры на XNA и MonoGame для Windows 8. Часть 2. Content

С выходом новой версии MonoGame 3.0.1 информация из статьи могла устареть. Смотрите новые статьи в постах выше.

Основная проблема MonoGame в текущей его версии (хотя, возможно, есть способы решения этой проблемы) – это отсутствие полноценного Content Pipeline. То есть мы не сможем создать Content проект, добавлять в него ресурсы и потом использовать их в игре, как мы привыкли это делать раньше.

С другой стороны, MonoGame вполне успешно умеет загружать и работать с файлами .xnb. Нам остается только создать такие файлы.

Для этого мы создадим XNA Game проект в Visual Studio 2010 и будем использовать его в качестве процессора для контента.

Будем добавлять ресурсы с Content проект как обычно, при компиляции проекта в папке bin\Content будут создаваться файлы .xnb.

Нам нужно просто скопировать папку Content (с уже скомпилированными файлами .xnb) в папку \bin\Debug\AppX\ (для Debug версии) нашего нового проекта. (Конечно, эту операцию можно достаточно легко автоматизировать и потом мы займемся и этим, но пока это не важно)

Дальше можно будет использовать наш любимый ContentManager.

Разработаем простой пример.

Создадим проект Windows Game (4.0) в Visual Studio 2010 и добавим в него какую-нибудь простую картинку (как обычно, Add Existing Item в Content проекте).

Теперь скомпилируем проект и найдем папку /bin/x86/Debug/Content.

Сейчас в ней должен быть один файл – asteroid.xnb

Теперь копируем папку Content в папку \bin\Debug\AppX\ нашего нового проекта на MonoGame (если мы изменим картинку или добавим новый ресурс, то нужно будет обязательно заново скомпилировать проект в Visual Studio 2010 и скопировать папку Content). Нужно сначала запустить проект, чтобы папка AppX создалась.

Теперь вернемся в проект MonoGame и напишем код для рисования нашей картинки.

Объявление переменной:


Texture2D asteroidTexture;

Загрузка:


        /// <summary>

        /// LoadContent will be called once per game and is the place to load

        /// all of your content.

        /// </summary>

        protected override void LoadContent()

        {

            // Create a new SpriteBatch, which can be used to draw textures.

            _spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here

            asteroidTexture = Content.Load<Texture2D>(«asteroid»);

        }

И рисование:


        /// <summary>

        /// This is called when the game should draw itself.

        /// </summary>

        /// <param name=»gameTime»>Provides a snapshot of timing values.</param>

        protected override void Draw(GameTime gameTime)

        {

            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            _spriteBatch.Begin();

            _spriteBatch.Draw(asteroidTexture, newVector2(100, 100), Color.White);

            _spriteBatch.End();

            base.Draw(gameTime);

        }

Если все сделано правильно, то мы должны увидеть такую картинку:

На всякий случай, полный код класса игры Game1.cs:

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Graphics;

namespace Game2

{

    /// <summary>

    /// This is the main type for your game

    /// </summary>

    public class Game1 : Game

    {

        GraphicsDeviceManager _graphics;

        SpriteBatch _spriteBatch;

        Texture2D asteroidTexture;

        public Game1()

        {

            _graphics = new GraphicsDeviceManager(this);

            Content.RootDirectory = «Content»;

        }

        /// <summary>

        /// Allows the game to perform any initialization it needs to before starting to run.

        /// This is where it can query for any required services and load any non-graphic

        /// related content.  Calling base.Initialize will enumerate through any components

        /// and initialize them as well.

        /// </summary>

        protected override void Initialize()

        {

            // TODO: Add your initialization logic here

            base.Initialize();

        }

        /// <summary>

        /// LoadContent will be called once per game and is the place to load

        /// all of your content.

        /// </summary>

        protected override void LoadContent()

        {

            // Create a new SpriteBatch, which can be used to draw textures.

            _spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here

            asteroidTexture = Content.Load<Texture2D>(«asteroid»);

        }

        /// <summary>

        /// UnloadContent will be called once per game and is the place to unload

        /// all content.

        /// </summary>

        protected override void UnloadContent()

        {

            // TODO: Unload any non ContentManager content here

        }

        /// <summary>

        /// Allows the game to run logic such as updating the world,

        /// checking for collisions, gathering input, and playing audio.

        /// </summary>

        /// <param name=»gameTime»>Provides a snapshot of timing values.</param>

        protected override void Update(GameTime gameTime)

        {

            // TODO: Add your update logic here

            base.Update(gameTime);

        }

        /// <summary>

        /// This is called when the game should draw itself.

        /// </summary>

        /// <param name=»gameTime»>Provides a snapshot of timing values.</param>

        protected override void Draw(GameTime gameTime)

        {

            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            _spriteBatch.Begin();

            _spriteBatch.Draw(asteroidTexture, new Vector2(100, 100), Color.White);

            _spriteBatch.End();

            base.Draw(gameTime);

        }

    }

}

Реклама
Запись опубликована в рубрике Компьютерная графика с метками , , , , , , . Добавьте в закладки постоянную ссылку.

3 комментария на «Программируем игры на XNA и MonoGame для Windows 8. Часть 2. Content»

  1. Wimpel:

    Простите, а как вы поставили XNA для visual studio 2010 под управлением windows 8?

  2. I’ve been exploring for a bit for any high quality articles or weblog posts on this kind of area . Exploring in Yahoo I at last stumbled upon this site. Studying this information So i am satisfied to convey that I’ve
    an incredibly good uncanny feeling I came upon just what I needed.
    I most for sure will make sure to do not disregard this web
    site and give it a look regularly.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s