OSDN Git Service

#36546 グラフで落ちる:グラフの初期値を入れておくことで暫定処置 画像もうまく表示されなかったため差し替え
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / ドラム画面 / CAct演奏Drumsグラフ.cs
index 30088c6..40f93f9 100644 (file)
@@ -3,299 +3,199 @@ using System.Collections.Generic;
 using System.Text;\r
 using System.Runtime.InteropServices;\r
 using System.Drawing;\r
+using System.IO;\r
 using SlimDX;\r
 using FDK;\r
 \r
 namespace DTXMania\r
 {\r
-       internal class CAct演奏Drumsグラフ : CActivity\r
+       internal class CAct演奏グラフ : CActivity\r
        {\r
-        // #24074 2011.01.23 ikanick グラフの描画\r
-        // 実装内容\r
-        // ・左を現在、右を目標\r
-        // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)\r
-        // ・目標を超えると現在が光る\r
-        // ・オート時には描画しない\r
-        // 要望・実装予定\r
-        // ・グラフを波打たせるなどの視覚の向上→実装済\r
-        // 修正等\r
-        // ・画像がないと落ちる→修正済\r
+               // #24074 2011.01.23 ikanick グラフの描画\r
+               // 実装内容\r
+               // ・左を現在、右を目標\r
+               // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)\r
+               // ・目標を超えると現在が光る\r
+               // ・オート時には描画しない\r
+               // 要望・実装予定\r
+               // ・グラフを波打たせるなどの視覚の向上→実装済\r
+               // 修正等\r
+               // ・画像がないと落ちる→修正済\r
 \r
-               // プロパティ\r
+               public STDGBSValue<double> dbTarget;\r
+               private STDGBSValue<double> dbTargetDisp;\r
+               public STDGBSValue<double> dbCurrent;\r
+               private STDGBSValue<double> dbCurrentDisp;\r
 \r
-        public double dbグラフ値現在_渡\r
-        {\r
-            get\r
-            {\r
-                return this.dbグラフ値現在;\r
-            }\r
-            set\r
-            {\r
-                this.dbグラフ値現在 = value;\r
-            }\r
-        }\r
-        public double dbグラフ値目標_渡\r
-        {\r
-            get\r
-            {\r
-                return this.dbグラフ値目標;\r
-            }\r
-            set\r
-            {\r
-                this.dbグラフ値目標 = value;\r
-            }\r
-        }\r
-               \r
-               // コンストラクタ\r
+               private CTexture txグラフ;\r
+\r
+               private STDGBSValue<CCounter> counterYposInImg;\r
+               private readonly int slices = 10;\r
 \r
-               public CAct演奏Drumsグラフ()\r
+               public CAct演奏グラフ()\r
                {\r
                        base.b活性化してない = true;\r
                }\r
 \r
-\r
-               // CActivity 実装\r
-\r
                public override void On活性化()\r
-        {\r
-            this.dbグラフ値目標 = 80f;\r
-            this.dbグラフ値現在 = 0f;\r
-                       base.On活性化();\r
-               }\r
-               public override void On非活性化()\r
                {\r
-                       base.On非活性化();\r
+                       if (base.b活性化してない)\r
+                       {\r
+                               this.dbTarget = new STDGBSValue<double>();\r
+                               dbTarget.Drums = dbTarget.Guitar = dbTarget.Bass = 80.0;\r
+                               this.dbCurrent = new STDGBSValue<double>();\r
+                               dbCurrent.Drums = dbCurrent.Guitar = dbCurrent.Bass = 0.0;\r
+                               counterYposInImg = new STDGBSValue<CCounter>();\r
+                               base.On活性化();\r
+                       }\r
                }\r
+\r
                public override void OnManagedリソースの作成()\r
                {\r
-                       if( !base.b活性化してない )\r
+                       if (base.b活性化してる)\r
                        {\r
-                this.txグラフ = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay graph.png"));\r
+                               string pathグラフ = CSkin.Path(@"Graphics\ScreenPlay graph.png");\r
+                               if (File.Exists(pathグラフ))\r
+                               {\r
+                                       this.txグラフ = TextureFactory.tテクスチャの生成(pathグラフ);\r
+                               }\r
                                base.OnManagedリソースの作成();\r
                        }\r
                }\r
+\r
                public override void OnManagedリソースの解放()\r
                {\r
-                       if( !base.b活性化してない )\r
+                       if (base.b活性化してる)\r
                        {\r
-                               CDTXMania.tテクスチャの解放( ref this.txグラフ );\r
+                               TextureFactory.tテクスチャの解放(ref this.txグラフ);\r
                                base.OnManagedリソースの解放();\r
                        }\r
                }\r
+\r
                public override int On進行描画()\r
                {\r
-                       if( !base.b活性化してない )\r
+                       if (b活性化してる && !CDTXMania.Instance.ConfigIni.bStoicMode)\r
                        {\r
-                               if( base.b初めての進行描画 )\r
+\r
+                               for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
                                {\r
-                                       for( int k = 0; k < 64; k++ )\r
-                                       {\r
-                                               this.stキラキラ[ k ].x = 0 + CDTXMania.Random.Next( 8 );\r
-                                               this.stキラキラ[ k ].fScale = 1f + ( CDTXMania.Random.Next( 9 ) * 0.2f );\r
-                                               this.stキラキラ[ k ].Trans = 0 + CDTXMania.Random.Next( 32 ) ;\r
-                        if (k < 32)\r
-                        {\r
-                            this.stキラキラ[ k ].ct進行 = new CCounter(0, 230, 10 + CDTXMania.Random.Next(20), CDTXMania.Timer);\r
-                        }\r
-                        else if (k < 64)\r
-                        {\r
-                            this.stキラキラ[ k ].ct進行 = new CCounter(0, 230, 20 + CDTXMania.Random.Next(50), CDTXMania.Timer);\r
-                        }\r
-                        this.stキラキラ[ k ].ct進行.n現在の値 = CDTXMania.Random.Next(230);\r
-                                       }\r
-                                       for( int k = 0; k < 16; k++ )\r
+                                       if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) &&\r
+                                               CDTXMania.Instance.ConfigIni.bGraph[inst] &&\r
+                                               CDTXMania.Instance.DTX.bチップがある[inst])\r
                                        {\r
-                                               this.stフラッシュ[ k ].y = -1;\r
-                                               this.stフラッシュ[ k ].Trans = 0;\r
-                                       }\r
-                                       base.b初めての進行描画 = false;\r
-                }\r
-                // 背景暗幕\r
-                Rectangle rectangle = new Rectangle(22, 0, 1, 1);\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 230f, 1f);\r
-                    this.txグラフ.n透明度 = 128;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88, rectangle);\r
-                }\r
-                \r
-                // 基準線\r
-                rectangle = new Rectangle(20, 0, 1, 1);\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.n透明度 = 32;\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 1f, 1f);\r
-                    for (int i = 0; i < 20; i++)\r
-                    {\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88 + (int)(11.5 * i), rectangle);\r
-                    }\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 230f, 1f);\r
-                    for (int i = 0; i < 2; i++)\r
-                    {\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 349 + i * 18, 88 , rectangle);\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 360 + i * 18, 88 , rectangle);\r
-                    }\r
-                }\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 1f, 1f);\r
-                }\r
-                for (int i = 0; i < 5; i++)\r
-                {\r
-                    // 基準線を越えたら線が黄色くなる\r
-                    if (this.dbグラフ値現在 >= (100 - i * 10))\r
-                    {\r
-                        rectangle = new Rectangle(21, 0, 1, 1);//黄色\r
-                        this.txグラフ.n透明度 = 224;\r
-                    }\r
-                    else\r
-                    {\r
-                        rectangle = new Rectangle(20, 0, 1, 1);\r
-                        this.txグラフ.n透明度 = 160;\r
-                    }\r
 \r
-                    if (this.txグラフ != null)\r
-                    {\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88 + i * 23, rectangle);\r
-                    }\r
-                }\r
-                // グラフ\r
-                // --現在値\r
-                if (this.dbグラフ値現在_表示 < this.dbグラフ値現在)\r
-                {\r
-                    this.dbグラフ値現在_表示 += (this.dbグラフ値現在 - this.dbグラフ値現在_表示) / 5 + 0.01;\r
-                }\r
-                if (this.dbグラフ値現在_表示 >= this.dbグラフ値現在)\r
-                {\r
-                    this.dbグラフ値現在_表示 = this.dbグラフ値現在;\r
-                }\r
-                rectangle = new Rectangle(0, 0, 10, (int)(230f * this.dbグラフ値現在_表示 / 100));\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
-                    this.txグラフ.n透明度 = 192;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 350, 318 - (int)(230f * this.dbグラフ値現在_表示 / 100), rectangle);\r
-                }\r
-                               for( int k = 0; k < 32; k++ )\r
-                               {\r
-                    rectangle = new Rectangle(20, 0, 1, 1);\r
-                    if (this.txグラフ != null)\r
-                    {\r
-                                       this.stキラキラ[ k ].ct進行.t進行Loop();\r
-                        int num1 = (int)this.stキラキラ[ k ].x;\r
-                        int num2 = this.stキラキラ[ k ].ct進行.n現在の値;\r
-                        this.txグラフ.vc拡大縮小倍率 = new Vector3(this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale);\r
-                        this.txグラフ.n透明度 = 138 - 2 * this.stキラキラ[ k ].Trans;\r
-                        if ( num2 < (2.3f * this.dbグラフ値現在_表示) )\r
-                        {\r
-                            this.txグラフ.t2D描画(CDTXMania.app.Device, 350+num1, 318-num2, rectangle);\r
-                        }\r
-                    }\r
-                               }\r
-                // --現在値_追加エフェクト\r
-                if (this.dbグラフ値直前 != this.dbグラフ値現在)\r
-                {\r
-                    this.stフラッシュ[ nグラフフラッシュct ].y = 0;\r
-                    this.stフラッシュ[ nグラフフラッシュct ].Trans = 224;\r
-                    nグラフフラッシュct ++;\r
-                    if (nグラフフラッシュct >= 16)\r
-                    {\r
-                        nグラフフラッシュct = 0;\r
-                    }\r
-                }\r
-                this.dbグラフ値直前 = this.dbグラフ値現在;\r
-                for (int m = 0; m < 16; m++)\r
-                {\r
-                    rectangle = new Rectangle(20, 0, 1, 1);\r
-                    if ((this.stフラッシュ[ m ].y >= 0) && (this.stフラッシュ[ m ].y+3 < (int)(230f * this.dbグラフ値現在_表示 / 100)) && (this.txグラフ != null))\r
-                    {\r
-                        this.txグラフ.vc拡大縮小倍率 = new Vector3(10f, 1f, 1f);\r
-                        this.txグラフ.n透明度 = this.stフラッシュ[ m ].Trans;\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 350, this.stフラッシュ[ m ].y + (318 - (int)(230f * this.dbグラフ値現在_表示 / 100)), rectangle);\r
-                        this.txグラフ.n透明度 = this.stフラッシュ[ m ].Trans;\r
-                        this.txグラフ.t2D描画(CDTXMania.app.Device, 350, this.stフラッシュ[ m ].y + 2 + (318 - (int)(230f * this.dbグラフ値現在_表示 / 100)), rectangle);\r
-                    }\r
-                    this.stフラッシュ[ m ].y += 4;\r
-                    this.stフラッシュ[ m ].Trans -= 4;\r
-                }\r
-                // --現在値_目標越\r
-                rectangle = new Rectangle(0, 0, 10, (int)(230f * this.dbグラフ値現在_表示 / 100));\r
-                if ((dbグラフ値現在 >= dbグラフ値目標) && (this.txグラフ != null))\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1.4f, 1f, 1f);\r
-                    this.txグラフ.n透明度 = 128;\r
-                    this.txグラフ.b加算合成 = true;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 348, 318 - (int)(230f * this.dbグラフ値現在_表示 / 100), rectangle);\r
-                    this.txグラフ.b加算合成 = false;\r
-                }\r
-                // --目標値\r
-                if (this.dbグラフ値目標_表示 < this.dbグラフ値目標)\r
-                {\r
-                    this.dbグラフ値目標_表示 += (this.dbグラフ値目標 - this.dbグラフ値目標_表示) / 5 + 0.01;\r
-                }\r
-                if (this.dbグラフ値目標_表示 >= this.dbグラフ値目標)\r
-                {\r
-                    this.dbグラフ値目標_表示 = this.dbグラフ値目標;\r
-                }\r
-                rectangle = new Rectangle(10, 0, 10, (int)(230f * this.dbグラフ値目標_表示 / 100));\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
-                    this.txグラフ.n透明度 = 192;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 368, 318 - (int)(230f * this.dbグラフ値目標_表示 / 100), rectangle);\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1.4f, 1f, 1f);\r
-                    this.txグラフ.n透明度 = 48;\r
-                    this.txグラフ.b加算合成 = true;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 366, 318 - (int)(230f * this.dbグラフ値目標_表示 / 100), rectangle);\r
-                    this.txグラフ.b加算合成 = false;\r
-                }\r
-                               for( int k = 32; k < 64; k++ )\r
-                               {\r
-                    rectangle = new Rectangle(20, 0, 1, 1);\r
-                    if (this.txグラフ != null)\r
-                    {\r
-                                       this.stキラキラ[ k ].ct進行.t進行Loop();\r
-                        int num1 = (int)this.stキラキラ[ k ].x;\r
-                        int num2 = this.stキラキラ[ k ].ct進行.n現在の値;\r
-                        this.txグラフ.vc拡大縮小倍率 = new Vector3(this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale);\r
-                        this.txグラフ.n透明度 = 138 - 2 * this.stキラキラ[ k ].Trans;\r
-                        if ( num2 < (2.3f * this.dbグラフ値目標_表示) )\r
-                        {\r
-                            this.txグラフ.t2D描画(CDTXMania.app.Device, 368+num1, 318-num2, rectangle);\r
-                        }\r
-                    }\r
-                               }\r
-                \r
-                       }\r
-                       return 0;\r
-               }\r
+                                               if (base.b初めての進行描画)\r
+                                               {\r
+                                                       base.b初めての進行描画 = false;\r
+                                                       counterYposInImg.Drums = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
+                                                       counterYposInImg.Guitar = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
+                                                       counterYposInImg.Bass = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
+                                               }\r
 \r
