Esempio n. 1
0
        //* -----------------------------------------------------------------------*
        /// <summary>描画処理を予約します。</summary>
        ///
        /// <param name="spriteFont">スプライトフォント テクスチャ</param>
        /// <param name="text">描画したいテキスト</param>
        /// <param name="pos">座標</param>
        /// <param name="color">色</param>
        /// <param name="fRotate">回転(ラジアン)</param>
        /// <param name="origin">原点座標</param>
        /// <param name="scale">拡大率</param>
        /// <param name="effects">反転効果</param>
        /// <param name="fLayer">レイヤ番号</param>
        public void add(
            SpriteFont spriteFont, string text, Vector2 pos, Color color, float fRotate,
            Vector2 origin, Vector2 scale, SpriteEffects effects, float fLayer
            )
        {
            SSpriteDrawInfo info = new SSpriteDrawInfo();

            info.initialize();
            info.spriteFont = spriteFont;
            info.text       = text;
            info.position   = resolution == null ? pos : resolution.resizeFromVGA(pos);
            info.color      = color;
            info.fRotation  = fRotate;
            info.origin     = origin;
            if (resolution == null)
            {
                info.scale = scale;
            }
            else
            {
                if (resolution.GetType() == typeResAF || resolution.GetType().IsSubclassOf(typeResAF))
                {
                    CResolutionAspectFix res = (CResolutionAspectFix)resolution;
                    info.scale = scale * res.scaleGapFromVGA;
                }
                else
                {
                    info.scale = scale * resolution.scaleGapFromVGA;
                }
            }
            info.effects     = effects;
            info.fLayerDepth = fLayer;
            setReserve(info);
        }
Esempio n. 2
0
 //* -----------------------------------------------------------------------*
 /// <summary>予約された描画処理を実行します。</summary>
 public void draw()
 {
     if (spriteBatch == null)
     {
         throw new InvalidOperationException("描画に使用するSpriteBatchがありません。");
     }
     drawCache.Sort(0, reservedCount, null);
     for (int i = 0; i < reservedCount; i++)
     {
         SSpriteDrawInfo info = drawCache[i];
         changeMode(info);
         if (info.spriteFont == null)
         {
             Rectangle rectDst = info.destinationRectangle;
             spriteBatch.Draw(info.texture, rectDst,
                              info.sourceRectangle, info.color, info.fRotation,
                              info.origin, info.effects, info.fLayerDepth);
         }
         else
         {
             spriteBatch.DrawString(info.spriteFont, info.text,
                                    info.position, info.color, info.fRotation, info.origin,
                                    info.scale, info.effects, info.fLayerDepth);
         }
     }
     maxReserved = Math.Max(maxReserved, reservedCount);
     resetMode();
     reservedCount = 0;
 }
Esempio n. 3
0
 //* -----------------------------------------------------------------------*
 /// <summary>描画予約を設定します。</summary>
 ///
 /// <param name="info">描画する情報</param>
 private void setReserve(SSpriteDrawInfo info)
 {
     if (reservedCount >= drawCache.Count)
     {
         if (reservedCount < reserveLimit)
         {
             drawCache.Add(info);
         }
     }
     else
     {
         drawCache[reservedCount] = info;
     }
     reservedCount++;
 }
Esempio n. 4
0
 //* -----------------------------------------------------------------------*
 /// <summary>描画モードを変更します。</summary>
 ///
 /// <param name="info">次に描画する情報</param>
 private void changeMode(SSpriteDrawInfo info)
 {
     if (!spriteBatch.IsDisposed)
     {
         if (m_drawMode.isBegin && (m_drawMode.blendMode != info.blendMode))
         {
             spriteBatch.End();
             m_drawMode.isBegin = false;
         }
         if (!m_drawMode.isBegin)
         {
             spriteBatch.Begin(info.blendMode, SpriteSortMode.FrontToBack, SaveStateMode.None);
             m_drawMode.isBegin   = true;
             m_drawMode.blendMode = info.blendMode;
             spriteBatch.GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;
             spriteBatch.GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;
         }
     }
 }
