Utilisation des paramètres de calque pour créer un contexte de sprite
résumé
Utilisez la valeur de profondeur du calque pour spécifier le contexte du sprite.
Environnement d’exploitation
Conditions préalables
Versions XNA prises en charge |
|
Plates-formes prises en charge |
|
Version du Vertex Shader requise par Windows | 2.0 |
Version du Pixel Shader requise par Windows | 2.0 |
Environnement d’exploitation
plateforme |
|
substance
Normalement, lorsque vous dessinez un sprite, il est dessiné de manière à ce que ce que vous dessinez plus tard soit devant vous, mais en triant par valeur de profondeur, vous pouvez rendre le contexte clair quel que soit l’ordre dans lequel la méthode SpriteBatch.Draw est appelée.
Pour trier par valeur de profondeur de sprite, spécifiez « SpriteSortMode.BackToFront » comme premier argument de la méthode « SpriteBatch.Begin ». Il s’agit d’une méthode de traitement qui puise dans le sprite à l’arrière et écrase le sprite au premier plan.
// 一つでも半透明、透明要素があるスプライトの場合はこちらの引数を使用
this.spriteBatch.Begin(SpriteSortMode.BackToFront, null);
Toutefois, si vous souhaitez dessiner uniquement un sprite semi-transparent ou sans éléments transparents, vous pouvez le dessiner plus rapidement en spécifiant ce qui suit.
// 深度バッファを使用して前後関係を有効にし描画するように指定
// 完全な不透明スプライトのみ描画する場合はこちらが高速
this.spriteBatch.Begin(SpriteSortMode.FrontToBack,
BlendState.Opaque,
null,
DepthStencilState.Default,
null);
Le quatrième argument est « DepthStencilState.Default », qui écrit également des informations de « profondeur » à chaque pixel lorsque le sprite est dessiné. Lorsque les informations de profondeur sont écrites, il est possible de déterminer que l’objet à dessiner (en pixels) après cette position n’a pas besoin d’être écrit, de sorte que le coût de dessin est considérablement réduit.
Pour les raisons ci-dessus, si vous dessinez d’abord le sprite au premier plan, le coût de dessin du sprite qui se chevauche derrière lui diminuera, il est donc trié de sorte qu’il soit dessiné de face en spécifiant « SpriteSortMode.FrontToBack » comme premier argument à dessiner à partir du premier plan.
Cependant, cela n’est utile que lorsque vous dessinez un sprite opaque avec un élément de couleur complètement négligeable derrière lui. Dans le cas de sprites semi-transparents ou opaques, la valeur de profondeur est écrite sur chaque pixel même s’il s’agit d’un pixel semi-transparent ou transparent, donc si vous dessinez de face, le sprite derrière vous ne sera pas affiché. C’est pourquoi « SpriteSortMode.BackToFront » est spécifié dans le dessin du personnage. (Parce que les pixels autres que la forme du texte sont transparents)
D’ailleurs, à la suite d’un test de dessin de 30 000 sprites dans mon environnement, il était environ 3 fois plus rapide de dessiner de face en utilisant la valeur de profondeur que de derrière. Bien sûr, cela dépend du nombre de feuilles à dessiner, du degré de chevauchement, de la taille, etc., ainsi que de l’environnement d’exécution, alors essayez-le vous-même.
SpriteBatch.Begin
méthode
Appelez-le avant de dessiner le sprite. En interne, nous effectuons les réglages nécessaires pour dessiner des sprites.
sortMode | SpriteSortMode | Spécifie l’ordre dans lequel les sprites sont tirés de l’énumération SpriteSortMode. Si vous souhaitez dessiner à partir de l’arrière, spécifiez SpriteSortMode.BackToFront. Si vous souhaitez dessiner de face, spécifiez SpriteSortMode.FrontToBack. |
blendState | BlendState (en anglais) | Comment mélanger la couleur du sprite à dessiner avec la couleur de fond. Par défaut, BlendState.AlphaBlend est spécifié, mais dans ce cas, le sprite à dessiner est complètement opaque, de sorte que BlendState.Opaque est spécifié sans tenir compte de la couleur d’arrière-plan. |
samplerÉtat | SamplerState | Comment la texture est échantillonnée. Si null est spécifié, la valeur par défaut SamplerState.LinearClamp est spécifiée. |
depthStencilState | DepthStencilState | Spécifie comment la mémoire tampon de gabarit de profondeur est utilisée. Si null est spécifié, DepthStencilState.None est utilisé, qui n’utilise pas de tampon de stencil de profondeur. Si vous souhaitez utiliser une mémoire tampon de gabarit de profondeur, spécifiez DepthStencilState.Default. |
rasterizerState | RasterizerState | Spécifie une méthode de rastérisation, telle que l’élimination rétrospective. Si null est spécifié, la valeur par défaut RasterizerState.CullCounterClockwise est spécifiée. |
Pour dessiner un sprite, spécifiez une valeur de profondeur comme neuvième argument de la méthode SpriteBatch.Draw. Les valeurs qui peuvent être définies ici sont de l’ordre de 0,0 ~ 1,0, 0,0 étant le premier et 1,0 le plus en arrière.
// 最背面に描画(赤)
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
méthode
Ajoute un sprite à la liste des lots de dessin de sprites.
texture | Texture2D | Spécifie la texture à afficher sous forme de sprite. |
position | Vecteur2 | La position où le sprite doit être affiché. Spécifiez les coordonnées à l’écran par rapport au coin supérieur gauche de l’écran. L’origine du sprite se trouve en haut à gauche. |
sourceRectangle | Nullable<Rectangle> | Spécifie la zone de transfert de la texture. Si vous souhaitez que la texture entière soit affichée sous forme de sprite, vous pouvez spécifier null. Si vous spécifiez ce paramètre, vous pouvez faire en sorte que seule une zone arbitraire apparaisse sous la forme d’un sprite. |
Couleur | Couleur | Spécifie la couleur pour multiplier la couleur du sprite. Si vous spécifiez Color.White, il s’affiche dans la couleur principale du sprite. Si Color.Black est spécifié, le sprite s’affiche en noir intégral, quelle que soit sa couleur. La formule est « Résultat = couleur du sprite * couleur ». |
rotation | flotter | L’angle de rotation du sprite. Les unités sont spécifiées en radian. L’axe de rotation se trouvera en haut à gauche du sprite. |
origine | Vecteur2 | Spécifie la position de l’axe de rotation lors de la rotation du sprite. Vous spécifiez quelle position du sprite est l’axe de rotation, mais en réalité, la position de l’axe de rotation est fixée en haut à gauche du sprite et la position d’affichage du sprite est déplacée par -origin. |
écaille | flotter | Spécifie l’agrandissement du sprite. S’échelonne verticalement et horizontalement par rapport à 1,0. L’origine de l’agrandissement se trouve dans le coin supérieur gauche du sprite. |
Effets | SpriteEffets | Spécifie l’effet de retournement du sprite. Si vous ne faites rien d’autre, spécifiez SpriteEffects.None. |
layerDepth | flotter | Spécifie la profondeur à laquelle le sprite est affiché. Il est principalement utilisé pour afficher des sprites au premier plan et à l’arrière. Spécifiez dans la plage de 0,0 ~ 1,0, où 0,0 est l’avant et 1,0 est l’arrière. |
Dans le programme ci-dessus, la méthode SpriteBatch.Draw est appelée dans l’ordre de « rouge », « vert » et « bleu », mais chaque valeur de profondeur est définie sur « rouge (1.0) », « vert (0.0) » et « bleu (0.5) », de sorte que vous pouvez voir que le rouge est dessiné à l’arrière et le vert est dessiné au premier plan.
Tous les codes
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);
}
}
}