使sprite顯示

更新頁 :
頁面創建日期 :

總結

載入紋理(圖像)並將其顯示在螢幕上。

スプライトを表示させる

經營環境

先決條件

支援的 XNA 版本
  • 2.0
  • 3.0
  • 3.1
  • 4.0
支援的平臺
  • Windows(XP SP2 或更高版本、Vista、7)
  • Xbox 360 的
  • Windows Phone 7 系列
Windows 所需的頂點著色器版本 2.0
Windows 所需的像素著色器版本 2.0

經營環境

平臺
  • 視窗 7
  • Xbox 360 的
  • Windows Phone 7 模擬器

物質

什麼是Sprite?

用於在螢幕上繪製圖像的矩形區域。 此功能經常用於 2D 遊戲,但在 3D 中也經常用作偽 2D 圖像繪圖。

在 XNA 中,所有內容都必須以 3D 多邊形繪製,因此在螢幕上繪製的圖像是使用多邊形的偽 Sprite。 但是,無需注意多邊形,您可以輕鬆繪製它們。

準備圖像

由於會顯示圖像,因此必須準備圖像檔。 在此示例中,使用了下圖。

スプライトとして表示させる画像

我正在使用大小為 128×128 的 PNG 檔,但它可以是任何大小。 此外,可以讀取的圖片檔格式預設為以下檔。

  • .bmp
  • .dds
  • .dib 功能變數名稱
  • .hdr
  • .jpg
  • .pfm
  • .png
  • .ppm
  • .tga 功能變數名稱

將圖像添加到專案

在示例中,圖像檔被放入 「Content」 專案中。 有關如何將圖像檔添加到專案的詳細資訊,請參閱以下頁面。

プロジェクトに Texture.png を追加

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