Esempio n. 5
0
        //* -----------------------------------------------------------------------*
        /// <summary>描画処理を予約します。</summary>
        ///
        /// <param name="tex">テクスチャ</param>
        /// <param name="dstRect">描画先矩形</param>
        /// <param name="srcRect">描画元矩形</param>
        /// <param name="color">色</param>
        /// <param name="fRotate">回転(ラジアン)</param>
        /// <param name="origin">原点座標</param>
        /// <param name="effects">反転効果</param>
        /// <param name="fLayer">レイヤ番号</param>
        /// <param name="blend">合成モード</param>
        public void add(
            Texture2D tex, Rectangle dstRect, Rectangle srcRect, Color color, float fRotate,
            Vector2 origin, SpriteEffects effects, float fLayer, SpriteBlendMode blend
            )
        {
            SSpriteDrawInfo info = new SSpriteDrawInfo();

            info.initialize();
            info.texture = tex;
            info.destinationRectangle = resolution.convertRectangle(dstRect);
            info.sourceRectangle      = srcRect;
            info.color       = color;
            info.fRotation   = fRotate + resolution.rotate;
            info.origin      = origin;
            info.effects     = effects;
            info.fLayerDepth = fLayer;
            info.blendMode   = blend;
            _private.drawCache.Add(info);
        }
Esempio n. 6
0
        //* -----------------------------------------------------------------------*
        /// <summary>描画処理を予約します。</summary>
        ///
        /// <param name="tex">テクスチャ</param>
        /// <param name="dstRect">描画先矩形</param>
        /// <param name="srcRect">描画元矩形</param>
        /// <param name="color">色</param>
        /// <param name="fRotate">回転(ラジアン)</param>
        /// <param name="origin">原点座標</param>
        /// <param name="effects">反転効果</param>
        /// <param name="fLayer">レイヤ番号</param>
        /// <param name="blend">合成モード</param>
        public void add(
            Texture2D tex, Rectangle dstRect, Rectangle srcRect, Color color, float fRotate,
            Vector2 origin, SpriteEffects effects, float fLayer, SpriteBlendMode blend
            )
        {
            SSpriteDrawInfo info = SSpriteDrawInfo.initialized;

            info.texture = tex;
            info.destinationRectangle = resolution == null ?
                                        dstRect : resolution.resizeFromVGA(dstRect);
            info.sourceRectangle = srcRect;
            info.color           = color;
            info.fRotation       = fRotate -
                                   (resolution != null && resolution.vertical ? 0 : 0);
            info.origin      = origin;
            info.effects     = effects;
            info.fLayerDepth = fLayer;
            info.blendMode   = blend;
            setReserve(info);
        }
Esempio n. 7
0
        //* -----------------------------------------------------------------------*
        /// <summary>描画処理を予約します。</summary>
        ///
        /// <param name="spriteFont">スプライトフォント テクスチャ</param>
        /// <param name="text">描画したいテキスト</param>
        /// <param name="pos">座標</param>
        /// <param name="color">色</param>
        /// <param name="fRotate">回転(ラジアン)</param>
        /// <param name="origin">原点座標</param>
        /// <param name="scale">拡大率</param>
        /// <param name="effects">反転効果</param>
        /// <param name="fLayer">レイヤ番号</param>
        /// <param name="blend">合成モード</param>
        public void add(
            SpriteFont spriteFont, string text, Vector2 pos, Color color, float fRotate,
            Vector2 origin, Vector2 scale, SpriteEffects effects, float fLayer,
            SpriteBlendMode blend
            )
        {
            SSpriteDrawInfo info = new SSpriteDrawInfo();

            info.initialize();
            info.spriteFont  = spriteFont;
            info.text        = text;
            info.position    = resolution.convertPosition(pos);
            info.color       = color;
            info.fRotation   = fRotate + resolution.rotate;
            info.origin      = origin;
            info.blendMode   = blend;
            info.scale       = scale * resolution.scale;
            info.effects     = effects;
            info.fLayerDepth = fLayer;
            _private.drawCache.Add(info);
        }
