Как реализовать SpriteSheet (Atlas) с Windows Mobile 7? - PullRequest
2 голосов
/ 26 апреля 2011

Как реализовать SpriteSheet (Atlas) с Windows Mobile 7?

1 Ответ

1 голос
/ 28 апреля 2011

Одна из проблем, связанных с мобильными устройствами, заключается в том, как загружать много изображений и при этом получать хорошую производительность с мобильного устройства в течение всего срока службы приложения. Вот краткое объяснение того, как использовать Sprite Sheet с Windows Mobile 7. Что такое Sprite Sheet и зачем он нам нужен?

Когда мы создаем приложение или игру, обычно нам нужно представить много изображений. Вызов каждого изображения в коде отдельно создает для нас огромные накладные расходы в течение срока службы приложения. Когда речь идет о мобильных устройствах с ограниченными аппаратными ресурсами, очень важно Используйте эти спрайты (изображения) эффективно, чтобы получить хорошую производительность. Итак, как спрайт-лист помогает нам? Лист спрайтов - это большой файл изображения, который содержит много маленьких спрайтов (изображений), Поэтому вместо использования множества изображений мы используем только один файл изображения! Наш код вызывает его один раз, и потому что изображения хранятся в этом файле изображения упорядоченно это также экономит ненужное неиспользуемое пространство, приводя к меньшему количеству памяти при загрузке. Вот объяснение того, как сделать это с Windows Mobile 7. Я внес некоторые изменения в исходный KB, опубликованный Microsoft.

  1. Скачать код с http://create.msdn.com/en-US/education/catalog/sample/sprite_sheet
  2. Извлеки это.
  3. Чтобы повторно использовать этот код в своей собственной игре, добавьте проекты SpriteSheetPipeline и SpriteSheetRuntime в свое решение.

A. Сделать проект конвейера доступным для создания вашего контента

  1. Щелкните правой кнопкой мыши Содержимое | Элемент ссылок в вашем контент-проекте.
  2. Нажмите Добавить ссылку.
  3. Откройте вкладку «Проекты» и выберите проект SpriteSheetPipeline.

B. Чтобы сделать класс SpriteSheet доступным для вашей игры

  1. Щелкните правой кнопкой мыши элемент References в вашем основном игровом проекте.
  2. Нажмите Добавить ссылку.
  3. Откройте вкладку Projects и выберите проект SpriteSheetRuntime

Теперь, чтобы фактически использовать импортированный нами код, мы сначала создадим новый XML-файл и поместим его в каталог содержимого, формат XML должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type ="System.String[]">
         <Item>L01_480_0.png</Item>
         <Item>L01_480_1.png</Item>
         <Item>L01_480_2.png</Item>
         <Item>L01_480_3.png</Item>
         <Item>L01_480_4.png</Item>
         <Item>L01_480_5.png</Item>
         <Item>L01_480_6.png</Item>
         <Item>L01_480_7.png</Item>
         <Item>L01_480_8.png</Item>
         <Item>L01_480_9.png</Item>
         <Item>L01_480_10.png</Item>
         <Item>L01_480_11.png</Item>
         <Item>L01_480_12.png</Item>
  </Asset>
</XnaContent>

Как вы видите, этот xml содержит названия изображений, из которых мы создадим SpriteSheet (атлас), существует необходимость NO добавить эти изображения спрайтов в ваш проект с помощью Visual Studio, просто скопируйте изображения в каталог физического содержимого, и, конечно, требуется, чтобы вы добавили файл XML с помощью Visual Studio в папку содержимого проекта (это не основной проект, поэтому следует помнить об этом) Теперь, чтобы фактически использовать файл XML, вам нужно сделать несколько вещей. Нам нужно установить свойство файла XML. Импортером контента будет XML Content - XNA Framework Контент-процессор будет SpriteSheetProcessor После того, как мы установили свойство, мы можем вызвать файл. Сначала мы скажем нашему коду использовать SpriteSheetRuntime

Итак, мы добавим

using SpriteSheetRuntime;

Мы объявим новый объект spritebatch и spritesheet

namespace SpriteSheetGame
    {

      /// This is the main type for your game

      public class Game: Microsoft.Xna.Framework.Game
      {
       /* Handles the configuration and management of the graphics device.*/

        GraphicsDeviceManager graphics;

     /* Enables a group of sprites to be
        drawn using the same settings */

        SpriteBatch spriteBatch;

     /* A sprite sheet contains many individual sprite images, packed into different
        areas of a single larger texture, along with information describing where in
        that texture each sprite is located */

         SpriteSheet spriteSheet;
       }

В загружаемом контенте мы будем делать следующее:

       protected override void LoadContent()
        {
          spriteBatch = new SpriteBatch(GraphicsDevice);
          spriteSheet = Content.Load<SpriteSheet>("SpriteSheet");
        }

Файл XML в этом случае будет SpriteSheet.xml, как в примере выше. Теперь нам нужно отобразить спрайты или анимировать их, или показать все сразу. Поэтому мы будем использовать следующий spriteBatch.Draw, но перед этим запустим spriteBatch

protected override void Draw(GameTime gameTime)
{
    spriteBatch.Begin();

Если вы посмотрите на класс (SpriteBatch), вы найдете несколько вариантов для рисования на экране, вы можете выбрать наиболее подходящий для вас:

public void Draw(Texture2D texture, Vector2 position, Color color);

public void Draw(Texture2D texture, Rectangle destinationRectangle, Rectangle? sourceRectangle, Color color);

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color);

public void Draw(Texture2D texture, Rectangle destinationRectangle, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, SpriteEffects effects, float layerDepth);

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerDepth);

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth);

Итак, в конце концов мы можем написать что-то вроде этого:

protected override void Draw(GameTime gameTime)
{
    spriteBatch.Begin();




// Draw an animating effect, by rapidly cycling
      // through 13 slightly different sprite images.

      const int animationFramesPerSecond = 2;
      const int animationFrameCount = 13;

      // Look up the index of the first sprite.

      int index = spriteSheet.GetIndex("L01_480_0");

      // Modify the index to select the current frame of the animation.

      index += (int)(time * animationFramesPerSecond) % animationFrameCount;

      // Draw the current sprite.

       spriteBatch.Draw(spriteSheet.Texture, new Rectangle(0, 0, 100, 100),
                       spriteSheet.SourceRectangle(index), Color.White);

      spriteBatch.End();
            base.Draw(gameTime);
}
...