OSDN Git Service

#36546 グラフで落ちる:グラフの初期値を入れておくことで暫定処置 画像もうまく表示されなかったため差し替え
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / ドラム画面 / CAct演奏Drumsグラフ.cs
index d31b7f1..40f93f9 100644 (file)
@@ -3,160 +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
-               // プロパティ\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
-\r
-               public CAct演奏Drumsグラフ()\r
+               // #24074 2011.01.23 ikanick グラフの描画\r
+               // 実装内容\r
+               // ・左を現在、右を目標\r
+               // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)\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
+               private CTexture txグラフ;\r
+\r
+               private STDGBSValue<CCounter> counterYposInImg;\r
+               private readonly int slices = 10;\r
+\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
-                                       base.b初めての進行描画 = false;\r
-                }\r
-                // 背景暗幕\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.n透明度 = 128;\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 230f, 1f);\r
-                }\r
-                Rectangle rectangle = new Rectangle(22, 0, 1, 1);\r
-                this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88, rectangle);\r
-                \r
-                // 基準線\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.n透明度 = 192;\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 1f, 1f);\r
-                }\r
-                for (int i = 0; i < 4; i++)\r
-                {\r
-                    // 基準線を越えたら黄色くなる\r
-                    if (this.dbグラフ値現在 >= (100 - i * 10))\r
-                    {\r
-                        rectangle = new Rectangle(21, 0, 1, 1);\r
-                    }\r
-                    else\r
-                    {\r
-                        rectangle = new Rectangle(20, 0, 1, 1);\r
-                    }\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88+i*23, rectangle);\r
-                }\r
-\r
-                // グラフ\r
-                // --現在値\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.n透明度 = 192;\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
-                }\r
-                rectangle = new Rectangle(0, 0, 10, (int)(230f * this.dbグラフ値現在 / 100));\r
-                this.txグラフ.t2D描画(CDTXMania.app.Device, 350, 318 - (int)(230f * this.dbグラフ値現在 / 100), rectangle);\r
-                if (dbグラフ値現在 >= dbグラフ値目標)\r
-                {\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1.2f, 1f, 1f);\r
-                    this.txグラフ.n透明度 = 64;\r
-                    this.txグラフ.b加算合成 = true;\r
-                    this.txグラフ.t2D描画(CDTXMania.app.Device, 349, 318 - (int)(230f * this.dbグラフ値現在 / 100), rectangle);\r
-                }\r
-                // --目標値\r
-                if (this.txグラフ != null)\r
-                {\r
-                    this.txグラフ.n透明度 = 192;\r
-                    this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
-                    this.txグラフ.b加算合成 = false;\r
-                }\r
-                rectangle = new Rectangle(10, 0, 10, (int)(230f * this.dbグラフ値目標 / 100));\r
-                this.txグラフ.t2D描画(CDTXMania.app.Device, 368, 318 - (int)(230f * this.dbグラフ値目標 / 100), rectangle);\r
-                \r
-                       }\r
-                       return 0;\r
-               }\r
+                                       if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) &&\r
+                                               CDTXMania.Instance.ConfigIni.bGraph[inst] &&\r
+                                               CDTXMania.Instance.DTX.bチップがある[inst])\r
+                                       {\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
-               // その他\r
+                                               counterYposInImg[inst].t進行Loop();\r
+                                               int stYposInImg = counterYposInImg[inst].n現在の値;\r
 \r
-               #region [ private ]\r
-               //----------------\r
-        private double dbグラフ値目標;\r
-        private double dbグラフ値現在;\r
-               private CTexture txグラフ;\r
-               //-----------------\r
-               #endregion\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
+                                               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
+                                                       // 基準線\r
+                                                       this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;\r
+                                                       this.txグラフ.vc拡大縮小倍率.Y = 1f;\r
+\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