OSDN Git Service

78a131c1f33187e9c2026348b20706fb38f159de
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / ドラム画面 / CAct演奏Drumsグラフ.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime.InteropServices;\r
5 using System.Drawing;\r
6 using System.IO;\r
7 using SlimDX;\r
8 using FDK;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         internal class CAct演奏グラフ : CActivity\r
13         {\r
14                 // #24074 2011.01.23 ikanick グラフの描画\r
15                 // 実装内容\r
16                 // ・左を現在、右を目標\r
17                 // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)\r
18                 // ・目標を超えると現在が光る\r
19                 // ・オート時には描画しない\r
20                 // 要望・実装予定\r
21                 // ・グラフを波打たせるなどの視覚の向上→実装済\r
22                 // 修正等\r
23                 // ・画像がないと落ちる→修正済\r
24 \r
25                 public STDGBSValue<double> dbTarget;\r
26                 private STDGBSValue<double> dbTargetDisp;\r
27                 public STDGBSValue<double> dbCurrent;\r
28                 private STDGBSValue<double> dbCurrentDisp;\r
29 \r
30                 private CTexture txグラフ;\r
31 \r
32                 private STDGBSValue<CCounter> counterYposInImg;\r
33                 private readonly int slices = 10;\r
34 \r
35                 public CAct演奏グラフ()\r
36                 {\r
37                         base.b活性化してない = true;\r
38                 }\r
39 \r
40                 public override void On活性化()\r
41                 {\r
42                         if (base.b活性化してない)\r
43                         {\r
44                                 this.dbTarget = new STDGBSValue<double>();\r
45                                 dbTarget.Drums = dbTarget.Guitar = dbTarget.Bass = 80.0;\r
46                                 this.dbCurrent = new STDGBSValue<double>();\r
47                                 dbCurrent.Drums = dbCurrent.Guitar = dbCurrent.Bass = 0.0;\r
48                                 counterYposInImg = new STDGBSValue<CCounter>();\r
49                                 base.On活性化();\r
50                         }\r
51                 }\r
52 \r
53                 public override void OnManagedリソースの作成()\r
54                 {\r
55                         if (base.b活性化してる)\r
56                         {\r
57                                 string pathグラフ = CSkin.Path(@"Graphics\ScreenPlay graph.png");\r
58                                 if (File.Exists(pathグラフ))\r
59                                 {\r
60                                         this.txグラフ = TextureFactory.tテクスチャの生成(pathグラフ);\r
61                                 }\r
62                                 base.OnManagedリソースの作成();\r
63                         }\r
64                 }\r
65 \r
66                 public override void OnManagedリソースの解放()\r
67                 {\r
68                         if (base.b活性化してる)\r
69                         {\r
70                                 TextureFactory.tテクスチャの解放(ref this.txグラフ);\r
71                                 base.OnManagedリソースの解放();\r
72                         }\r
73                 }\r
74 \r
75                 public override int On進行描画()\r
76                 {\r
77                         if (b活性化してる && !CDTXMania.Instance.ConfigIni.bStoicMode)\r
78                         {\r
79 \r
80                                 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
81                                 {\r
82                                         if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) &&\r
83                                                 CDTXMania.Instance.ConfigIni.bGraph[inst] &&\r
84                                                 CDTXMania.Instance.DTX.bチップがある[inst])\r
85                                         {\r
86 \r
87                                                 if (base.b初めての進行描画)\r
88                                                 {\r
89                                                         base.b初めての進行描画 = false;\r
90                                                         counterYposInImg.Drums = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
91                                                         counterYposInImg.Guitar = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
92                                                         counterYposInImg.Bass = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);\r
93                                                 }\r
94 \r
95                                                 counterYposInImg[inst].t進行Loop();\r
96                                                 int stYposInImg = counterYposInImg[inst].n現在の値;\r
97 \r
98                                                 int gx = CDTXMania.Instance.ConfigIni.cdInstX[inst][CDTXMania.Instance.ConfigIni.eActiveInst].Value\r
99                                                         + CDTXMania.Instance.Coordinates.Instrument[inst].W;\r
100                                                 int gy = 0;\r
101 \r
102                                                 // 背景暗幕\r
103                                                 if (this.txグラフ != null)\r
104                                                 {\r
105                                                         this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;\r
106                                                         this.txグラフ.vc拡大縮小倍率.Y = CDTXMania.Instance.Coordinates.Graph[inst].H;\r
107 \r
108                                                         this.txグラフ.n透明度 = 128;\r
109                                                         this.txグラフ.t2D描画(CDTXMania.Instance.Device, gx, gy, new Rectangle(62, 0, 1, 1));\r
110 \r
111                                                         // 基準線\r
112 \r
113                                                         this.txグラフ.n透明度 = 128;\r
114                                                         this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;\r
115                                                         this.txグラフ.vc拡大縮小倍率.Y = 1f;\r
116 \r
117                                                         for (int i = 0; i < slices; i++)\r
118                                                         {\r
119                                                                 this.txグラフ.t2D描画(CDTXMania.Instance.Device,\r
120                                                                         gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H * i / slices, new Rectangle(60, 0, 1, 1));\r
121                                                         }\r
122 \r
123                                                         for (int i = 0; i < 5; i++)\r
124                                                         {\r
125                                                                 Rectangle rectangle;\r
126                                                                 // 基準線を越えたら線が黄色くなる\r
127                                                                 if (this.dbCurrent[inst] >= (100 - i * slices))\r
128                                                                 {\r
129                                                                         rectangle = new Rectangle(61, 0, 1, 1); //黄色\r
130                                                                         if (this.txグラフ != null)\r
131                                                                         {\r
132                                                                                 this.txグラフ.n透明度 = 224;\r
133                                                                         }\r
134                                                                 }\r
135                                                                 else\r
136                                                                 {\r
137                                                                         rectangle = new Rectangle(60, 0, 1, 1);\r
138                                                                         if (this.txグラフ != null)\r
139                                                                         {\r
140                                                                                 this.txグラフ.n透明度 = 160;\r
141                                                                         }\r
142                                                                 }\r
143 \r
144                                                                 if (this.txグラフ != null)\r
145                                                                 {\r
146                                                                         this.txグラフ.t2D描画(\r
147                                                                                 CDTXMania.Instance.Device,\r
148                                                                                 gx, gy + i * CDTXMania.Instance.Coordinates.Graph[inst].H / slices,\r
149                                                                                 rectangle\r
150                                                                                 );\r
151                                                                 }\r
152                                                         }\r
153 \r
154                                                         // グラフ\r
155                                                         // --現在値\r
156                                                         if (this.dbCurrentDisp[inst] < this.dbCurrent[inst])\r
157                                                         {\r
158                                                                 this.dbCurrentDisp[inst] += (this.dbCurrent[inst] - this.dbCurrentDisp[inst]) / 5 + 0.01;\r
159                                                         }\r
160                                                         if (this.dbCurrentDisp[inst] >= this.dbCurrent[inst])\r
161                                                         {\r
162                                                                 this.dbCurrentDisp[inst] = this.dbCurrent[inst];\r
163                                                         }\r
164                                                         int ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbCurrentDisp[inst] / 100.0);\r
165 \r
166                                                         this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
167                                                         this.txグラフ.n透明度 = 255;\r
168                                                         this.txグラフ.t2D描画(\r
169                                                                 CDTXMania.Instance.Device,\r
170                                                                 gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
171                                                                 new Rectangle(0, 5 + stYposInImg, 30, ar)\r
172                                                                 );\r
173                                                         this.txグラフ.t2D描画( // 上部白いバー\r
174                                                                 CDTXMania.Instance.Device,\r
175                                                                 gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
176                                                                 new Rectangle(0, 0, 30, 5)\r
177                                                         );\r
178 \r
179                                                         // --現在値_目標越\r
180                                                         if ((dbCurrent[inst] >= dbTarget[inst]))\r
181                                                         {\r
182                                                                 // this.txグラフ.vc拡大縮小倍率 = new Vector3(1.4f, 1f, 1f);\r
183                                                                 this.txグラフ.n透明度 = 128;\r
184                                                                 this.txグラフ.b加算合成 = true;\r
185                                                                 this.txグラフ.t2D描画(\r
186                                                                         CDTXMania.Instance.Device,\r
187                                                                         gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
188                                                                         new Rectangle(0, 5 + stYposInImg, 30, ar)\r
189                                                                         );\r
190                                                                 this.txグラフ.b加算合成 = false;\r
191                                                         }\r
192                                                         // --目標値\r
193                                                         if (this.dbTargetDisp[inst] < this.dbTarget[inst])\r
194                                                         {\r
195                                                                 this.dbTargetDisp[inst] += (this.dbTarget[inst] - this.dbTargetDisp[inst]) / 5 + 0.01;\r
196                                                         }\r
197                                                         if (this.dbTargetDisp[inst] >= this.dbTarget[inst])\r
198                                                         {\r
199                                                                 this.dbTargetDisp[inst] = this.dbTarget[inst];\r
200                                                         }\r
201                                                         ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbTargetDisp[inst] / 100.0);\r
202 \r
203                                                         this.txグラフ.t2D描画(\r
204                                                                 CDTXMania.Instance.Device,\r
205                                                                 gx + 30,\r
206                                                                 gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
207                                                                 new Rectangle(30, 5 + stYposInImg, 30, ar)\r
208                                                                 );\r
209                                                         this.txグラフ.n透明度 = 255;\r
210                                                         this.txグラフ.t2D描画( // 上部白いバー\r
211                                                                 CDTXMania.Instance.Device, gx + 30, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,\r
212                                                                 new Rectangle(30, 0, 30, 5)\r
213                                                         );\r
214                                                 }\r
215                                         }\r
216                                 }\r
217                         }\r
218                         return 0;\r
219                 }\r
220         }\r
221 }\r