OSDN Git Service

#24074 グラフで泡っぽいのと簡易エフェクトの追加。
[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 SlimDX;\r
7 using FDK;\r
8 \r
9 namespace DTXMania\r
10 {\r
11         internal class CAct演奏Drumsグラフ : CActivity\r
12         {\r
13         // #24074 2011.01.23 ikanick グラフの描画\r
14         // 実装内容\r
15         // ・左を現在、右を目標\r
16         // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)\r
17         // ・目標を超えると現在が光る\r
18         // ・オート時には描画しない\r
19         // 要望・実装予定\r
20         // ・グラフを波打たせるなどの視覚の向上→実装済\r
21         // 修正等\r
22         // ・画像がないと落ちる→修正済\r
23 \r
24                 // プロパティ\r
25 \r
26         public double dbグラフ値現在_渡\r
27         {\r
28             get\r
29             {\r
30                 return this.dbグラフ値現在;\r
31             }\r
32             set\r
33             {\r
34                 this.dbグラフ値現在 = value;\r
35             }\r
36         }\r
37         public double dbグラフ値目標_渡\r
38         {\r
39             get\r
40             {\r
41                 return this.dbグラフ値目標;\r
42             }\r
43             set\r
44             {\r
45                 this.dbグラフ値目標 = value;\r
46             }\r
47         }\r
48                 \r
49                 // コンストラクタ\r
50 \r
51                 public CAct演奏Drumsグラフ()\r
52                 {\r
53                         base.b活性化してない = true;\r
54                 }\r
55 \r
56 \r
57                 // CActivity 実装\r
58 \r
59                 public override void On活性化()\r
60         {\r
61             this.dbグラフ値目標 = 80f;\r
62             this.dbグラフ値現在 = 0f;\r
63                         base.On活性化();\r
64                 }\r
65                 public override void On非活性化()\r
66                 {\r
67                         base.On非活性化();\r
68                 }\r
69                 public override void OnManagedリソースの作成()\r
70                 {\r
71                         if( !base.b活性化してない )\r
72                         {\r
73                 this.txグラフ = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay graph.png"));\r
74                                 base.OnManagedリソースの作成();\r
75                         }\r
76                 }\r
77                 public override void OnManagedリソースの解放()\r
78                 {\r
79                         if( !base.b活性化してない )\r
80                         {\r
81                                 CDTXMania.tテクスチャの解放( ref this.txグラフ );\r
82                                 base.OnManagedリソースの解放();\r
83                         }\r
84                 }\r
85                 public override int On進行描画()\r
86                 {\r
87                         if( !base.b活性化してない )\r
88                         {\r
89                                 if( base.b初めての進行描画 )\r
90                                 {\r
91                                         for( int k = 0; k < 64; k++ )\r
92                                         {\r
93                                                 this.stキラキラ[ k ].x = 0 + CDTXMania.Random.Next( 8 );\r
94                                                 this.stキラキラ[ k ].fScale = 1f + ( CDTXMania.Random.Next( 9 ) * 0.2f );\r
95                                                 this.stキラキラ[ k ].Trans = 0 + CDTXMania.Random.Next( 32 ) ;\r
96                         if (k < 32)\r
97                         {\r
98                             this.stキラキラ[ k ].ct進行 = new CCounter(0, 230, 10 + CDTXMania.Random.Next(20), CDTXMania.Timer);\r
99                         }\r
100                         else if (k < 64)\r
101                         {\r
102                             this.stキラキラ[ k ].ct進行 = new CCounter(0, 230, 20 + CDTXMania.Random.Next(50), CDTXMania.Timer);\r
103                         }\r
104                         this.stキラキラ[ k ].ct進行.n現在の値 = CDTXMania.Random.Next(230);\r
105                                         }\r
106                                         for( int k = 0; k < 16; k++ )\r
107                                         {\r
108                                                 this.stフラッシュ[ k ].y = -1;\r
109                                                 this.stフラッシュ[ k ].Trans = 0;\r
110                                         }\r
111                                         base.b初めての進行描画 = false;\r
112                 }\r
113                 // 背景暗幕\r
114                 Rectangle rectangle = new Rectangle(22, 0, 1, 1);\r
115                 if (this.txグラフ != null)\r
116                 {\r
117                     this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 230f, 1f);\r
118                     this.txグラフ.n透明度 = 128;\r
119                     this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88, rectangle);\r
120                 }\r
121                 \r
122                 // 基準線\r
123                 rectangle = new Rectangle(20, 0, 1, 1);\r
124                 if (this.txグラフ != null)\r
125                 {\r
126                     this.txグラフ.n透明度 = 32;\r
127                     this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 1f, 1f);\r
128                     for (int i = 0; i < 20; i++)\r
129                     {\r
130                         this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88 + (int)(11.5 * i), rectangle);\r
131                     }\r
132                     this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 230f, 1f);\r
133                     for (int i = 0; i < 2; i++)\r
134                     {\r
135                         this.txグラフ.t2D描画(CDTXMania.app.Device, 349 + i * 18, 88 , rectangle);\r
136                         this.txグラフ.t2D描画(CDTXMania.app.Device, 360 + i * 18, 88 , rectangle);\r
137                     }\r
138                 }\r
139                 if (this.txグラフ != null)\r
140                 {\r
141                     this.txグラフ.vc拡大縮小倍率 = new Vector3(38f, 1f, 1f);\r
142                 }\r
143                 for (int i = 0; i < 5; i++)\r
144                 {\r
145                     // 基準線を越えたら線が黄色くなる\r
146                     if (this.dbグラフ値現在 >= (100 - i * 10))\r
147                     {\r
148                         rectangle = new Rectangle(21, 0, 1, 1);//黄色\r
149                         this.txグラフ.n透明度 = 224;\r
150                     }\r
151                     else\r
152                     {\r
153                         rectangle = new Rectangle(20, 0, 1, 1);\r
154                         this.txグラフ.n透明度 = 160;\r
155                     }\r
156 \r
157                     if (this.txグラフ != null)\r
158                     {\r
159                         this.txグラフ.t2D描画(CDTXMania.app.Device, 345, 88 + i * 23, rectangle);\r
160                     }\r
161                 }\r
162                 // グラフ\r
163                 // --現在値\r
164                 if (this.dbグラフ値現在_表示 < this.dbグラフ値現在)\r
165                 {\r
166                     this.dbグラフ値現在_表示 += (this.dbグラフ値現在 - this.dbグラフ値現在_表示) / 5 + 0.01;\r
167                 }\r
168                 if (this.dbグラフ値現在_表示 >= this.dbグラフ値現在)\r
169                 {\r
170                     this.dbグラフ値現在_表示 = this.dbグラフ値現在;\r
171                 }\r
172                 rectangle = new Rectangle(0, 0, 10, (int)(230f * this.dbグラフ値現在_表示 / 100));\r
173                 if (this.txグラフ != null)\r
174                 {\r
175                     this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
176                     this.txグラフ.n透明度 = 192;\r
177                     this.txグラフ.t2D描画(CDTXMania.app.Device, 350, 318 - (int)(230f * this.dbグラフ値現在_表示 / 100), rectangle);\r
178                 }\r
179                                 for( int k = 0; k < 32; k++ )\r
180                                 {\r
181                     rectangle = new Rectangle(20, 0, 1, 1);\r
182                     if (this.txグラフ != null)\r
183                     {\r
184                                         this.stキラキラ[ k ].ct進行.t進行Loop();\r
185                         int num1 = (int)this.stキラキラ[ k ].x;\r
186                         int num2 = this.stキラキラ[ k ].ct進行.n現在の値;\r
187                         this.txグラフ.vc拡大縮小倍率 = new Vector3(this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale);\r
188                         this.txグラフ.n透明度 = 138 - 2 * this.stキラキラ[ k ].Trans;\r
189                         if ( num2 < (2.3f * this.dbグラフ値現在_表示) )\r
190                         {\r
191                             this.txグラフ.t2D描画(CDTXMania.app.Device, 350+num1, 318-num2, rectangle);\r
192                         }\r
193                     }\r
194                                 }\r
195                 // --現在値_追加エフェクト\r
196                 if (this.dbグラフ値直前 != this.dbグラフ値現在)\r
197                 {\r
198                     this.stフラッシュ[ nグラフフラッシュct ].y = 0;\r
199                     this.stフラッシュ[ nグラフフラッシュct ].Trans = 224;\r
200                     nグラフフラッシュct ++;\r
201                     if (nグラフフラッシュct >= 16)\r
202                     {\r
203                         nグラフフラッシュct = 0;\r
204                     }\r
205                 }\r
206                 this.dbグラフ値直前 = this.dbグラフ値現在;\r
207                 for (int m = 0; m < 16; m++)\r
208                 {\r
209                     rectangle = new Rectangle(20, 0, 1, 1);\r
210                     if ((this.stフラッシュ[ m ].y >= 0) && (this.stフラッシュ[ m ].y+3 < (int)(230f * this.dbグラフ値現在_表示 / 100)) && (this.txグラフ != null))\r
211                     {\r
212                         this.txグラフ.vc拡大縮小倍率 = new Vector3(10f, 1f, 1f);\r
213                         this.txグラフ.n透明度 = this.stフラッシュ[ m ].Trans;\r
214                         this.txグラフ.t2D描画(CDTXMania.app.Device, 350, this.stフラッシュ[ m ].y + (318 - (int)(230f * this.dbグラフ値現在_表示 / 100)), rectangle);\r
215                         this.txグラフ.n透明度 = this.stフラッシュ[ m ].Trans;\r
216                         this.txグラフ.t2D描画(CDTXMania.app.Device, 350, this.stフラッシュ[ m ].y + 2 + (318 - (int)(230f * this.dbグラフ値現在_表示 / 100)), rectangle);\r
217                     }\r
218                     this.stフラッシュ[ m ].y += 4;\r
219                     this.stフラッシュ[ m ].Trans -= 4;\r
220                 }\r
221                 // --現在値_目標越\r
222                 rectangle = new Rectangle(0, 0, 10, (int)(230f * this.dbグラフ値現在_表示 / 100));\r
223                 if ((dbグラフ値現在 >= dbグラフ値目標) && (this.txグラフ != null))\r
224                 {\r
225                     this.txグラフ.vc拡大縮小倍率 = new Vector3(1.4f, 1f, 1f);\r
226                     this.txグラフ.n透明度 = 128;\r
227                     this.txグラフ.b加算合成 = true;\r
228                     this.txグラフ.t2D描画(CDTXMania.app.Device, 348, 318 - (int)(230f * this.dbグラフ値現在_表示 / 100), rectangle);\r
229                     this.txグラフ.b加算合成 = false;\r
230                 }\r
231                 // --目標値\r
232                 if (this.dbグラフ値目標_表示 < this.dbグラフ値目標)\r
233                 {\r
234                     this.dbグラフ値目標_表示 += (this.dbグラフ値目標 - this.dbグラフ値目標_表示) / 5 + 0.01;\r
235                 }\r
236                 if (this.dbグラフ値目標_表示 >= this.dbグラフ値目標)\r
237                 {\r
238                     this.dbグラフ値目標_表示 = this.dbグラフ値目標;\r
239                 }\r
240                 rectangle = new Rectangle(10, 0, 10, (int)(230f * this.dbグラフ値目標_表示 / 100));\r
241                 if (this.txグラフ != null)\r
242                 {\r
243                     this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
244                     this.txグラフ.n透明度 = 192;\r
245                     this.txグラフ.t2D描画(CDTXMania.app.Device, 368, 318 - (int)(230f * this.dbグラフ値目標_表示 / 100), rectangle);\r
246                     this.txグラフ.vc拡大縮小倍率 = new Vector3(1.4f, 1f, 1f);\r
247                     this.txグラフ.n透明度 = 48;\r
248                     this.txグラフ.b加算合成 = true;\r
249                     this.txグラフ.t2D描画(CDTXMania.app.Device, 366, 318 - (int)(230f * this.dbグラフ値目標_表示 / 100), rectangle);\r
250                     this.txグラフ.b加算合成 = false;\r
251                 }\r
252                                 for( int k = 32; k < 64; k++ )\r
253                                 {\r
254                     rectangle = new Rectangle(20, 0, 1, 1);\r
255                     if (this.txグラフ != null)\r
256                     {\r
257                                         this.stキラキラ[ k ].ct進行.t進行Loop();\r
258                         int num1 = (int)this.stキラキラ[ k ].x;\r
259                         int num2 = this.stキラキラ[ k ].ct進行.n現在の値;\r
260                         this.txグラフ.vc拡大縮小倍率 = new Vector3(this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale, this.stキラキラ[ k ].fScale);\r
261                         this.txグラフ.n透明度 = 138 - 2 * this.stキラキラ[ k ].Trans;\r
262                         if ( num2 < (2.3f * this.dbグラフ値目標_表示) )\r
263                         {\r
264                             this.txグラフ.t2D描画(CDTXMania.app.Device, 368+num1, 318-num2, rectangle);\r
265                         }\r
266                     }\r
267                                 }\r
268                 \r
269                         }\r
270                         return 0;\r
271                 }\r
272 \r
273 \r
274                 // その他\r
275 \r
276                 #region [ private ]\r
277                 //----------------\r
278                 [StructLayout( LayoutKind.Sequential )]\r
279                 private struct STキラキラ\r
280                 {\r
281                         public int x;\r
282                         public int y;\r
283                         public float fScale;\r
284                         public int Trans;\r
285                         public CCounter ct進行;\r
286                 }\r
287         private STキラキラ[] stキラキラ = new STキラキラ[ 64 ];\r
288         private STキラキラ[] stフラッシュ = new STキラキラ[ 16 ];\r
289 \r
290         private double dbグラフ値目標;\r
291         private double dbグラフ値目標_表示;\r
292         private double dbグラフ値現在;\r
293         private double dbグラフ値現在_表示;\r
294         private double dbグラフ値直前;\r
295         private int nグラフフラッシュct;\r
296 \r
297                 private CTexture txグラフ;\r
298                 //-----------------\r
299                 #endregion\r
300         }\r
301 }\r