Esempio n. 8
0
 //* -----------------------------------------------------------------------*
 /// <summary>描画モードを変更します。</summary>
 ///
 /// <param name="spriteBatch">スプライト バッチ。</param>
 /// <param name="info">次に描画する情報</param>
 private void changeMode(SpriteBatch spriteBatch, SSpriteDrawInfo info)
 {
     if (!spriteBatch.IsDisposed)
     {
         if (m_drawMode.isBegin && m_drawMode.changeDrawMode(info))
         {
             spriteBatch.End();
             m_drawMode.isBegin = false;
         }
         if (!m_drawMode.isBegin)
         {
             SpriteSortMode sortmode = info.addressMode == TextureAddressMode.Clamp ?
                                       SpriteSortMode.Deferred : SpriteSortMode.Immediate;
             spriteBatch.Begin(info.blendMode, sortmode, SaveStateMode.None);
             m_drawMode.isBegin     = true;
             m_drawMode.blendMode   = info.blendMode;
             m_drawMode.addressMode = info.addressMode;
             spriteBatch.GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;
             spriteBatch.GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;
         }
     }
 }
Esempio n. 9
0
        //* -----------------------------------------------------------------------*
        /// <summary>描画処理を予約します。</summary>
        ///
        /// <param name="spriteFont">スプライトフォント テクスチャ</param>
        /// <param name="text">描画したいテキスト</param>
        /// <param name="pos">座標</param>
        /// <param name="color">色</param>
        /// <param name="rotate">回転(ラジアン)</param>
        /// <param name="origin">原点座標</param>
        /// <param name="scale">拡大率</param>
        /// <param name="effects">反転効果</param>
        /// <param name="layer">重ね合わせ深度。</param>
        /// <param name="blend">合成モード</param>
        /// <exception cref="System.ArgumentNullException">
        /// <paramref name="text"/>が<c>null</c>と等しい場合。
        /// </exception>
        public void add(
            SpriteFont spriteFont, string text, Vector2 pos, Color color, float rotate,
            Vector2 origin, Vector2 scale, SpriteEffects effects, float layer,
            SpriteBlendMode blend)
        {
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }
            SSpriteDrawInfo info = SSpriteDrawInfo.initialized;

            info.spriteFont  = spriteFont;
            info.text        = text;
            info.position    = resolution.convertPosition(pos);
            info.color       = color;
            info.fRotation   = rotate + resolution.rotate;
            info.origin      = origin;
            info.blendMode   = blend;
            info.scale       = scale * resolution.scale;
            info.effects     = effects;
            info.fLayerDepth = layer;
            _private.drawCache.Add(info);
        }
Esempio n. 10
0
        //* -----------------------------------------------------------------------*
        /// <summary>1フレーム分の描画処理を実行します。</summary>
        ///
        /// <param name="entity">この状態を適用されているオブジェクト。</param>
        /// <param name="privateMembers">
        /// オブジェクトと状態クラスのみがアクセス可能なフィールド。
        /// </param>
        /// <param name="gameTime">前フレームが開始してからの経過時間。</param>
        public override void draw(
            CSpriteManager entity, CSpriteManager.CPrivateMembers privateMembers, GameTime gameTime)
        {
            SpriteBatch spriteBatch = entity.spriteBatch;

            if (spriteBatch == null)
            {
                throw new InvalidOperationException("描画に使用するSpriteBatchがありません。");
            }
            List <SSpriteDrawInfo> drawCache = privateMembers.drawCache;
            int length = drawCache.Count;

            privateMembers.drawCache.Sort();

            for (int i = length; --i >= 0;)
            {
                SSpriteDrawInfo info = drawCache[i];
                changeMode(spriteBatch, info);
                if (info.spriteFont == null)
                {
                    spriteBatch.Draw(info.texture, info.destinationRectangle,
                                     info.sourceRectangle, info.color, info.fRotation,
                                     info.origin, info.effects, info.fLayerDepth);
                }
                else
                {
                    spriteBatch.DrawString(info.spriteFont, info.text,
                                           info.position, info.color, info.fRotation, info.origin,
                                           info.scale, info.effects, info.fLayerDepth);
                }
            }
            privateMembers.maxReserved =
                Math.Max(privateMembers.maxReserved, length);
            resetMode(spriteBatch);
            privateMembers.drawCache.Clear();
        }
Esempio n. 11
0
            //* ────________________________________*
            //* methods ───────────────────────────────-*

            //* -----------------------------------------------------------------------*
            /// <summary>描画状態を変更すべきかどうかを判定します。</summary>
            ///
            /// <param name="info">描画情報。</param>
            /// <returns>描画状態を変更すべき場合、<c>true</c>。</returns>
            public bool changeDrawMode(SSpriteDrawInfo info)
            {
                return(!(
                           blendMode == info.blendMode &&
                           addressMode == info.addressMode));
            }