OSDN Git Service

b3a9c9e5fce2db78f51f4f80e3105e8b2f628011
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / CAct演奏判定文字列共通.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 FDK;\r
7 using SharpDX;\r
8 \r
9 using Color = System.Drawing.Color;\r
10 using Rectangle = System.Drawing.Rectangle;\r
11 \r
12 namespace DTXMania\r
13 {\r
14         internal class CAct演奏判定文字列共通 : CActivity\r
15         {\r
16                 private STLaneValue<STSTATUS> st状態 = new STLaneValue<STSTATUS>();\r
17 \r
18                 private class STSTATUS\r
19                 {\r
20                         public CCounter ct進行;\r
21                         public EJudge judge;\r
22                         public float fX方向拡大率;\r
23                         public float fY方向拡大率;\r
24                         public int n相対Y座標;\r
25                         public int n透明度;\r
26 \r
27                         /// <summary>\r
28                         /// #25370 2011.2.1 yyagi\r
29                         /// </summary>\r
30                         public int nLag;\r
31                 }\r
32 \r
33                 private CTexture tex;\r
34 \r
35                 /// <summary>\r
36                 /// #25370 2011.2.1 yyagi\r
37                 /// </summary>\r
38                 /// \r
39                 private CActDigit actPositiveLag;\r
40                 private CActDigit actNegativeLag;\r
41 \r
42                 public CAct演奏判定文字列共通()\r
43                 {\r
44                         base.list子Activities.Add(actPositiveLag = new CActDigit(Color.White, Color.Gray, 25));\r
45                         base.list子Activities.Add(actNegativeLag = new CActDigit(Color.Red, Color.Black, 25));\r
46                         for (ELane i = ELane.DrumsLaneMin; i < ELane.Max; ++i)\r
47                         {\r
48                                 st状態[i] = new STSTATUS();\r
49                         }\r
50                         base.b活性化してない = true;\r
51                 }\r
52 \r
53                 /// <summary>\r
54                 /// アクティビティ開始メソッド。\r
55                 /// </summary>\r
56                 /// <param name="nLane">判定文字列を表示するレーン。ギターバスのときはRを渡します。</param>\r
57                 /// <param name="judge">表示する判定です。</param>\r
58                 /// <param name="lag">この判定に対する入力との差 (ms 単位) です。</param>\r
59                 public virtual void Start(ELane nLane, EJudge judge, int lag)\r
60                 {\r
61                         if\r
62                                         (\r
63                                         (nLane >= ELane.DrumsLaneMax || CDTXMania.Instance.ConfigIni.bDisplayJudge.Drums) &&\r
64                                         (nLane != ELane.GtR || CDTXMania.Instance.ConfigIni.bDisplayJudge.Guitar) &&\r
65                                         (nLane != ELane.BsR || CDTXMania.Instance.ConfigIni.bDisplayJudge.Bass)\r
66                                         )\r
67                         {\r
68                                 this.st状態[nLane].ct進行 = new CCounter(0, 300, 1, CDTXMania.Instance.Timer);\r
69                                 this.st状態[nLane].judge = judge;\r
70                                 this.st状態[nLane].fX方向拡大率 = 1f;\r
71                                 this.st状態[nLane].fY方向拡大率 = 1f;\r
72                                 this.st状態[nLane].n相対Y座標 = 0;\r
73                                 this.st状態[nLane].n透明度 = 0xff;\r
74                                 this.st状態[nLane].nLag = lag;\r
75                         }\r
76                 }\r
77 \r
78 \r
79                 public override void On活性化()\r
80                 {\r
81                         if (b活性化してない)\r
82                         {\r
83                                 for (ELane i = ELane.DrumsLaneMin; i < ELane.BassLaneMax; i++)\r
84                                 {\r
85                                         this.st状態[i].ct進行 = new CCounter();\r
86                                 }\r
87                                 base.On活性化();\r
88                         }\r
89                 }\r
90 \r
91                 public override void On非活性化()\r
92                 {\r
93                         if (b活性化してる)\r
94                         {\r
95                                 for (ELane i = ELane.DrumsLaneMin; i < ELane.BassLaneMax; i++)\r
96                                 {\r
97                                         this.st状態[i].ct進行 = null;\r
98                                 }\r
99                                 base.On非活性化();\r
100                         }\r
101                 }\r
102 \r
103                 public override void OnManagedリソースの作成()\r
104                 {\r
105                         if (b活性化してる)\r
106                         {\r
107                                 this.tex = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay judge strings 1.png"));\r
108                                 base.OnManagedリソースの作成();\r
109                         }\r
110                 }\r
111 \r
112                 public override void OnManagedリソースの解放()\r
113                 {\r
114                         if (b活性化してる)\r
115                         {\r
116                                 TextureFactory.tテクスチャの解放(ref tex);\r
117                                 base.OnManagedリソースの解放();\r
118                         }\r
119                 }\r
120 \r
121 \r
122                 public override int On進行描画()\r
123                 {\r
124                         if (b活性化してる)\r
125                         {\r
126                                 #region [ 表示拡大率の設定 ]\r
127                                 for (ELane i = ELane.DrumsLaneMin; i < ELane.BassLaneMax; ++i)\r
128                                 {\r
129                                         if (!st状態[i].ct進行.b停止中)\r
130                                         {\r
131                                                 st状態[i].ct進行.t進行();\r
132                                                 if (st状態[i].ct進行.b終了値に達した)\r
133                                                 {\r
134                                                         st状態[i].ct進行.t停止();\r
135                                                 }\r
136                                                 int num2 = st状態[i].ct進行.n現在の値;\r
137                                                 if ((st状態[i].judge != EJudge.Miss) && (st状態[i].judge != EJudge.Bad))\r
138                                                 {\r
139                                                         if (num2 < 50)\r
140                                                         {\r
141                                                                 st状態[i].fX方向拡大率 = 1f + (1f * (1f - (((float)num2) / 50f)));\r
142                                                                 st状態[i].fY方向拡大率 = ((float)num2) / 50f;\r
143                                                                 st状態[i].n相対Y座標 = 0;\r
144                                                                 st状態[i].n透明度 = 0xff;\r
145                                                         }\r
146                                                         else if (num2 < 130)\r
147                                                         {\r
148                                                                 st状態[i].fX方向拡大率 = 1f;\r
149                                                                 st状態[i].fY方向拡大率 = 1f;\r
150                                                                 st状態[i].n相対Y座標 = ((num2 % 6) == 0) ? (CDTXMania.Instance.Random.Next(6) - 3) : st状態[i].n相対Y座標;\r
151                                                                 st状態[i].n透明度 = 0xff;\r
152                                                         }\r
153                                                         else if (num2 >= 240)\r
154                                                         {\r
155                                                                 st状態[i].fX方向拡大率 = 1f;\r
156                                                                 st状態[i].fY方向拡大率 = 1f - ((1f * (num2 - 240)) / 60f);\r
157                                                                 st状態[i].n相対Y座標 = 0;\r
158                                                                 st状態[i].n透明度 = 0xff;\r
159                                                         }\r
160                                                         else\r
161                                                         {\r
162                                                                 st状態[i].fX方向拡大率 = 1f;\r
163                                                                 st状態[i].fY方向拡大率 = 1f;\r
164                                                                 st状態[i].n相対Y座標 = 0;\r
165                                                                 st状態[i].n透明度 = 0xff;\r
166                                                         }\r
167                                                 }\r
168                                                 else if (num2 < 50)\r
169                                                 {\r
170                                                         st状態[i].fX方向拡大率 = 1f;\r
171                                                         st状態[i].fY方向拡大率 = ((float)num2) / 50f;\r
172                                                         st状態[i].n相対Y座標 = 0;\r
173                                                         st状態[i].n透明度 = 0xff;\r
174                                                 }\r
175                                                 else if (num2 >= 200)\r
176                                                 {\r
177                                                         st状態[i].fX方向拡大率 = 1f - (((float)(num2 - 200)) / 100f);\r
178                                                         st状態[i].fY方向拡大率 = 1f - (((float)(num2 - 200)) / 100f);\r
179                                                         st状態[i].n相対Y座標 = 0;\r
180                                                         st状態[i].n透明度 = 0xff;\r
181                                                 }\r
182                                                 else\r
183                                                 {\r
184                                                         st状態[i].fX方向拡大率 = 1f;\r
185                                                         st状態[i].fY方向拡大率 = 1f;\r
186                                                         st状態[i].n相対Y座標 = 0;\r
187                                                         st状態[i].n透明度 = 0xff;\r
188                                                 }\r
189                                         }\r
190                                 }\r
191                                 #endregion\r
192 \r
193                                 for (ELane i = ELane.DrumsLaneMin; i < ELane.BassLaneMax; ++i)\r
194                                 {\r
195                                         if (!st状態[i].ct進行.b停止中)\r
196                                         {\r
197                                                 int baseX = 0;\r
198                                                 int baseY = 0;\r
199                                                 Rectangle rc = CDTXMania.Instance.Coordinates.ImgJudgeString.ApplyCounterY((int)st状態[i].judge, 0);\r
200 \r
201                                                 #region [ Drums 判定文字列 baseX/Y生成 ]\r
202                                                 if (i < ELane.DrumsLaneMax)\r
203                                                 {\r
204                                                         if (!CDTXMania.Instance.ConfigIni.bDrums有効 ||\r
205                                                                 !CDTXMania.Instance.DTX.bチップがある.Drums ||\r
206                                                                 !CDTXMania.Instance.ConfigIni.bDisplayJudge.Drums)\r
207                                                         {\r
208                                                                 continue;\r
209                                                         }\r
210 \r
211                                                         baseX = CDTXMania.Instance.ConfigIni.GetLaneX(i) + CDTXMania.Instance.ConfigIni.GetLaneW(i) / 2;\r
212                                                         baseY = CDTXMania.Instance.ConfigIni.cdJudgeY[EPart.Drums];\r
213 \r
214                                                         if (CDTXMania.Instance.ConfigIni.bReverse.Drums)\r
215                                                         {\r
216                                                                 baseY = SampleFramework.GameWindowSize.Height - baseY - rc.Height;\r
217                                                         }\r
218 \r
219                                                         tex.fZ軸中心回転 = (float)Math.PI / 4;\r
220                                                 }\r
221                                                 #endregion\r
222                                                 #region [ Guitar 判定文字列描画 baseX/Y生成 ]\r
223                                                 else if (i == ELane.GtR)  // Guitar\r
224                                                 {\r
225                                                         if (!CDTXMania.Instance.ConfigIni.bGuitar有効 ||\r
226                                                                 !CDTXMania.Instance.DTX.bチップがある.Guitar ||\r
227                                                                 !CDTXMania.Instance.ConfigIni.bDisplayJudge.Guitar)\r
228                                                         {\r
229                                                                 continue;\r
230                                                         }\r
231 \r
232                                                         baseX = CDTXMania.Instance.ConfigIni.cdInstX.Guitar[CDTXMania.Instance.ConfigIni.eActiveInst]\r
233                                                                 + CDTXMania.Instance.Coordinates.Instrument.Guitar.W / 2;\r
234                                                         baseY = CDTXMania.Instance.ConfigIni.cdJudgeY[EPart.Guitar];\r
235 \r
236                                                         if (CDTXMania.Instance.ConfigIni.bReverse.Guitar)\r
237                                                         {\r
238                                                                 baseY = SampleFramework.GameWindowSize.Height - baseY - rc.Height;\r
239                                                         }\r
240                                                         tex.fZ軸中心回転 = 0;\r
241                                                 }\r
242                                                 #endregion\r
243                                                 #region [ Bass 判定文字列描画 baseX/Y生成 ]\r
244                                                 else if (i == ELane.BsR)  // Bass\r
245                                                 {\r
246                                                         if (!CDTXMania.Instance.ConfigIni.bGuitar有効 ||\r
247                                                                 !CDTXMania.Instance.DTX.bチップがある.Bass ||\r
248                                                                 !CDTXMania.Instance.ConfigIni.bDisplayJudge.Bass)\r
249                                                         {\r
250                                                                 continue;\r
251                                                         }\r
252 \r
253                                                         baseX = CDTXMania.Instance.ConfigIni.cdInstX.Bass[CDTXMania.Instance.ConfigIni.eActiveInst]\r
254                                                                 + CDTXMania.Instance.Coordinates.Instrument.Bass.W / 2;\r
255                                                         baseY = CDTXMania.Instance.ConfigIni.cdJudgeY[EPart.Bass];\r
256 \r
257                                                         if (CDTXMania.Instance.ConfigIni.bReverse.Bass)\r
258                                                         {\r
259                                                                 baseY = SampleFramework.GameWindowSize.Height - baseY - rc.Height;\r
260                                                         }\r
261                                                         tex.fZ軸中心回転 = 0;\r
262                                                 }\r
263                                                 else\r
264                                                 {\r
265                                                         continue;\r
266                                                 }\r
267                                                 #endregion\r
268 \r
269                                                 int xc = baseX;\r
270                                                 int x = (int)(xc - CDTXMania.Instance.Coordinates.ImgJudgeString.W / 2.0 * st状態[i].fX方向拡大率);\r
271                                                 int y = (int)(baseY + st状態[i].n相対Y座標 * Scale.Y - rc.Height / 2.0 * st状態[i].fY方向拡大率);\r
272                                                 if (tex != null)\r
273                                                 {\r
274                                                         tex.n透明度 = st状態[i].n透明度;\r
275                                                         tex.vc拡大縮小倍率.X = st状態[i].fX方向拡大率;\r
276                                                         tex.vc拡大縮小倍率.Y = st状態[i].fY方向拡大率;\r
277                                                         tex.t2D描画(CDTXMania.Instance.Device, x, y, rc);\r
278 \r
279                                                         #region [ #25370 2011.6.3 yyagi ShowLag support ]\r
280                                                         if (CDTXMania.Instance.ConfigIni.nShowLagType == EShowLagType.On ||\r
281                                                                          ((CDTXMania.Instance.ConfigIni.nShowLagType == EShowLagType.UGreat) && (st状態[i].judge != EJudge.Perfect)))\r
282                                                         {\r
283                                                                 // #25370 2011.2.1 yyagi\r
284                                                                 if (st状態[i].judge != EJudge.Auto)\r
285                                                                 {\r
286                                                                         CActDigit useAct = actPositiveLag;\r
287                                                                         int digit = st状態[i].nLag;\r
288                                                                         if (digit < 0)\r
289                                                                         {\r
290                                                                                 useAct = actNegativeLag;\r
291                                                                                 digit = -digit;\r
292                                                                         }\r
293 \r
294                                                                         int w = useAct.Measure(digit);\r
295                                                                         useAct.Draw(digit, xc - w / 2, y + CDTXMania.Instance.Coordinates.ImgJudgeString.H);\r
296                                                                 }\r
297                                                         }\r
298                                                         #endregion\r
299                                                 }\r
300 \r
301                                         }\r
302                                 }\r
303                         }\r
304                         return 0;\r
305                 }\r
306         }\r
307 }\r