使sprite顯示
總結
載入紋理(圖像)並將其顯示在螢幕上。
經營環境
先決條件
支援的 XNA 版本 |
|
支援的平臺 |
|
Windows 所需的頂點著色器版本 | 2.0 |
Windows 所需的像素著色器版本 | 2.0 |
經營環境
平臺 |
|
物質
什麼是Sprite?
用於在螢幕上繪製圖像的矩形區域。 此功能經常用於 2D 遊戲,但在 3D 中也經常用作偽 2D 圖像繪圖。
在 XNA 中,所有內容都必須以 3D 多邊形繪製,因此在螢幕上繪製的圖像是使用多邊形的偽 Sprite。 但是,無需注意多邊形,您可以輕鬆繪製它們。
準備圖像
由於會顯示圖像,因此必須準備圖像檔。 在此示例中,使用了下圖。
我正在使用大小為 128×128 的 PNG 檔,但它可以是任何大小。 此外,可以讀取的圖片檔格式預設為以下檔。
- .bmp
- .dds
- .dib 功能變數名稱
- .hdr
- .jpg
- .pfm
- .png
- .ppm
- .tga 功能變數名稱
將圖像添加到專案
在示例中,圖像檔被放入 「Content」 專案中。 有關如何將圖像檔添加到專案的詳細資訊,請參閱以下頁面。
田
<summary>
スプライトのバッチ化クラス
</summary>
private SpriteBatch spriteBatch = null;
<summary>
テクスチャー
</summary>
private Texture2D texture = null;
要繪製 Sprite,請準備 「SpriteBatch」 來批量繪製要繪製的 Sprite,準備 “Texture2D” 來存儲 2D 圖像數據。
創建和載入資源
<summary>
ゲームが始まるときに一回だけ呼ばれ
すべてのゲームコンテンツを読み込みます
</summary>
protected override void LoadContent()
{
// テクスチャーを描画するためのスプライトバッチクラスを作成します
this.spriteBatch = new SpriteBatch(this.GraphicsDevice);
// テクスチャーをコンテンツパイプラインから読み込む
this.texture = this.Content.Load<Texture2D>("Texture");
}
在LoadGraphicsContent方法中,創建一個SpriteBatch類。 將 GraphicsDevice 作為參數傳遞。
然後,使用 ContentManager.Load 方法載入和創建紋理。 為類型參數指定 「Texture2D」 類,為參數指定資產名稱。
SpriteBatch
構造 函數
創建類 「SpriteBatch」 的實例,用於對 Sprite 的繪製進行批處理。
graphics設備 | 圖形設備 | 指定要用於繪圖的 GraphicsDevice。 |
繪圖
// スプライトの描画準備
this.spriteBatch.Begin();
// スプライトを描画する
this.spriteBatch.Draw(this.texture, Vector2.Zero, Color.White);
// スプライトの一括描画
this.spriteBatch.End();
在 Draw 方法中繪製文字。
若要繪製 sprite,請使用 「SpriteBatch.Draw」 方法,但需要在繪製之前和之後分別調用 「SpriteBatch.Begin」 和 「SpriteBatch.End」 方法。
SpriteBatch.Draw 方法的第一個參數是您創建的“Texture2D”類。 這將允許您查看導入的圖像檔。
SpriteBatch.Begin
方法
在繪製sprite之前調用它。 在內部,我們正在為繪製sprite進行必要的設置。
SpriteBatch.Draw
方法
將 Sprite 新增到 Sprite 繪製批處理清單中。
質地 | 紋理2D | 指定要顯示為 Sprite 的紋理。 |
位置 | 向量 2 | sprite 應顯示的位置。 在螢幕座標中指定相對於螢幕左上角的座標。 精靈的原點將位於左上角位置。 |
顏色 | 顏色 | 指定顏色以乘以 Sprite 的顏色。 如果指定 Color.White,它將以 Sprite 的原色顯示。 如果指定了 Color.Black,則 sprite 將以全黑顯示,而不管其顏色如何。 公式為“結果 = sprite 顏色 * 顏色”。 |
SpriteBatch.End
方法
繪製所有批處理的sprite。 繪製順序、繪製狀態等在SpriteBatch.Begin方法中指定。 如有必要,呈現狀態將返回到調用SpriteBatch.Begin方法之前的狀態。
在計算機等上使用的顯示器沒有問題,但是從 Xbox 360 輸出到模擬電視時,您可能無法看到左上角顯示的精靈。 在這種情況下,您需要調整 Sprite 的顯示位置,但這將在另一節中解釋。
所有代碼
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 DrawSprite
{
<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();
// スプライトを描画する
this.spriteBatch.Draw(this.texture, Vector2.Zero, Color.White);
// スプライトの一括描画
this.spriteBatch.End();
// 登録された DrawableGameComponent を描画する
base.Draw(gameTime);
}
}
}