Sådan implementeres SpriteSheet (Atlas) med Windows Mobile 7?

Indlæg af Hanne Mølgaard Plasc

Problem



Sådan implementeres SpriteSheet (Atlas) med Windows Mobile 7?

Bedste reference


En af udfordringerne med mobile enheder er, hvordan man indlæser mange billeder og stadig får god ydeevne fra den mobile enhed i applikationens levetid.
Her er en kort forklaring på, hvordan du bruger Sprite Sheet med Windows Mobile 7.
Hvad er Sprite Sheet, og hvorfor har vi brug for det?


Når vi opretter en applikation eller et spil, skal vi normalt præsentere mange billeder.
Kalding af hvert billede separat i koden skaber for os enorme overheadydelse i applikationens levetid.
Når det kommer til mobile enheder med begrænsede hardware ressourcer, er det meget vigtigt at
Brug disse sprites (billeder) effektivt for at få en god ydeevne.
Så hvordan spritesheet hjælper os?
Sprite Sheet er stor billedfil, der indeholder mange små sprites (billeder),
Så i stedet for at bruge mange mange billeder bruger vi kun kun én billedfil!
Vores kode kalder det en gang, og fordi billederne gemmes ordentligt på billedfilen
det sparer også unødvendigt ubrugt plads, hvilket resulterer i mindre hukommelse, når du læser det.
Her er forklaringen på, hvordan man gør det med Windows Mobile 7.
Jeg lavede nogle ændringer til det oprindelige KB, som Microsoft offentliggjorde.



  1. Hent koden fra http://create.msdn.com/en-US/education/catalog/sample/sprite\_sheet

  2. Uddrag det.

  3. For at genbruge denne kode i dit eget spil, tilføj SpriteSheetPipeline og SpriteSheetRuntime projekter til din løsning.



A. For at gøre rørledningsprojektet tilgængeligt for at bygge dit indhold [8]



  1. Højreklik på indholdet | Referencer element i dit indholdsprojekt.

  2. Klik på Tilføj reference.

  3. Klik på fanen Projekter, og vælg derefter SpriteSheetPipeline-projektet.



B. At gøre SpriteSheet-klassen tilgængelig for dit spil



  1. Højreklik på referencer-elementet i dit primære spilprojekt.

  2. Klik på Tilføj reference.

  3. Klik på fanen Projekter, og vælg SpriteSheetRuntime-projektet



Nu for at faktisk bruge koden, som vi importerede vi først vil oprette en ny xml-fil og indsætte indholdskataloget, skal formatet for XML være som sådan:


<?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>


Som du kan se denne xml indeholder navnene på de billeder, som vi vil oprette SpriteSheet (atlas) fra, er der NEJ nødvendigt at tilføje disse sprites billeder til dit projekt via visuel studio, bare kopier billederne til fysisk indholdskatalog, og det er selvfølgelig nødvendigt at tilføje XML-filen via visuel studio til indholdsmappen Project (dette er ikke hovedprojektet, så vær opmærksom på det)
Nu for at faktisk bruge XML-filen skal du lave nogle ting.
Vi skal angive egenskaben for xml-filen.
Content Importer vil være XML Content - XNA Framework
Content Processor vil være SpriteSheetProcessor
Når vi sætter proprty, kan vi faktisk ringe til filen.
Først vil vi fortælle vores kode for at bruge SpriteSheetRuntime


Så vi vil tilføje


using SpriteSheetRuntime;


Vi vil erklære ny spritbatch og spritesheet objekt


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;
       }


I lastindholdet vil vi gøre følgende:


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


XML-filen i dette tilfælde vil være SpriteSheet.xml som eksemplet ovenfor.
Nu skal vi vise sprites enten ved at animere dem eller vise dem alle på en gang.
Så vi vil bruge følgende spriteBatch.Draw, men før det starter vi spriteBatch


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


hvis du vil se på klassen (SpriteBatch) finder du få muligheder for at trække på skærmen, du kan vælge den mest egnede til dig:


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);


Så til sidst kan vi skrive noget sådan:


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);
}