2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
11 internal class CAct演奏Combo共通 : CActivity
\r
13 public STDGBSValue<CComboStatus> dgbコンボ数;
\r
14 public class CComboStatus
\r
16 //public CAct演奏Combo共通 act;
\r
17 public int n最高値 { get; private set; }
\r
18 public int n現在値 { get; private set; }
\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
27 public void IncrementCombo()
\r
36 public void ResetCombo()
\r
42 private int[] nジャンプ差分値 = new int[180];
\r
43 // private STDGBVALUE<CSTAT> status;
\r
44 private CTexture tex;
\r
61 public CAct演奏Combo共通()
\r
63 this.b活性化してない = true;
\r
65 // 180度分のジャンプY座標差分を取得。(0度: 0 → 90度:-15 → 180度: 0)
\r
66 for (int i = 0; i < 180; i++)
\r
68 this.nジャンプ差分値[i] = (int)(-15.0 * Math.Sin((Math.PI * i) / 180.0) * Scale.Y);
\r
72 private void tコンボ表示(EPart inst, int nCombo値, int nジャンプインデックス)
\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
79 y = SampleFramework.GameWindowSize.Height - y
\r
80 - CDTXMania.Instance.Coordinates.ImgComboCombo.H - CDTXMania.Instance.Coordinates.ImgComboOneDigit.H;
\r
88 int[] n位の数 = new int[10];
\r
91 if (CDTXMania.Instance.ConfigIni.bDisplayCombo[inst] && nCombo値 > 0)
\r
93 // n位の数[] の格納。(例:nCombo値=125 のとき n位の数 = { 5,2,1,0,0,0,0,0,0,0 })
\r
97 while ((n > 0) && (n桁数 < 10))
\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
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
110 if (this.tex != null)
\r
112 this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);
\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
120 y + CDTXMania.Instance.Coordinates.ImgComboOneDigit.H,
\r
121 CDTXMania.Instance.Coordinates.ImgComboCombo);
\r
123 x = x + (n全桁の合計幅 / 2);
\r
125 for (int i = 0; i < n桁数; i++)
\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
131 if (this.tex != null)
\r
132 this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);
\r
134 x -= CDTXMania.Instance.Coordinates.ImgComboOneDigit.W;
\r
136 if (this.tex != null)
\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
150 public override void On活性化()
\r
152 this.dgbコンボ数 = new STDGBSValue<CComboStatus>();
\r
153 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
155 this.dgbコンボ数[i] = new CComboStatus();
\r
160 public override void On非活性化()
\r
165 public override void OnManagedリソースの作成()
\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
173 base.OnManagedリソースの作成();
\r
176 public override void OnManagedリソースの解放()
\r
181 // TextureFactory.tテクスチャの解放(ref this.txCOMBOドラム);
\r
182 TextureFactory.tテクスチャの解放(ref this.tex);
\r
184 base.OnManagedリソースの解放();
\r
187 public override int On進行描画()
\r
189 if (!this.b活性化してない)
\r
191 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)
\r
193 if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) && CDTXMania.Instance.DTX.bチップがある[inst])
\r
195 EEvent e今回の状態遷移イベント;
\r
196 CComboStatus st = this.dgbコンボ数[inst];
\r
198 // 前回と今回の COMBO 値から、e今回の状態遷移イベントを決定する。
\r
199 if (st.n現在表示中のCOMBO値 == st.nCOMBO値)
\r
201 e今回の状態遷移イベント = EEvent.同一数値;
\r
203 else if (st.n現在表示中のCOMBO値 > st.nCOMBO値)
\r
205 e今回の状態遷移イベント = EEvent.ミス通知;
\r
207 else if ((st.n現在表示中のCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]) &&
\r
208 (st.nCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]))
\r
210 e今回の状態遷移イベント = EEvent.非表示;
\r
214 e今回の状態遷移イベント = EEvent.数値更新;
\r
217 // nジャンプインデックス値 の進行。
\r
218 if (st.nジャンプインデックス値 < 360)
\r
220 if ((st.n前回の時刻_ジャンプ用 == -1) || (CDTXMania.Instance.Timer.n現在時刻 < st.n前回の時刻_ジャンプ用))
\r
222 st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;
\r
225 const long INTERVAL = 2;
\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
232 st.nジャンプインデックス値 -= 3 * ((st.nジャンプインデックス値 - 2000) / 3 + 1);
\r
237 Retry: // モードが変化した場合はここからリトライする。
\r
239 switch (st.e現在のモード)
\r
242 if (e今回の状態遷移イベント == EEvent.数値更新)
\r
245 st.e現在のモード = EMode.進行表示中;
\r
246 st.nジャンプインデックス値 = 0;
\r
247 st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;
\r
251 st.n現在表示中のCOMBO値 = st.nCOMBO値;
\r
255 if ((e今回の状態遷移イベント == EEvent.非表示) || (e今回の状態遷移イベント == EEvent.ミス通知))
\r
258 st.e現在のモード = EMode.残像表示中;
\r
259 //st.n残像表示中のCOMBO値 = st.n現在表示中のCOMBO値;
\r
260 st.nコンボが切れた時刻 = CDTXMania.Instance.Timer.n現在時刻;
\r
264 if (e今回の状態遷移イベント == EEvent.数値更新)
\r
266 st.nジャンプインデックス値 = 0;
\r
267 st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;
\r
270 st.n現在表示中のCOMBO値 = st.nCOMBO値;
\r
271 this.tコンボ表示(inst, st.nCOMBO値, st.nジャンプインデックス値);
\r
275 if (e今回の状態遷移イベント == EEvent.数値更新)
\r
278 st.e現在のモード = EMode.進行表示中;
\r
281 if ((CDTXMania.Instance.Timer.n現在時刻 - st.nコンボが切れた時刻) > 1000)
\r
284 st.e現在のモード = EMode.非表示中;
\r
287 st.n現在表示中のCOMBO値 = st.nCOMBO値;
\r