如何使用Windows Mobile 7实现SpriteSheet(Atlas)?

时间:2011-04-25 20:38:27

标签: windows windows-phone-7 mobile sprite-sheet atlassprites

如何使用Windows Mobile 7实现SpriteSheet(Atlas)?

1 个答案:

答案 0 :(得分:1)

移动设备面临的挑战之一是如何加载许多图像,并且在应用程序的生命周期内仍然可以从移动设备获得良好的性能。 以下是有关如何在Windows Mobile 7中使用Sprite Sheet的简短说明。 什么是Sprite Sheet以及我们为什么需要它?

当我们创建应用程序或游戏时,我们通常需要呈现许多图像。 在代码中单独调用每个映像可以在应用程序的生命周期内为我们创建巨大的开销性能。 对于硬件资源有限的移动设备而言,这非常重要 有效地使用这些精灵(图像)以获得良好的性能。 那么spritesheet如何帮助我们? Sprite Sheet是包含许多小精灵(图像)的大图像文件, 因此,我们只使用一个图像文件,而不是使用许多图像! 我们的代码调用它一次,因为图像按顺序存储在该图像文件中 它还可以节省不必要的未使用空间,从而减少加载时的内存 以下是有关如何使用Windows Mobile 7进行说明的说明。 我对微软发布的原始KB进行了一些修改。

  1. http://create.msdn.com/en-US/education/catalog/sample/sprite_sheet
  2. 下载代码
  3. 提取它。
  4. 要在您自己的游戏中重复使用此代码,请将SpriteSheetPipeline和SpriteSheetRuntime项目添加到您的解决方案中。
  5. 一个。使管道项目可用于构建内容

    1. 右键单击“内容”|内容项目中的引用项目。
    2. 单击“添加引用”。
    3. 单击“项目”选项卡,然后选择“SpriteSheetPipeline”项目。
    4. B中。使SpriteSheet类可用于您的游戏

      1. 右键单击主游戏项目中的“引用”项。
      2. 单击“添加引用”。
      3. 单击“项目”选项卡,然后选择“SpriteSheetRuntime项目”
      4. 现在要实际使用我们导入的代码,我们首先创建新的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(atlas)的图像的名称,有 NO 需要通过visual studio将这些sprite图像添加到你的项目中只需复制图像到物理内容目录,当然要求你通过visual studio将XML文件添加到Content文件夹Project(这不是主要项目所以要注意它) 现在要实际使用XML文件,您需要做一些事情。 我们需要设置xml文件的属性。 内容导入器将是XML内容 - XNA Framework 内容处理器将 SpriteSheetProcessor 在我们设置了proprty后,我们实际上可以调用该文件。 首先,我们将告诉我们的代码使用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,就像上面的exaple一样。 现在我们需要通过动画显示精灵或一次显示所有精灵。 所以我们将使用下面的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);
        }