Sprite-kontekstin luominen tasoparametrien avulla

Sivu päivitetty :
Sivun luontipäivämäärä :

yhteenveto

Määritä hahmon konteksti tason syvyysarvon avulla.

レイヤーパラメータを使用してスプライトの前後関係を作る

Toimintaympäristö

Edellytykset

Tuetut XNA-versiot
  • 2.0
  • 3.0
  • 3.1
  • 4.0
Tuetut alustat
  • Windows (XP SP2 tai uudempi, Vista, 7)
  • Xbox 360
  • Windows Phone 7
Windowsin vaatima Vertex Shader -versio 2.0
Windowsin vaatima Pixel Shader -versio 2.0

Toimintaympäristö

lava
  • Windows 7
  • Xbox 360
  • Windows Phone 7 -emulaattori

aine

Normaalisti, kun piirrät spriten, se piirretään niin, että myöhemmin piirtämäsi on edessäsi, mutta lajittelemalla syvyysarvon mukaan voit tehdä kontekstin selväksi riippumatta siitä, missä järjestyksessä SpriteBatch.Draw-menetelmää kutsutaan.

Jos haluat lajitella sprite-syvyysarvon mukaan, määritä "SpriteSortMode.BackToFront" ensimmäiseksi argumentiksi "SpriteBatch.Begin" -menetelmälle. Se on käsittelymenetelmä, joka ammentaa takana olevasta spritestä ja korvaa etualalla olevan spriten.

// 一つでも半透明、透明要素があるスプライトの場合はこちらの引数を使用
this.spriteBatch.Begin(SpriteSortMode.BackToFront, null);

Jos kuitenkin haluat piirtää vain spriten, joka on puoliksi läpinäkyvä tai jossa ei ole lainkaan läpinäkyviä elementtejä, voit piirtää sen nopeammin määrittämällä seuraavat.

// 深度バッファを使用して前後関係を有効にし描画するように指定
// 完全な不透明スプライトのみ描画する場合はこちらが高速
this.spriteBatch.Begin(SpriteSortMode.FrontToBack,
                       BlendState.Opaque,
                       null,
                       DepthStencilState.Default,
                       null);

Neljäs argumentti on "DepthStencilState.Default", joka myös kirjoittaa "syvyystiedot" jokaiselle pikselille, kun sprite piirretään. Kun syvyystiedot kirjoitetaan, on mahdollista määrittää, että piirrettävää kohdetta (pikseleinä) tämän sijainnin jälkeen ei tarvitse kirjoittaa, joten piirustuskustannukset pienenevät huomattavasti.

Edellä mainituista syistä, jos piirrät spriten ensin etualalle, sen takana päällekkäisen spriten piirustuskustannukset pienenevät, joten se lajitellaan siten, että se vedetään edestä määrittämällä "SpriteSortMode.FrontToBack" ensimmäiseksi etualalta vedettäväksi argumentiksi.

Tämä on kuitenkin hyödyllistä vain, kun piirrät läpinäkymättömän spriten, jonka takana on täysin merkityksetön värielementti. Puoliksi läpinäkyvien tai läpinäkymättömien spritien tapauksessa syvyysarvo kirjoitetaan jokaiselle pikselille, vaikka se olisi puoliksi läpinäkyvä tai läpinäkyvä pikseli, joten jos piirrät edestä, takanasi olevaa hahmoa ei näytetä. Siksi "SpriteSortMode.BackToFront" on määritetty merkkipiirustuksessa. (Koska muut pikselit kuin tekstin muoto ovat läpinäkyviä)

Muuten, 30 000 spriten piirtämisen testin tuloksena ympäristössäni oli noin 3 kertaa nopeampi piirtää edestä syvyysarvon avulla kuin takaa. Tietenkin se riippuu piirrettävien arkkien lukumäärästä, päällekkäisyyden asteesta, koosta jne., Sekä suoritusympäristöstä, joten kokeile sitä itse.

SpriteBatch.Begin menetelmä

Soita sille ennen spriten piirtämistä. Sisäisesti teemme tarvittavat asetukset spriten piirtämiseen.

sortMode SpriteSortMode Määrittää järjestyksen, jossa sprites poimitaan SpriteSortMode-luetteloinnista. Jos haluat piirtää takaapäin, määritä SpriteSortMode.BackToFront. Jos haluat piirtää edestäpäin, määritä SpriteSortMode.FrontToBack.
sekoitus BlendState Kuinka sekoittaa piirrettävän spriten väri taustaväriin. Oletusarvoisesti BlendState.AlphaBlend on määritetty, mutta tässä tapauksessa piirrettävä sprite on täysin läpinäkymätön, joten BlendState.Opaque määritetään ottamatta huomioon taustaväriä.
näytteenottimen tila Näytteenottimen tila Miten tekstuurista otetaan näytteitä. Jos null on määritetty, oletusarvo SamplerState.LinearClamp määritetään.
depthStencilState DepthStencilState Määrittää, miten syvyyskaavainpuskuria käytetään. Jos null on määritetty, käytetään DepthStencilState.None-arvoa, joka ei käytä syvyyskaavainpuskuria. Jos haluat käyttää syvyyskaavainpuskuria, määritä DepthStencilState.Default.
rasteroijaValtio Rasterizer-tila Määrittää rasterointimenetelmän, kuten takaisinteurastuksen. Jos null on määritetty, oletusarvo RasterizerState.CullCounterClockwise määritetään.

