OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / CAct演奏Combo共通.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演奏Combo共通 : CActivity\r
12         {\r
13                 public STDGBSValue<CComboStatus> dgbコンボ数;\r
14                 public class CComboStatus\r
15                 {\r
16                         //public CAct演奏Combo共通 act;\r
17                         public int n最高値 { get; private set; }\r
18                         public int n現在値 { get; private set; }\r
19 \r
20                         public CAct演奏Combo共通.EMode e現在のモード = EMode.非表示中;\r
21                         public int nCOMBO値 = 0;\r
22                         public long nコンボが切れた時刻 = -1;\r
23                         public int nジャンプインデックス値 = 99999;\r
24                         public int n現在表示中のCOMBO値 = 0;\r
25                         public long n前回の時刻_ジャンプ用 = -1;\r
26 \r
27                         public void IncrementCombo()\r
28                         {\r
29                                 ++n現在値;\r
30                                 if (n現在値 > n最高値)\r
31                                 {\r
32                                         n最高値 = n現在値;\r
33                                 }\r
34                                 nCOMBO値 = n現在値;\r
35                         }\r
36                         public void ResetCombo()\r
37                         {\r
38                                 n現在値 = 0;\r
39                         }\r
40                 }\r
41 \r
42                 private int[] nジャンプ差分値 = new int[180];\r
43                 // private STDGBVALUE<CSTAT> status;\r
44                 private CTexture tex;\r
45 \r
46                 public enum EEvent\r
47                 {\r
48                         非表示,\r
49                         数値更新,\r
50                         同一数値,\r
51                         ミス通知\r
52                 }\r
53 \r
54                 public enum EMode\r
55                 {\r
56                         非表示中,\r
57                         進行表示中,\r
58                         残像表示中\r
59                 }\r
60 \r
61                 public CAct演奏Combo共通()\r
62                 {\r
63                         this.b活性化してない = true;\r
64 \r
65                         // 180度分のジャンプY座標差分を取得。(0度: 0 → 90度:-15 → 180度: 0)\r
66                         for (int i = 0; i < 180; i++)\r
67                         {\r
68                                 this.nジャンプ差分値[i] = (int)(-15.0 * Math.Sin((Math.PI * i) / 180.0) * Scale.Y);\r
69                         }\r
70                 }\r
71 \r
72                 private void tコンボ表示(EPart inst, int nCombo値, int nジャンプインデックス)\r
73                 {\r
74                         int x, y;\r
75                         x = CDTXMania.Instance.ConfigIni.cdComboX[inst][CDTXMania.Instance.ConfigIni.eActiveInst];\r
76                         y = CDTXMania.Instance.ConfigIni.cdComboY[inst][CDTXMania.Instance.ConfigIni.eActiveInst];\r
77                         if (CDTXMania.Instance.ConfigIni.bReverse[inst])\r
78                         {\r
79                                 y = SampleFramework.GameWindowSize.Height - y\r
80                                         - CDTXMania.Instance.Coordinates.ImgComboCombo.H - CDTXMania.Instance.Coordinates.ImgComboOneDigit.H;\r
81                         }\r
82 \r
83                         if (tex != null)\r
84                         {\r
85                                 tex.n透明度 = 0xff;\r
86                         }\r
87 \r
88                         int[] n位の数 = new int[10];\r
89                         // 表示は10桁もあれば足りるだろう\r
90                         //-----------------\r
91                         if (CDTXMania.Instance.ConfigIni.bDisplayCombo[inst] && nCombo値 > 0)\r
92                         {\r
93                                 // n位の数[] の格納。(例:nCombo値=125 のとき n位の数 = { 5,2,1,0,0,0,0,0,0,0 })\r
94                                 int n = nCombo値;\r
95                                 int n桁数 = 0;\r
96                                 int n全桁の合計幅 = 0;\r
97                                 while ((n > 0) && (n桁数 < 10))\r
98                                 {\r
99                                         n位の数[n桁数] = n % 10;   // 1の位を格納\r
100                                         n = (n - (n % 10)) / 10;  // 右へシフト(例: 12345 → 1234 )\r
101                                         n全桁の合計幅 += CDTXMania.Instance.Coordinates.ImgComboOneDigit.W;\r
102                                         n桁数++;\r
103                                 }\r
104 \r
105                                 // "COMBO" の拡大率を設定\r
106                                 float f拡大率 = 1.0f;\r
107                                 if (nジャンプインデックス >= 0 && nジャンプインデックス < 180)\r
108                                         f拡大率 = 1.0f - (((float)this.nジャンプ差分値[nジャンプインデックス]) / 45.0f);    // f拡大率 = 1.0 → 1.3333... → 1.0\r
109 \r
110                                 if (this.tex != null)\r
111                                 {\r
112                                         this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);\r
113                                 }\r
114 \r
115                                 // "COMBO" 文字を表示\r
116                                 int cbx = x - ((int)((CDTXMania.Instance.Coordinates.ImgComboCombo.W * f拡大率) / 2.0f));\r
117                                 if (this.tex != null)\r
118                                         this.tex.t2D描画(CDTXMania.Instance.Device,\r
119                                                 cbx,\r
120                                                 y + CDTXMania.Instance.Coordinates.ImgComboOneDigit.H,\r
121                                                 CDTXMania.Instance.Coordinates.ImgComboCombo);\r
122 \r
123                                 x = x + (n全桁の合計幅 / 2);\r
124                                 // 1文字ずつ表示していく\r
125                                 for (int i = 0; i < n桁数; i++)\r
126                                 {\r
127                                         f拡大率 = 1.0f;\r
128                                         if (nジャンプインデックス >= 0 && nジャンプインデックス < 180)\r
129                                                 f拡大率 = 1.0f - (((float)this.nジャンプ差分値[nジャンプインデックス]) / 45f);    // f拡大率 = 1.0 → 1.3333... → 1.0\r
130 \r
131                                         if (this.tex != null)\r
132                                                 this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);\r
133 \r
134                                         x -= CDTXMania.Instance.Coordinates.ImgComboOneDigit.W;\r
135 \r
136                                         if (this.tex != null)\r
137                                         {\r
138                                                 this.tex.t2D描画(\r
139                                                         CDTXMania.Instance.Device,\r
140                                                         x - ((int)(((f拡大率 - 1.0f) * CDTXMania.Instance.Coordinates.ImgComboOneDigit.W) / 2.0f)),\r
141                                                         y - ((int)(((f拡大率 - 1.0f) * CDTXMania.Instance.Coordinates.ImgComboOneDigit.H) / 2.0f)),\r
142                                                         CDTXMania.Instance.Coordinates.ImgComboOneDigit.ApplyCounterXY(n位の数[i] % 4, n位の数[i] / 4, 0, 0));\r
143                                         }\r
144                                 }\r
145                         }\r
146                 }\r
147 \r
148 \r
149                 // CActivity 実装\r
150                 public override void On活性化()\r
151                 {\r
152                         this.dgbコンボ数 = new STDGBSValue<CComboStatus>();\r
153                         for (EPart i = EPart.Drums; i <= EPart.Bass; i++)\r
154                         {\r
155                                 this.dgbコンボ数[i] = new CComboStatus();\r
156                         }\r
157                         base.On活性化();\r
158                 }\r
159 \r
160                 public override void On非活性化()\r
161                 {\r
162                         base.On非活性化();\r
163                 }\r
164 \r
165                 public override void OnManagedリソースの作成()\r
166                 {\r
167                         if (this.b活性化してない)\r
168                                 return;\r
169 \r
170                         // this.txCOMBOドラム = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums-combo-drums2.png"));\r
171                         this.tex = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums-combo-guitar2.png"));\r
172 \r
173                         base.OnManagedリソースの作成();\r
174                 }\r
175 \r
176                 public override void OnManagedリソースの解放()\r
177                 {\r
178                         if (this.b活性化してない)\r
179                                 return;\r
180 \r
181                         // TextureFactory.tテクスチャの解放(ref this.txCOMBOドラム);\r
182                         TextureFactory.tテクスチャの解放(ref this.tex);\r
183 \r
184                         base.OnManagedリソースの解放();\r
185                 }\r
186 \r
187                 public override int On進行描画()\r
188                 {\r
189                         if (!this.b活性化してない)\r
190                         {\r
191                                 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
192                                 {\r
193                                         if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) && CDTXMania.Instance.DTX.bチップがある[inst])\r
194                                         {\r
195                                                 EEvent e今回の状態遷移イベント;\r
196                                                 CComboStatus st = this.dgbコンボ数[inst];\r
197 \r
198                                                 // 前回と今回の COMBO 値から、e今回の状態遷移イベントを決定する。\r
199                                                 if (st.n現在表示中のCOMBO値 == st.nCOMBO値)\r
200                                                 {\r
201                                                         e今回の状態遷移イベント = EEvent.同一数値;\r
202                                                 }\r
203                                                 else if (st.n現在表示中のCOMBO値 > st.nCOMBO値)\r
204                                                 {\r
205                                                         e今回の状態遷移イベント = EEvent.ミス通知;\r
206                                                 }\r
207                                                 else if ((st.n現在表示中のCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]) &&\r
208                                                         (st.nCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]))\r
209                                                 {\r
210                                                         e今回の状態遷移イベント = EEvent.非表示;\r
211                                                 }\r
212                                                 else\r
213                                                 {\r
214                                                         e今回の状態遷移イベント = EEvent.数値更新;\r
215                                                 }\r
216 \r
217                                                 // nジャンプインデックス値 の進行。\r
218                                                 if (st.nジャンプインデックス値 < 360)\r
219                                                 {\r
220                                                         if ((st.n前回の時刻_ジャンプ用 == -1) || (CDTXMania.Instance.Timer.n現在時刻 < st.n前回の時刻_ジャンプ用))\r
221                                                         {\r
222                                                                 st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
223                                                         }\r
224 \r
225                                                         const long INTERVAL = 2;\r
226 \r
227                                                         long diff = CDTXMania.Instance.Timer.n現在時刻 - st.n前回の時刻_ジャンプ用;\r
228                                                         st.n前回の時刻_ジャンプ用 += INTERVAL * (diff / INTERVAL);\r
229                                                         st.nジャンプインデックス値 += 3 * (int)(diff / INTERVAL);\r
230                                                         if (st.nジャンプインデックス値 >= 2000)\r
231                                                         {\r
232                                                                 st.nジャンプインデックス値 -= 3 * ((st.nジャンプインデックス値 - 2000) / 3 + 1);\r
233                                                         }\r
234                                                 }\r
235 \r
236 \r
237                                                 Retry:  // モードが変化した場合はここからリトライする。\r
238 \r
239                                                 switch (st.e現在のモード)\r
240                                                 {\r
241                                                         case EMode.非表示中:\r
242                                                                 if (e今回の状態遷移イベント == EEvent.数値更新)\r
243                                                                 {\r
244                                                                         // モード変更\r
245                                                                         st.e現在のモード = EMode.進行表示中;\r
246                                                                         st.nジャンプインデックス値 = 0;\r
247                                                                         st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
248                                                                         goto Retry;\r
249                                                                 }\r
250 \r
251                                                                 st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
252                                                                 break;\r
253 \r
254                                                         case EMode.進行表示中:\r
255                                                                 if ((e今回の状態遷移イベント == EEvent.非表示) || (e今回の状態遷移イベント == EEvent.ミス通知))\r
256                                                                 {\r
257                                                                         // モード変更\r
258                                                                         st.e現在のモード = EMode.残像表示中;\r
259                                                                         //st.n残像表示中のCOMBO値 = st.n現在表示中のCOMBO値;\r
260                                                                         st.nコンボが切れた時刻 = CDTXMania.Instance.Timer.n現在時刻;\r
261                                                                         goto Retry;\r
262                                                                 }\r
263 \r
264                                                                 if (e今回の状態遷移イベント == EEvent.数値更新)\r
265                                                                 {\r
266                                                                         st.nジャンプインデックス値 = 0;\r
267                                                                         st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
268                                                                 }\r
269 \r
270                                                                 st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
271                                                                 this.tコンボ表示(inst, st.nCOMBO値, st.nジャンプインデックス値);\r
272                                                                 break;\r
273 \r
274                                                         case EMode.残像表示中:\r
275                                                                 if (e今回の状態遷移イベント == EEvent.数値更新)\r
276                                                                 {\r
277                                                                         // モード変更1\r
278                                                                         st.e現在のモード = EMode.進行表示中;\r
279                                                                         goto Retry;\r
280                                                                 }\r
281                                                                 if ((CDTXMania.Instance.Timer.n現在時刻 - st.nコンボが切れた時刻) > 1000)\r
282                                                                 {\r
283                                                                         // モード変更2\r
284                                                                         st.e現在のモード = EMode.非表示中;\r
285                                                                         goto Retry;\r
286                                                                 }\r
287                                                                 st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
288                                                                 break;\r
289                                                 }\r
290                                         }\r
291                                 }\r
292                         }\r
293                         return 0;\r
294                 }\r
295         }\r
296 }\r