+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.Runtime.InteropServices;\r
-using System.Drawing;\r
-using SharpDX;\r
-using FDK;\r
-\r
-namespace DTXMania\r
-{\r
- internal class CAct演奏Combo共通 : CActivity\r
- {\r
- public STDGBSValue<CComboStatus> dgbコンボ数;\r
- public class CComboStatus\r
- {\r
- //public CAct演奏Combo共通 act;\r
- public int n最高値 { get; private set; }\r
- public int n現在値 { get; private set; }\r
-\r
- public CAct演奏Combo共通.EMode e現在のモード = EMode.非表示中;\r
- public int nCOMBO値 = 0;\r
- public long nコンボが切れた時刻 = -1;\r
- public int nジャンプインデックス値 = 99999;\r
- public int n現在表示中のCOMBO値 = 0;\r
- public long n前回の時刻_ジャンプ用 = -1;\r
-\r
- public void IncrementCombo()\r
- {\r
- ++n現在値;\r
- if (n現在値 > n最高値)\r
- {\r
- n最高値 = n現在値;\r
- }\r
- nCOMBO値 = n現在値;\r
- }\r
- public void ResetCombo()\r
- {\r
- n現在値 = 0;\r
- }\r
- }\r
-\r
- private int[] nジャンプ差分値 = new int[180];\r
- // private STDGBVALUE<CSTAT> status;\r
- private CTexture tex;\r
-\r
- public enum EEvent\r
- {\r
- 非表示,\r
- 数値更新,\r
- 同一数値,\r
- ミス通知\r
- }\r
-\r
- public enum EMode\r
- {\r
- 非表示中,\r
- 進行表示中,\r
- 残像表示中\r
- }\r
-\r
- public CAct演奏Combo共通()\r
- {\r
- this.b活性化してない = true;\r
-\r
- // 180度分のジャンプY座標差分を取得。(0度: 0 → 90度:-15 → 180度: 0)\r
- for (int i = 0; i < 180; i++)\r
- {\r
- this.nジャンプ差分値[i] = (int)(-15.0 * Math.Sin((Math.PI * i) / 180.0) * Scale.Y);\r
- }\r
- }\r
-\r
- private void tコンボ表示(EPart inst, int nCombo値, int nジャンプインデックス)\r
- {\r
- int x, y;\r
- x = CDTXMania.Instance.ConfigIni.cdComboX[inst][CDTXMania.Instance.ConfigIni.eActiveInst];\r
- y = CDTXMania.Instance.ConfigIni.cdComboY[inst][CDTXMania.Instance.ConfigIni.eActiveInst];\r
- if (CDTXMania.Instance.ConfigIni.bReverse[inst])\r
- {\r
- y = SampleFramework.GameWindowSize.Height - y\r
- - CDTXMania.Instance.Coordinates.ImgComboCombo.H - CDTXMania.Instance.Coordinates.ImgComboOneDigit.H;\r
- }\r
-\r
- if (tex != null)\r
- {\r
- tex.n透明度 = 0xff;\r
- }\r
-\r
- int[] n位の数 = new int[10];\r
- // 表示は10桁もあれば足りるだろう\r
- //-----------------\r
- if (CDTXMania.Instance.ConfigIni.bDisplayCombo[inst] && nCombo値 > 0)\r
- {\r
- // n位の数[] の格納。(例:nCombo値=125 のとき n位の数 = { 5,2,1,0,0,0,0,0,0,0 })\r
- int n = nCombo値;\r
- int n桁数 = 0;\r
- int n全桁の合計幅 = 0;\r
- while ((n > 0) && (n桁数 < 10))\r
- {\r
- n位の数[n桁数] = n % 10; // 1の位を格納\r
- n = (n - (n % 10)) / 10; // 右へシフト(例: 12345 → 1234 )\r
- n全桁の合計幅 += CDTXMania.Instance.Coordinates.ImgComboOneDigit.W;\r
- n桁数++;\r
- }\r
-\r
- // "COMBO" の拡大率を設定\r
- float f拡大率 = 1.0f;\r
- if (nジャンプインデックス >= 0 && nジャンプインデックス < 180)\r
- f拡大率 = 1.0f - (((float)this.nジャンプ差分値[nジャンプインデックス]) / 45.0f); // f拡大率 = 1.0 → 1.3333... → 1.0\r
-\r
- if (this.tex != null)\r
- {\r
- this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);\r
- }\r
-\r
- // "COMBO" 文字を表示\r
- int cbx = x - ((int)((CDTXMania.Instance.Coordinates.ImgComboCombo.W * f拡大率) / 2.0f));\r
- if (this.tex != null)\r
- this.tex.t2D描画(CDTXMania.Instance.Device,\r
- cbx,\r
- y + CDTXMania.Instance.Coordinates.ImgComboOneDigit.H,\r
- CDTXMania.Instance.Coordinates.ImgComboCombo);\r
-\r
- x = x + (n全桁の合計幅 / 2);\r
- // 1文字ずつ表示していく\r
- for (int i = 0; i < n桁数; i++)\r
- {\r
- f拡大率 = 1.0f;\r
- if (nジャンプインデックス >= 0 && nジャンプインデックス < 180)\r
- f拡大率 = 1.0f - (((float)this.nジャンプ差分値[nジャンプインデックス]) / 45f); // f拡大率 = 1.0 → 1.3333... → 1.0\r
-\r
- if (this.tex != null)\r
- this.tex.vc拡大縮小倍率 = new Vector3(f拡大率, f拡大率, 1.0f);\r
-\r
- x -= CDTXMania.Instance.Coordinates.ImgComboOneDigit.W;\r
-\r
- if (this.tex != null)\r
- {\r
- this.tex.t2D描画(\r
- CDTXMania.Instance.Device,\r
- x - ((int)(((f拡大率 - 1.0f) * CDTXMania.Instance.Coordinates.ImgComboOneDigit.W) / 2.0f)),\r
- y - ((int)(((f拡大率 - 1.0f) * CDTXMania.Instance.Coordinates.ImgComboOneDigit.H) / 2.0f)),\r
- CDTXMania.Instance.Coordinates.ImgComboOneDigit.ApplyCounterXY(n位の数[i] % 4, n位の数[i] / 4, 0, 0));\r
- }\r
- }\r
- }\r
- }\r
-\r
-\r
- // CActivity 実装\r
- public override void On活性化()\r
- {\r
- this.dgbコンボ数 = new STDGBSValue<CComboStatus>();\r
- for (EPart i = EPart.Drums; i <= EPart.Bass; i++)\r
- {\r
- this.dgbコンボ数[i] = new CComboStatus();\r
- }\r
- base.On活性化();\r
- }\r
-\r
- public override void On非活性化()\r
- {\r
- base.On非活性化();\r
- }\r
-\r
- public override void OnManagedリソースの作成()\r
- {\r
- if (this.b活性化してない)\r
- return;\r
-\r
- // this.txCOMBOドラム = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums-combo-drums2.png"));\r
- this.tex = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums-combo-guitar2.png"));\r
-\r
- base.OnManagedリソースの作成();\r
- }\r
-\r
- public override void OnManagedリソースの解放()\r
- {\r
- if (this.b活性化してない)\r
- return;\r
-\r
- // TextureFactory.tテクスチャの解放(ref this.txCOMBOドラム);\r
- TextureFactory.tテクスチャの解放(ref this.tex);\r
-\r
- base.OnManagedリソースの解放();\r
- }\r
-\r
- public override int On進行描画()\r
- {\r
- if (!this.b活性化してない)\r
- {\r
- for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
- {\r
- if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) && CDTXMania.Instance.DTX.bチップがある[inst])\r
- {\r
- EEvent e今回の状態遷移イベント;\r
- CComboStatus st = this.dgbコンボ数[inst];\r
-\r
- // 前回と今回の COMBO 値から、e今回の状態遷移イベントを決定する。\r
- if (st.n現在表示中のCOMBO値 == st.nCOMBO値)\r
- {\r
- e今回の状態遷移イベント = EEvent.同一数値;\r
- }\r
- else if (st.n現在表示中のCOMBO値 > st.nCOMBO値)\r
- {\r
- e今回の状態遷移イベント = EEvent.ミス通知;\r
- }\r
- else if ((st.n現在表示中のCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]) &&\r
- (st.nCOMBO値 < CDTXMania.Instance.ConfigIni.nMinComboDisp[inst]))\r
- {\r
- e今回の状態遷移イベント = EEvent.非表示;\r
- }\r
- else\r
- {\r
- e今回の状態遷移イベント = EEvent.数値更新;\r
- }\r
-\r
- // nジャンプインデックス値 の進行。\r
- if (st.nジャンプインデックス値 < 360)\r
- {\r
- if ((st.n前回の時刻_ジャンプ用 == -1) || (CDTXMania.Instance.Timer.n現在時刻 < st.n前回の時刻_ジャンプ用))\r
- {\r
- st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
- }\r
-\r
- const long INTERVAL = 2;\r
-\r
- long diff = CDTXMania.Instance.Timer.n現在時刻 - st.n前回の時刻_ジャンプ用;\r
- st.n前回の時刻_ジャンプ用 += INTERVAL * (diff / INTERVAL);\r
- st.nジャンプインデックス値 += 3 * (int)(diff / INTERVAL);\r
- if (st.nジャンプインデックス値 >= 2000)\r
- {\r
- st.nジャンプインデックス値 -= 3 * ((st.nジャンプインデックス値 - 2000) / 3 + 1);\r
- }\r
- }\r
-\r
-\r
- Retry: // モードが変化した場合はここからリトライする。\r
-\r
- switch (st.e現在のモード)\r
- {\r
- case EMode.非表示中:\r
- if (e今回の状態遷移イベント == EEvent.数値更新)\r
- {\r
- // モード変更\r
- st.e現在のモード = EMode.進行表示中;\r
- st.nジャンプインデックス値 = 0;\r
- st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
- goto Retry;\r
- }\r
-\r
- st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
- break;\r
-\r
- case EMode.進行表示中:\r
- if ((e今回の状態遷移イベント == EEvent.非表示) || (e今回の状態遷移イベント == EEvent.ミス通知))\r
- {\r
- // モード変更\r
- st.e現在のモード = EMode.残像表示中;\r
- //st.n残像表示中のCOMBO値 = st.n現在表示中のCOMBO値;\r
- st.nコンボが切れた時刻 = CDTXMania.Instance.Timer.n現在時刻;\r
- goto Retry;\r
- }\r
-\r
- if (e今回の状態遷移イベント == EEvent.数値更新)\r
- {\r
- st.nジャンプインデックス値 = 0;\r
- st.n前回の時刻_ジャンプ用 = CDTXMania.Instance.Timer.n現在時刻;\r
- }\r
-\r
- st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
- this.tコンボ表示(inst, st.nCOMBO値, st.nジャンプインデックス値);\r
- break;\r
-\r
- case EMode.残像表示中:\r
- if (e今回の状態遷移イベント == EEvent.数値更新)\r
- {\r
- // モード変更1\r
- st.e現在のモード = EMode.進行表示中;\r
- goto Retry;\r
- }\r
- if ((CDTXMania.Instance.Timer.n現在時刻 - st.nコンボが切れた時刻) > 1000)\r
- {\r
- // モード変更2\r
- st.e現在のモード = EMode.非表示中;\r
- goto Retry;\r
- }\r
- st.n現在表示中のCOMBO値 = st.nCOMBO値;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- return 0;\r
- }\r
- }\r
-}\r