Kihi parameetrite kasutamine Sprite'i konteksti loomiseks
Kokkuvõte
Kasutage kihi sügavuse väärtust spraidi konteksti määramiseks.
Töökeskkond
Eeltingimused
Toetatud XNA versioonid |
|
Toetatud platvormid |
|
Windowsi nõutav vertex shaderi versioon | 2.0 |
Windowsi nõutav versioon Pixel Shader | 2.0 |
Töökeskkond
platvorm |
|
aine
Tavaliselt, kui joonistate spraiti, joonistatakse see nii, et see, mida hiljem joonistate, on teie ees, kuid sügavuse väärtuse järgi sorteerides saate konteksti selgeks teha, olenemata sellest, millises järjekorras SpriteBatch.Draw meetodit nimetatakse.
Spraidi sügavuse väärtuse järgi sortimiseks määrake "SpriteBatch.Begin" meetodi esimeseks argumendiks "SpriteSortMode.BackToFront". See on töötlemismeetod, mis lähtub spraidist tagaküljel ja kirjutab spraidi esiplaanile.
// 一つでも半透明、透明要素があるスプライトの場合はこちらの引数を使用
this.spriteBatch.Begin(SpriteSortMode.BackToFront, null);
Kui aga soovite joonistada ainult spraiti, mis on poolläbipaistev või millel pole üldse läbipaistvaid elemente, saate selle kiiremini joonistada, täpsustades järgmist.
// 深度バッファを使用して前後関係を有効にし描画するように指定
// 完全な不透明スプライトのみ描画する場合はこちらが高速
this.spriteBatch.Begin(SpriteSortMode.FrontToBack,
BlendState.Opaque,
null,
DepthStencilState.Default,
null);
Neljas argument on "DepthStencilState.Default", mis kirjutab spraidi joonistamisel igale pikslile ka "sügavuse" teabe. Kui sügavusteave on kirjutatud, on võimalik kindlaks teha, et pärast seda asukohta joonistatavat objekti (pikslites) ei ole vaja kirjutada, seega väheneb joonistuskulu oluliselt.
Ülaltoodud põhjustel, kui joonistate spraidi kõigepealt esiplaanile, väheneb selle taga kattuva spraidi joonistuskulu, nii et see sorteeritakse nii, et see tõmmatakse eestpoolt, määrates esiplaanilt esimeseks argumendiks "SpriteSortMode.FrontToBack".
See on aga kasulik ainult läbipaistmatu spraidi joonistamisel, mille taga on täiesti tühine värvielement. Poolläbipaistvate või läbipaistmatute spraitide puhul kirjutatakse sügavuse väärtus igale pikslile isegi siis, kui see on poolläbipaistev või läbipaistev piksel, nii et kui joonistate eestpoolt, siis teie taga olevat spraiti ei kuvata. Seetõttu on märgijoonisel täpsustatud "SpriteSortMode.BackToFront". (Kuna muud pikslid peale teksti kuju on läbipaistvad)
Muide, minu keskkonnas 30 000 spraidi joonistamise testi tulemusena oli sügavuse väärtuse abil eestpoolt joonistamine umbes 3 korda kiirem kui tagantpoolt. Loomulikult sõltub see joonistatavate lehtede arvust, kattuvuse astmest, suurusest jne, samuti täitmiskeskkonnast, nii et palun proovige seda ise.
SpriteBatch.Begin
Meetod
Helistage sellele enne spraidi joonistamist. Sisemiselt teeme spraitide joonistamiseks vajalikud seadistused.
sortMode | SpriteSortMode | Määrab spraitide joonistamise järjekorra SpriteSortMode loendusest. Kui soovite joonistada tagantpoolt, määrake SpriteSortMode.BackToFront. Kui soovite joonistada eestpoolt, määrake SpriteSortMode.FrontToBack. |
blendState | BlendState | Kuidas segada joonistatava spraidi värvi taustavärviga. Vaikimisi on määratud BlendState.AlphaBlend, kuid sel juhul on joonistatav sprait täiesti läbipaistmatu, nii et BlendState.Opaque on määratud ilma taustavärvi arvestamata. |
samplerState | SamplerState | Kuidas tekstuurist proove võetakse. Kui on määratud null, määratakse vaikeväärtus SamplerState.LinearClamp. |
sügavusStencilState | DepthStencilState | Määrab, kuidas šabloonpuhvrit kasutatakse. Kui on määratud null, kasutatakse väärtust DepthStencilState.None, mis ei kasuta sügavusšablooni puhvrit. Kui soovite kasutada šabloonpuhvrit, määrake DepthStencilState.Default. |
rasterizerState | RasterizerState | Määrab rasteriseerimismeetodi, näiteks tagasitapmise. Kui määratud on null, määratakse vaikeväärtus RasterizerState.CullCounterClockwise. |
Spraidi joonistamiseks määrake sügavusväärtus üheksandaks argumendiks meetodile SpriteBatch.Draw. Väärtused, mida saab siin määrata, on vahemikus 0,0 ~ 1,0, kusjuures 0,0 on kõige tähtsam ja 1,0 on kõige tagumisem.
// 最背面に描画(赤)
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
Meetod
Lisab spraidi joonistuspartiide loendisse spraidi.
Tekstuur | Tekstuur2D | Määrab spraidina kuvatava tekstuuri. |
asend | Vektor2 | Spraidi kuvamise asukoht. Määrake ekraani koordinaatides ekraani vasakus ülanurgas. Spraidi päritolu on vasakus ülanurgas. |
allikasRectangle | Tühistatav<ristkülik> | – saate määrata tekstuuri ülekandeala. Kui soovite, et kogu tekstuur kuvataks spraidina, saate määrata nulli. Kui määrate selle parameetri, saate spraidina kuvada ainult suvalise ala. |
värv | Värv | Määrab värvi spraidi värvi korrutamiseks. Kui määrate Color.White, kuvatakse see spraidi põhivärvis. Kui on määratud Color.Black, kuvatakse sprait täismustana, olenemata selle värvist. Valem on "Tulemus = sprite värv * värv". |
Rotatsiooni | Float | Spraidi pöördenurk. Ühikud on määratud radiaanides. Pöörlemistelg asub spraidi vasakus ülanurgas. |
Päritolu | Vektor2 | Määrab pöörlemistelje asukoha spraidi pööramisel. Te määrate, milline spraidi asend on pöörlemistelg, kuid tegelikult on pöörlemistelje asend fikseeritud spraidi vasakusse ülaossa ja spraidi kuvamisasendit liigutatakse -origin. |
kaal | Float | Määrab spraidi suurenduse. Kaalud vertikaalselt ja horisontaalselt 1, 0 suhtes. Suurenduse päritolu on spraidi vasakus ülanurgas. |
Mõju | SpriteEffects | Määrab spraidi klapiefekti. Kui te midagi muud ei tee, määrake SpriteEffects.None. |
kihtSügavus | Float | – saate määrata sügavuse, millel sprait kuvatakse. Seda kasutatakse peamiselt spraitide kuvamiseks esiplaanil ja tagaküljel. Määrake vahemikus 0,0 ~ 1,0, kus 0,0 on ees ja 1,0 on taga. |
Ülaltoodud programmis nimetatakse SpriteBatch.Draw meetodit järjekorras "punane", "roheline" ja "sinine", kuid iga sügavuse väärtus on seatud "punaseks (1.0)", "roheliseks (0.0)" ja "siniseks (0.5)", nii et näete, et punane on joonistatud tagaküljele ja roheline joonistatakse esiplaanile.
Kõik koodid
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);
}
}
}