Jos haluat piirtää spriten, määritä syvyysarvo SpriteBatch.Draw-menetelmän yhdeksänneksi argumentiksi. Tässä asetettavat arvot ovat alueella 0,0 ~ 1,0, 0,0 on tärkein ja 1,0 takana.

// 最背面に描画(赤)
this.spriteBatch.Draw(this.texture, new Vector2(150.0f, 50.0f), null,
    Color.Red, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f);

// 最前面に描画(緑)
this.spriteBatch.Draw(this.texture, new Vector2(110.0f, 90.0f), null,
    Color.Green, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.0f);

// 2つのスプライトの間に描画(青)
this.spriteBatch.Draw(this.texture, new Vector2(190.0f, 130.0f), null,
    Color.Blue, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f);

SpriteBatch.Draw menetelmä

Lisää spriten sprite-piirustusten eräluetteloon.

rakenne Tekstuuri2D Määrittää hahmona näytettävän pintakuvion.
asema Vektori 2 Sijainti, jossa sprite tulee näyttää. Määritä näytön koordinaatit suhteessa näytön vasempaan yläkulmaan. Spriten alkuperä on vasemmassa yläkulmassa.
sourceSuorakulmio Nullable<suorakulmio> Määrittää pintakuvion siirtoalueen. Jos haluat, että koko pintakuvio näytetään spritenä, voit määrittää null-arvon. Jos määrität tämän parametrin, voit määrittää vain mielivaltaisen alueen näkymään spritenä.
väri Väri Määrittää värin, joka kertoo kuvan värin. Jos määrität Color.White, se näytetään kuvan päävärillä. Jos Color.Black on määritetty, hahmo näytetään täysin mustana väristä riippumatta. Kaava on "Tulos = sprite color * color".
kierto kellua Spriten pyörimiskulma. Yksiköt on määritelty radiaanina. Pyörimisakseli on spriten vasemmassa yläkulmassa.
alkuperä Vektori 2 Määrittää pyörimisakselin sijainnin spriteä pyöritettäessä. Voit määrittää, mikä spriten sijainti on kiertoakseli, mutta todellisuudessa pyörimisakselin sijainti on kiinnitetty spriten vasempaan yläkulmaan ja spriten näyttöasentoa siirretään -origin.
mittakaava kellua Määrittää hahmon suurennuksen. Skaalautuu pysty- ja vaakasuunnassa suhteessa 1,0:aan. Suurennuksen alkuperä on kuvan vasemmassa yläkulmassa.
vaikutukset SpriteEffects Määrittää hahmon kääntötehosteen. Jos et tee mitään muuta, määritä SpriteEffects.None.
kerrosSyvyys kellua Määrittää syvyyden, jolla sprite näytetään. Sitä käytetään pääasiassa spritien näyttämiseen etualalla ja takana. Määritä alueella 0,0 ~ 1,0, jossa 0,0 on edessä ja 1,0 takana.

Edellä mainitussa ohjelmassa SpriteBatch.Draw-menetelmää kutsutaan järjestyksessä "punainen", "vihreä" ja "sininen", mutta jokainen syvyysarvo on asetettu "punaiseksi (1,0)", "vihreäksi (0,0)" ja "siniseksi (0,5)", joten näet, että punainen piirretään taakse ja vihreä etualalle.

深度値を使用したスプライトの描画

Kaikki koodit

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace LayerDepthSprite
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// テクスチャー
        /// </summary>
        private Texture2D texture = null;


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // TODO: ここに初期化ロジックを書いてください

            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // テクスチャーをコンテンツパイプラインから読み込む
            this.texture = this.Content.Load<Texture2D>("Texture");
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            // TODO: ここに更新処理を記述してください

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // 深度バッファを使用して前後関係を有効にし描画するように指定
            // 完全な不透明スプライトのみ描画する場合はこちらが高速
            this.spriteBatch.Begin(SpriteSortMode.FrontToBack,
                                   BlendState.Opaque,
                                   null,
                                   DepthStencilState.Default,
                                   null);

            // 一つでも半透明、透明要素があるスプライトの場合はこちらの引数を使用
            //this.spriteBatch.Begin(SpriteSortMode.BackToFront, null);

            // 最背面に描画(赤)
            this.spriteBatch.Draw(this.texture, new Vector2(150.0f, 50.0f), null,
                Color.Red, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f);

            // 最前面に描画(緑)
            this.spriteBatch.Draw(this.texture, new Vector2(110.0f, 90.0f), null,
                Color.Green, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.0f);

            // 2つのスプライトの間に描画(青)
            this.spriteBatch.Draw(this.texture, new Vector2(190.0f, 130.0f), null,
                Color.Blue, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.5f);

            // スプライトの一括描画
            this.spriteBatch.End();

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}