--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Drawing;
+using System.IO;
+using SharpDX;
+using FDK;
+
+using Rectangle = System.Drawing.Rectangle;
+
+namespace DTXMania
+{
+ internal class CAct演奏グラフ : CActivity
+ {
+ // #24074 2011.01.23 ikanick グラフの描画
+ // 実装内容
+ // ・左を現在、右を目標
+ // ・基準線(60,70,80,90,100%)を超えると線が黄色くなる(元は白)
+ // ・目標を超えると現在が光る
+ // ・オート時には描画しない
+ // 要望・実装予定
+ // ・グラフを波打たせるなどの視覚の向上→実装済
+ // 修正等
+ // ・画像がないと落ちる→修正済
+
+ public STDGBSValue<double> dbTarget;
+ private STDGBSValue<double> dbTargetDisp;
+ public STDGBSValue<double> dbCurrent;
+ private STDGBSValue<double> dbCurrentDisp;
+
+ private CTexture txグラフ;
+
+ private STDGBSValue<CCounter> counterYposInImg;
+ private readonly int slices = 10;
+
+ public CAct演奏グラフ()
+ {
+ base.b活性化してない = true;
+ }
+
+ public override void On活性化()
+ {
+ if (base.b活性化してない)
+ {
+ this.dbTarget = new STDGBSValue<double>();
+ dbTarget.Drums = dbTarget.Guitar = dbTarget.Bass = 80.0;
+ this.dbCurrent = new STDGBSValue<double>();
+ dbCurrent.Drums = dbCurrent.Guitar = dbCurrent.Bass = 0.0;
+ counterYposInImg = new STDGBSValue<CCounter>();
+ base.On活性化();
+ }
+ }
+
+ public override void OnManagedリソースの作成()
+ {
+ if (base.b活性化してる)
+ {
+ string pathグラフ = CSkin.Path(@"Graphics\ScreenPlay graph.png");
+ if (File.Exists(pathグラフ))
+ {
+ this.txグラフ = TextureFactory.tテクスチャの生成(pathグラフ);
+ }
+ base.OnManagedリソースの作成();
+ }
+ }
+
+ public override void OnManagedリソースの解放()
+ {
+ if (base.b活性化してる)
+ {
+ TextureFactory.tテクスチャの解放(ref this.txグラフ);
+ base.OnManagedリソースの解放();
+ }
+ }
+
+ public override int On進行描画()
+ {
+ if (b活性化してる && !CDTXMania.Instance.ConfigIni.bStoicMode)
+ {
+
+ for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)
+ {
+ if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) &&
+ CDTXMania.Instance.ConfigIni.bGraph[inst] &&
+ CDTXMania.Instance.DTX.bチップがある[inst])
+ {
+
+ if (base.b初めての進行描画)
+ {
+ base.b初めての進行描画 = false;
+ counterYposInImg.Drums = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);
+ counterYposInImg.Guitar = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);
+ counterYposInImg.Bass = new CCounter(0, 35, 16, CDTXMania.Instance.Timer);
+ }
+
+ counterYposInImg[inst].t進行Loop();
+ int stYposInImg = counterYposInImg[inst].n現在の値;
+
+ int gx = CDTXMania.Instance.ConfigIni.cdInstX[inst][CDTXMania.Instance.ConfigIni.eActiveInst].Value
+ + CDTXMania.Instance.Coordinates.Instrument[inst].W;
+ int gy = 0;
+
+ if (this.txグラフ != null)
+ {
+ // 背景暗幕
+ this.txグラフ.n透明度 = 128;
+ this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;
+ this.txグラフ.vc拡大縮小倍率.Y = CDTXMania.Instance.Coordinates.Graph[inst].H;
+ this.txグラフ.t2D描画(CDTXMania.Instance.Device, gx, gy, new Rectangle(62, 0, 1, 1));
+
+ // 基準線
+ this.txグラフ.vc拡大縮小倍率.X = CDTXMania.Instance.Coordinates.Graph[inst].W;
+ this.txグラフ.vc拡大縮小倍率.Y = 1f;
+
+ for (int i = 0; i < slices; i++)
+ {
+ if (this.dbCurrent[inst] < (100 - i * slices))
+ {
+ // 通常の基準線(白)
+ this.txグラフ.n透明度 = 128;
+ this.txグラフ.t2D描画(CDTXMania.Instance.Device,
+ gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H * i / slices, new Rectangle(60, 0, 1, 1));
+ }
+ else
+ {
+ // 基準線を越えたら線が黄色くなる
+ this.txグラフ.n透明度 = 224;
+ this.txグラフ.t2D描画(CDTXMania.Instance.Device,
+ gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H * i / slices, new Rectangle(61, 0, 1, 1));
+ }
+ }
+
+ // グラフのゲージ部分
+
+ // --現在値
+ this.txグラフ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);
+
+ if (this.dbCurrentDisp[inst] < this.dbCurrent[inst])
+ {
+ this.dbCurrentDisp[inst] += (this.dbCurrent[inst] - this.dbCurrentDisp[inst]) / 5 + 0.01;
+ }
+ else
+ {
+ this.dbCurrentDisp[inst] = this.dbCurrent[inst];
+ }
+ int ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbCurrentDisp[inst] / 100.0);
+
+ this.txグラフ.n透明度 = 224;
+ this.txグラフ.t2D描画(
+ CDTXMania.Instance.Device,
+ gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,
+ new Rectangle(0, 5 + stYposInImg, 30, ar)
+ );
+ this.txグラフ.t2D描画( // 上部白いバー
+ CDTXMania.Instance.Device,
+ gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,
+ new Rectangle(63 + 0, 0, 30, 5)
+ );
+
+ // 目標を超えた時に発光?させる
+ if ((dbCurrent[inst] >= dbTarget[inst]))
+ {
+ this.txグラフ.n透明度 = 128;
+ this.txグラフ.b加算合成 = true;
+ this.txグラフ.t2D描画(
+ CDTXMania.Instance.Device,
+ gx, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,
+ new Rectangle(0, 5 + stYposInImg, 30, ar)
+ );
+ this.txグラフ.b加算合成 = false;
+ }
+
+ // --目標値
+ if (this.dbTargetDisp[inst] < this.dbTarget[inst])
+ {
+ this.dbTargetDisp[inst] += (this.dbTarget[inst] - this.dbTargetDisp[inst]) / 5 + 0.01;
+ }
+ else
+ {
+ this.dbTargetDisp[inst] = this.dbTarget[inst];
+ }
+ ar = (int)(CDTXMania.Instance.Coordinates.Graph[inst].H * this.dbTargetDisp[inst] / 100.0);
+
+ this.txグラフ.n透明度 = 224;
+ this.txグラフ.t2D描画(
+ CDTXMania.Instance.Device,
+ gx + 30,
+ gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,
+ new Rectangle(30, 5 + stYposInImg, 30, ar)
+ );
+ this.txグラフ.t2D描画( // 上部白いバー
+ CDTXMania.Instance.Device, gx + 30, gy + CDTXMania.Instance.Coordinates.Graph[inst].H - ar,
+ new Rectangle(63 + 30, 0, 30, 5)
+ );
+ }
+ }
+ }
+ }
+ return 0;
+ }
+ }
+}