+                                               counterYposInImg[inst].t進行Loop();\r
+                                               int stYposInImg = counterYposInImg[inst].n現在の値;\r
 \r
-               // その他\r
+                                               int gx = CDTXMania.Instance.ConfigIni.cdInstX[inst][CDTXMania.Instance.ConfigIni.eActiveInst].Value\r
+                                                       + CDTXMania.Instance.Coordinates.Instrument[inst].W;\r
+                                               int gy = 0;\r
 \r
-               #region [ private ]\r
-               //----------------\r
-               [StructLayout( LayoutKind.Sequential )]\r
-               private struct STキラキラ\r
-               {\r
-                       public int x;\r
-                       public int y;\r
-                       public float fScale;\r
-                       public int Trans;\r
-                       public CCounter ct進行;\r
-               }\r
-        private STキラキラ[] stキラキラ = new STキラキラ[ 64 ];\r
-        private STキラキラ[] stフラッシュ = new STキラキラ[ 16 ];\r
+                                               if (this.txグラフ != null)\r
+                                               {\r
+                                                       // 背景暗幕\r
+                                                       this.txグラフ.n透明度 = 128;\r
+                                                       this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;\r
+                                                       this.txグラフ.vc拡大縮小倍率.Y = CDTXMania.Instance.Coordinates.Graph[inst].H;\r
+                                                       this.txグラフ.t2D描画(CDTXMania.Instance.Device, gx, gy, new Rectangle(62, 0, 1, 1));\r
 \r
-        private double dbグラフ値目標;\r
-        private double dbグラフ値目標_表示;\r
-        private double dbグラフ値現在;\r
-        private double dbグラフ値現在_表示;\r
-        private double dbグラフ値直前;\r
-        private int nグラフフラッシュct;\r
+                                                       // 基準線\r
+                                                       this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;\r
+                                                       this.txグラフ.vc拡大縮小倍率.Y = 1f;\r
 \r
-               private CTexture txグラフ;\r
-               //-----------------\r
-               #endregion\r
+                                                       for (int i = 0; i < slices; i++)\r
+                                                       {\r
+                                                               if (this.dbCurrent[inst] < (100 - i * slices))\r
+                                                               {\r
+                                                                       // 通常の基準線(白)\r
+                                                                       this.txグラフ.n透明度 = 128;\r
+                                                                       this.txグラフ.t2D描画(CDTXMania.Instance.Device,\r
+                                                                               gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H * i / slices, new Rectangle(60, 0, 1, 1));\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       // 基準線を越えたら線が黄色くなる\r
+                                                                       this.txグラフ.n透明度 = 224;\r
+                                                                       this.txグラフ.t2D描画(CDTXMania.Instance.Device,\r
+                                                                               gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H * i / slices, new Rectangle(61, 0, 1, 1));\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // グラフのゲージ部分\r
+\r
+                                                       // --現在値\r
+                                                       this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
+\r
+                                                       if (this.dbCurrentDisp[inst] < this.dbCurrent[inst])\r
+                                                       {\r
+                                                               this.dbCurrentDisp[inst] += (this.dbCurrent[inst] - this.dbCurrentDisp[inst]) / 5 + 0.01;\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               this.dbCurrentDisp[inst] = this.dbCurrent[inst];\r
+                                                       }\r
+                                                       int ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbCurrentDisp[inst] / 100.0);\r
+\r
+                                                       this.txグラフ.n透明度 = 224;\r
+                                                       this.txグラフ.t2D描画(\r
+                                                               CDTXMania.Instance.Device,\r
+                                                               gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
+                                                               new Rectangle(0, 5 + stYposInImg, 30, ar)\r
+                                                       );\r
+                                                       this.txグラフ.t2D描画( // 上部白いバー\r
+                                                               CDTXMania.Instance.Device,\r
+                                                               gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
+                                                               new Rectangle(63 + 0, 0, 30, 5)\r
+                                                       );\r
+\r
+                                                       // 目標を超えた時に発光?させる\r
+                                                       if ((dbCurrent[inst] >= dbTarget[inst]))\r
+                                                       {\r
+                                                               this.txグラフ.n透明度 = 128;\r
+                                                               this.txグラフ.b加算合成 = true;\r
+                                                               this.txグラフ.t2D描画(\r
+                                                                       CDTXMania.Instance.Device,\r
+                                                                       gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
+                                                                       new Rectangle(0, 5 + stYposInImg, 30, ar)\r
+                                                               );\r
+                                                               this.txグラフ.b加算合成 = false;\r
+                                                       }\r
+\r
+                                                       // --目標値\r
+                                                       if (this.dbTargetDisp[inst] < this.dbTarget[inst])\r
+                                                       {\r
+                                                               this.dbTargetDisp[inst] += (this.dbTarget[inst] - this.dbTargetDisp[inst]) / 5 + 0.01;\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               this.dbTargetDisp[inst] = this.dbTarget[inst];\r
+                                                       }\r
+                                                       ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbTargetDisp[inst] / 100.0);\r
+                                                       \r
+                                                       this.txグラフ.n透明度 = 224;\r
+                                                       this.txグラフ.t2D描画(\r
+                                                               CDTXMania.Instance.Device,\r
+                                                               gx + 30,\r
+                                                               gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
+                                                               new Rectangle(30, 5 + stYposInImg, 30, ar)\r
+                                                       );\r
+                                                       this.txグラフ.t2D描画( // 上部白いバー\r
+                                                               CDTXMania.Instance.Device, gx + 30, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
+                                                               new Rectangle(63 + 30, 0, 30, 5)\r
+                                                       );\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       return 0;\r
+               }\r
        }\r
 }\r