private void _フレームを描画する(DeviceContext1 dc, Matrix3x2 換行列2D, float 透明度0to1, VideoFrame 描画するフレーム) { if (null == 描画するフレーム) { return; } グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { dc.Transform = (換行列2D) * dc.Transform; dc.PrimitiveBlend = (this.加算合成) ? PrimitiveBlend.Add : PrimitiveBlend.SourceOver; dc.DrawBitmap(描画するフレーム.Bitmap, 透明度0to1, InterpolationMode.NearestNeighbor); }); }
public static void CopyToTexture(DeviceContext1 context, Texture2D source, Texture2D destination, int subResource = 0) { if (source.Description.SampleDescription.Count > 1 || source.Description.SampleDescription.Quality > 0) { context.ResolveSubresource(source, subResource, destination, 0, destination.Description.Format); } else { // Not multisampled, so just copy to the destination context.CopySubresourceRegion(source, subResource, null, destination, 0); //context.CopyResource(source, destination); } }
private void _サブタイトルを描画する(DeviceContext1 dc) { var 表示位置dpx = new Vector2(782f, 520f); // 拡大率を計算して描画する。 float 最大幅dpx = グラフィックデバイス.Instance.設計画面サイズ.Width - 表示位置dpx.X; this._サブタイトル画像.描画する( dc, 表示位置dpx.X, 表示位置dpx.Y, X方向拡大率: (this._サブタイトル画像.画像サイズdpx.Width <= 最大幅dpx) ? 1f : 最大幅dpx / this._サブタイトル画像.画像サイズdpx.Width); }
public void 描画する(DeviceContext1 dc, RectangleF 描画先矩形, float 透明度0to1 = 1.0f) { if (null == this._VideoSource) { return; } var 換行列2D = Matrix3x2.Scaling(描画先矩形.Width / this._VideoSource.フレームサイズ.Width, 描画先矩形.Height / this._VideoSource.フレームサイズ.Height) * // 拡大縮小 Matrix3x2.Translation(描画先矩形.Left, 描画先矩形.Top); // 平行移動 this.描画する(dc, 換行列2D, 透明度0to1); }
public void 描画する(DeviceContext1 dc) { var 領域 = new RectangleF(78f, 455f, 357f, 55f); if (App.曲ツリー.フォーカス曲ノード != this._現在表示しているノード) { #region " フォーカスノードが変更されたので情報を更新する。" //---------------- this._現在表示しているノード = App.曲ツリー.フォーカス曲ノード; this._最小BPM = 120.0; this._最大BPM = 120.0; if (null != this._現在表示しているノード) { using (var songdb = new SongDB()) { var song = songdb.Songs.Where((r) => (r.Path == this._現在表示しているノード.曲ファイルの絶対パス.数なしパス)).SingleOrDefault(); if (null != song) { this._最小BPM = song.MinBPM ?? 120.0; this._最大BPM = song.MaxBPM ?? 120.0; } } } //---------------- #endregion } this._BPMパネル.描画する(領域.X - 5f, 領域.Y - 4f); bool 表示可能ノードである = (this._現在表示しているノード is MusicNode); if (表示可能ノードである) { if (10.0 >= Math.Abs(this._最大BPM - this._最小BPM)) { // (A) 「最小値」だけ描画。差が10以下なら同一値とみなす。 this._パラメータ文字.描画する(dc, 領域.X + 120f, 領域.Y, this._最小BPM.ToString("0").PadLeft(3)); } else { // (B) 「最小~最大」を描画。 this._パラメータ文字.描画する(dc, 領域.X + 80f, 領域.Y, this._最小BPM.ToString("0") + "~" + this._最大BPM.ToString("0")); } } }
public override void 進行描画する(DeviceContext1 dc) { // 進行描画 if (this._初めての進行描画) { this._背景.ぼかしと縮小を適用する(0.0); // 即時適用 this._初めての進行描画 = false; } this._背景.進行描画する(dc); グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { dc.FillRectangle(new RectangleF(0f, 36f, グラフィックデバイス.Instance.設計画面サイズ.Width, グラフィックデバイス.Instance.設計画面サイズ.Height - 72f), this._黒マスクブラシ); }); this._プレビュー画像を描画する(dc); this._曲名パネル.描画する(dc, 660f, 796f); this._曲名を描画する(dc); this._サブタイトルを描画する(dc); this._演奏パラメータ結果.描画する(dc, 1317f, 716f, this._結果); // 入力 App.入力管理.すべての入力デバイスをポーリングする(); switch (this.現在のフェーズ) { case フェーズ.表示: if (App.入力管理.確定キーが入力された()) { App.システムサウンド.再生する(システムサウンド種別.取消音); // 確定だけど取消音 App.ステージ管理.アイキャッチを選択しクローズする(nameof(シャッター)); this.現在のフェーズ = フェーズ.フェードアウト; } break; case フェーズ.フェードアウト: App.ステージ管理.現在のアイキャッチ.進行描画する(dc); if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.クローズ完了) { this.現在のフェーズ = フェーズ.確定; } break; case フェーズ.確定: break; } }
public void 進行描画する(DeviceContext1 dc) { foreach (表示レーン種別 lane in Enum.GetValues(typeof(表示レーン種別))) { var laneContext = this._レーンtoレーンContext[lane]; if (laneContext.アニメカウンタ.動作中である && laneContext.アニメカウンタ.終了値に達していない) { this._レーンフラッシュ画像.描画する( dc, laneContext.開始位置dpx.X, laneContext.開始位置dpx.Y - laneContext.アニメカウンタ.現在値の割合 * レーンフレーム.領域.Height, 透明度0to1: 1f - laneContext.アニメカウンタ.現在値の割合, 転送元矩形: laneContext.転送元矩形); } } }
public void 描画する(DeviceContext1 dc) { // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。 var 画面左上dpx = new Vector3( // 3D視点で見る画面左上の座標。 -グラフィックデバイス.Instance.設計画面サイズ.Width / 2f, +グラフィックデバイス.Instance.設計画面サイズ.Height / 2f, 0f); var 換行列 = Matrix.Scaling(this.クリアパネル.サイズ.Width, this.クリアパネル.サイズ.Height, 1f) * Matrix.RotationY(MathUtil.DegreesToRadians(-48f)) * Matrix.Translation(画面左上dpx.X + 230f, 画面左上dpx.Y - 530f, 0f); this.クリアパネル.描画する(換行列); }
public void Create( IntPtr hwnd, Size2 size, CompositionType compositionType) { DebugSelect(DeviceCreationFlags.Debug, DeviceCreationFlags.None, out DeviceCreationFlags creationFlags); creationFlags |= DeviceCreationFlags.BgraSupport | DeviceCreationFlags.SingleThreaded; Device = CreateDevice(creationFlags); Context = Device.ImmediateContext1; Dxgi().Initialize(Device.QueryInterface <DXGI.Device2>(), hwnd, compositionType, size); Connect(); }
public void 進行描画する(DeviceContext1 dc) { // パネルを合計8枚表示する。(左隠れ1枚 + 表示6枚 + 右隠れ1枚) int 表示元の位置 = this._表示開始位置; for (int i = 0; i < 8; i++) { var 画像 = this._パネルs[表示元の位置].画像; 画像.描画する( (float)((768f + this._横方向差分割合.Value * 144f) + 144f * i), (3 == i) ? 100f : 54f); // i==3 が現在の選択パネル 表示元の位置 = (表示元の位置 + 1) % this._パネルs.Count; } }
public void 進行描画する(DeviceContext1 dc) { グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { using (var 水色ブラシ = new SolidColorBrush(dc, new Color4(0xffdd8e69))) using (var 黄色ブラシ = new SolidColorBrush(dc, new Color4(0xff17fffe))) { var 今回のライン全体の矩形 = new RectangleF(1357f, 108f, 10f, 768f); var 過去最高のライン全体の矩形 = new RectangleF(1371f, 108f, 6f, 768f); const float 単位幅 = 12f; // (1) 今回のカウントマップラインを描画する。 for (int i = 0; i < this.カウントマップ.Length; i++) { if (0 == this.カウントマップ[i]) { continue; } dc.FillRectangle( new RectangleF(今回のライン全体の矩形.Left, 今回のライン全体の矩形.Bottom - 単位幅 * (i + 1), 今回のライン全体の矩形.Width, 単位幅), (2 <= this.カウントマップ[i]) ? 黄色ブラシ : 水色ブラシ); } // (2) 過去の最高カウントマップラインを描画する。 if (null != this._過去最大のカウントマップ) { for (int i = 0; i < this._過去最大のカウントマップ.Length; i++) { if (0 == this._過去最大のカウントマップ[i]) { continue; } dc.FillRectangle( new RectangleF(過去最高のライン全体の矩形.Left, 過去最高のライン全体の矩形.Bottom - 単位幅 * (i + 1), 過去最高のライン全体の矩形.Width, 単位幅), (2 <= this._過去最大のカウントマップ[i]) ? 黄色ブラシ : 水色ブラシ); } } } }); }
private void _プレビュー画像を描画する(DeviceContext1 dc, Node ノード) { var 画像 = ノード.ノード画像 ?? Node.既定のノード画像; // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。 var 換行列 = Matrix.Scaling( this._プレビュー画像表示サイズdpx.X / 画像.サイズ.Width, this._プレビュー画像表示サイズdpx.Y / 画像.サイズ.Height, 0f) * Matrix.Translation( グラフィックデバイス.Instance.画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f, グラフィックデバイス.Instance.画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f, 0f); 画像.描画する(換行列); }
/// <summary> /// アイキャッチのアニメーションを進行し、アイキャッチ画像を描画する。 /// </summary> public void 進行描画する(DeviceContext1 dc) { switch (this.現在のフェーズ) { case フェーズ.未定: break; case フェーズ.クローズ: case フェーズ.クローズ完了: this.進行描画する(dc, StoryboardStatus.Scheduled); break; case フェーズ.オープン: case フェーズ.オープン完了: this.進行描画する(dc, StoryboardStatus.Ready); break; } }
private void _次のフレームを読み込んで描画する(DeviceContext1 dc, Matrix3x2 換行列2D, float 透明度0to1 = 1.0f) { if (null == this._VideoSource) { return; } // デコードが間に合ってない場合にはブロックする。 // ブロックされたくない場合は、事前に Peek() でチェックしておくこと。 var 次のフレーム = this._VideoSource.Read(); // 描画。 this._フレームを描画する(dc, 換行列2D, 透明度0to1, 次のフレーム); // 更新。 this._最後に描画したフレーム?.Dispose(); this._最後に描画したフレーム = 次のフレーム; }
/// <summary> /// 画像を描画する。 /// </summary> /// <param name="変換行列2D">Transform に適用する行列。</param> /// <param name="変換行列3D">射影行列。</param> /// <param name="不透明度0to1">不透明度。(0:透明~1:不透明)</param> /// <param name="転送元矩形">描画する画像範囲。</param> public virtual void 描画する(DeviceContext1 dc, Matrix3x2?換行列2D = null, Matrix?換行列3D = null, float 透明度0to1 = 1.0f, RectangleF?転送元矩形 = null, LayerParameters1?レイヤーパラメータ = null) { Debug.Assert(this.活性化している); if (null == this._Bitmap) { return; } グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { var pretrans = dc.Transform; // 変換行列とブレンドモードをD2Dレンダーターゲットに設定する。 dc.Transform = (換行列2D ?? Matrix3x2.Identity) * pretrans; dc.PrimitiveBlend = (this.加算合成) ? PrimitiveBlend.Add : PrimitiveBlend.SourceOver; using (var layer = new Layer(dc)) { // レイヤーパラメータの指定があれば、描画前に Push する。 if (null != レイヤーパラメータ) { dc.PushLayer((LayerParameters1)レイヤーパラメータ, layer); } // D2Dレンダーターゲットに this.Bitmap を描画する。 dc.DrawBitmap( bitmap: this._Bitmap, destinationRectangle: null, opacity: 透明度0to1, interpolationMode: this.補正モード, sourceRectangle: 転送元矩形, erspectiveTransformRef: 換行列3D); // null 指定可。 // レイヤーパラメータの指定があれば、描画後に Pop する。 if (null != レイヤーパラメータ) { dc.PopLayer(); } } }); }
public void 進行描画する(DeviceContext1 dc) { var 描画位置 = new Vector2(569f, 188f); const float リストの改行幅 = 160f; // 選択中のパネルの光彩アニメーションの進行。 float 透明度 = 0f; var 割合 = this._光彩アニメカウンタ.現在値の割合; if (0.5f > 割合) { 透明度 = 1.0f - (割合 * 2.0f); // 1→0 } else { 透明度 = (割合 - 0.5f) * 2.0f; // 0→1 } // ユーザリストを描画する。 int 表示人数 = Math.Min(5, App.ユーザ管理.ユーザリスト.Count); // HACK: 現状は最大5人までとする。 for (int i = 0; i < 表示人数; i++) { var user = App.ユーザ管理.ユーザリスト[i]; var playMode = user.演奏モード; if (i == this.選択中のユーザ) { this._ユーザパネル光彩付き[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i, 透明度0to1: 透明度); } this._ユーザパネル[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i); this._ユーザ名.表示文字列 = user.ユーザ名; this._ユーザ名.描画する(dc, 描画位置.X + 32f, 描画位置.Y + 40f + リストの改行幅 * i); this._ユーザ肩書きパネル[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i); } }
public virtual void 進行描画する(DeviceContext1 dc, float left, float top, bool 選択中) { float 拡大率Y = (float)this._パネルの高さ割合.Value; float パネルとヘッダの上下マージン = サイズ.Height * (1f - 拡大率Y) / 2f; float テキストの上下マージン = 76f * (1f - 拡大率Y) / 2f; var パネル矩形 = new RectangleF(left, top + パネルとヘッダの上下マージン, サイズ.Width, サイズ.Height * 拡大率Y); var ヘッダ矩形 = new RectangleF(left, top + パネルとヘッダの上下マージン, 40f, サイズ.Height * 拡大率Y); var テキスト矩形 = new RectangleF(left + 20f, top + 10f + テキストの上下マージン, 280f, 76f * 拡大率Y); if (選択中) { // 選択されているパネルは、パネル矩形を左右にちょっと大きくする。 パネル矩形.Left -= 38f; パネル矩形.Width += 38f * 2f; } // (1) パネルの下地部分の描画。 グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { using (var パネル背景色 = new SolidColorBrush(dc, new Color4(Color3.Black, 0.5f))) using (var ヘッダ背景色 = new SolidColorBrush(dc, this.ヘッダ色)) using (var テキスト背景色 = new SolidColorBrush(dc, Color4.Black)) { dc.FillRectangle(パネル矩形, パネル背景色); dc.FillRectangle(ヘッダ矩形, ヘッダ背景色); dc.FillRectangle(テキスト矩形, テキスト背景色); } }); // (2) パネル名の描画。 float 拡大率X = Math.Min(1f, (テキスト矩形.Width - 20f) / this._パネル名画像.画像サイズdpx.Width); // -20 は左右マージンの最低値[dpx] this._パネル名画像.描画する( dc, テキスト矩形.Left + (テキスト矩形.Width - this._パネル名画像.画像サイズdpx.Width * 拡大率X) / 2f, テキスト矩形.Top + (テキスト矩形.Height - this._パネル名画像.画像サイズdpx.Height * 拡大率Y) / 2f, X方向拡大率: 拡大率X, Y方向拡大率: 拡大率Y); }
public void 進行描画する(DeviceContext1 dc, float left, float top) { const float パネルの下マージン = 4f; float パネルの高さ = パネル.サイズ.Height + パネルの下マージン; // (1) フレーム1(たて線)を描画。 this._青い線.描画する(dc, new Vector2(left, 0f), 高さdpx: グラフィックデバイス.Instance.設計画面サイズ.Height); // (2) パネルを描画。(選択中のパネルの3つ上から7つ下までの計11枚。) var panels = this._現在のパネルフォルダ.子パネルリスト; for (int i = 0; i < 11; i++) { int 描画パネル番号 = ((panels.SelectedIndex - 3 + i) + panels.Count * 3) % panels.Count; // panels の末尾に達したら先頭に戻る。 var 描画パネル = panels[描画パネル番号]; 描画パネル.進行描画する( dc, left + 22f, top + i * パネルの高さ, 選択中: (i == 3)); } // (3) フレーム2(選択パネル周囲)を描画。 float 幅 = パネル.サイズ.Width + 22f * 2f; this._青い線.描画する(dc, new Vector2(left, パネルの高さ * 3f), 幅dpx: 幅); this._青い線.描画する(dc, new Vector2(left, パネルの高さ * 4f), 幅dpx: 幅); this._青い線.描画する(dc, new Vector2(left + 幅, パネルの高さ * 3f), 高さdpx: パネルの高さ); // (4) パッド矢印(上&下)を描画。 this._パッド矢印.描画する(dc, パッド矢印.種類._Tom1, new Vector2(left, パネルの高さ * 3f)); this._パッド矢印.描画する(dc, パッド矢印.種類._Tom2, new Vector2(left, パネルの高さ * 4f)); }
public void 進行描画する(DeviceContext1 dc) { if (null == this._カウンタ) { return; } if (2000 <= this._カウンタ.現在値) { float 割合 = (this._カウンタ.現在値 - 2000) / 300f; // 0→1 // 上 this._ランナー画像.描画する( 1920f - 割合 * (1920f - 1044f), 485f - this._ランナー画像.サイズ.Height / 2f); // 下 this._ランナー画像.描画する( 1920f - 割合 * (1920f - 1044f), 598f - this._ランナー画像.サイズ.Height / 2f); } }
private void _プレビュー画像を描画する(DeviceContext1 dc) { var 選択曲 = App.曲ツリー.フォーカス曲ノード; Debug.Assert(null != 選択曲); var preimage = 選択曲.ノード画像 ?? Node.既定のノード画像; Debug.Assert(null != preimage); // 枠 グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { const float 枠の太さdpx = 5f; dc.FillRectangle( new RectangleF( this._プレビュー画像表示位置dpx.X - 枠の太さdpx, this._プレビュー画像表示位置dpx.Y - 枠の太さdpx, this._プレビュー画像表示サイズdpx.X + 枠の太さdpx * 2f, this._プレビュー画像表示サイズdpx.Y + 枠の太さdpx * 2f), this._プレビュー枠ブラシ); }); // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。 var 画面左上dpx = new Vector3( // 3D視点で見る画面左上の座標。 -グラフィックデバイス.Instance.設計画面サイズ.Width / 2f, +グラフィックデバイス.Instance.設計画面サイズ.Height / 2f, 0f); var 換行列 = Matrix.Scaling(this._プレビュー画像表示サイズdpx) * Matrix.Translation( 画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f, 画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f, 0f); preimage.描画する(換行列); }
private void _導線を描画する(DeviceContext1 dc) { var h = (float)this._上に伸びる導線の長さdpx.Value; this._青い線.描画する(dc, new Vector2(1044f, 485f - h), 高さdpx: h); var w = (float)this._左に伸びる導線の長さdpx.Value; this._青い線.描画する(dc, new Vector2(1046f - w, 278f), 幅dpx: w); var z = (float)this._プレビュー枠の長さdpx.Value; // マージン×2 込み var = this._プレビュー画像表示位置dpx.Y; var = this._プレビュー画像表示位置dpx.Y + this._プレビュー画像表示サイズdpx.Y; var 左 = this._プレビュー画像表示位置dpx.X; var 右 = this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X; this._青い線.描画する(dc, new Vector2(右 + this._青枠のマージンdpx - z, ), 幅dpx: z); // 上辺 this._青い線.描画する(dc, new Vector2(右 + this._青枠のマージンdpx - z, ), 幅dpx: z); // 下辺 this._青い線.描画する(dc, new Vector2(左, +this._青枠のマージンdpx - z), 高さdpx: z); // 左辺 this._青い線.描画する(dc, new Vector2(右, +this._青枠のマージンdpx - z), 高さdpx: z); // 右辺 }
public void 進行描画する(DeviceContext1 dc, double?スキル値) { if (null == スキル値) { return; } var skill = (double)スキル値; var 描画領域 = new RectangleF(108f, 780f, 275f, 98f); string スキル値文字列 = skill.ToString("0.00").PadLeft(6).Replace(' ', 'o'); // 右詰め、余白は'o'。 グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { var pretrans = dc.Transform; // 曲別SKILLアイコンを描画する dc.Transform = Matrix3x2.Scaling(0.375f, 0.5f) * Matrix3x2.Translation(描画領域.X, 描画領域.Y) * pretrans; this._ロゴ画像.描画する(dc, 0f, 0f); // 小数部を描画する dc.Transform = Matrix3x2.Scaling(0.65f, 0.8f) * Matrix3x2.Translation(描画領域.X + 90f + 105f, 描画領域.Y + (描画領域.Height * 0.2f)) * pretrans; this._数字画像.描画する(dc, 0f, 0f, スキル値文字列.Substring(4)); // 整数部を描画する('.'含む) dc.Transform = Matrix3x2.Scaling(0.65f, 1.0f) * Matrix3x2.Translation(描画領域.X + 90f, 描画領域.Y) * pretrans; this._数字画像.描画する(dc, 0f, 0f, スキル値文字列.Substring(0, 4)); }); }
public override void 進行描画する(DeviceContext1 dc) { if (this._初めての進行描画) { this._舞台画像.ぼかしと縮小を適用する(0.0); App.ステージ管理.現在のアイキャッチ.オープンする(); this._初めての進行描画 = false; } this._舞台画像.進行描画する(dc); this._注意文.描画する(dc, 0f, 760f); this._プレビュー画像.描画する(dc); this._難易度.描画する(dc); this._曲名を描画する(dc); this._サブタイトルを描画する(dc); switch (this.現在のフェーズ) { case フェーズ.フェードイン: App.ステージ管理.現在のアイキャッチ.進行描画する(dc); if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.オープン完了) { this.現在のフェーズ = フェーズ.表示; } break; case フェーズ.表示: this._スコアを読み込む(); App.入力管理.すべての入力デバイスをポーリングする(); // 先行入力があったらここでキャンセル this.現在のフェーズ = フェーズ.完了; break; case フェーズ.完了: case フェーズ.キャンセル: break; } }
private void _小節線拍線を描画する(DeviceContext1 dc, double 現在の演奏時刻sec) { // 小節線・拍線 と チップ は描画階層(奥行き)が異なるので、別々のメソッドに分ける。 グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { this._描画範囲内のすべてのチップに対して(現在の演奏時刻sec, (chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離dpx) => { if (chip.チップ種別 == チップ種別.小節線) { float 位置dpx = (float)(ヒット判定位置Ydpx + ヒット判定バーとの距離dpx - 1f); // -1f は小節線の厚みの半分。 // 小節線 if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節線と拍線を表示する) { float x = 441f; float w = 780f; dc.DrawLine(new Vector2(x, 位置dpx + 0f), new Vector2(x + w, 位置dpx + 0f), this._小節線色); dc.DrawLine(new Vector2(x, 位置dpx + 1f), new Vector2(x + w, 位置dpx + 1f), this._小節線影色); } // 小節番号 if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節番号を表示する) { float 右位置dpx = 441f + 780f - 24f; // -24f は適当なマージン。 this._数字フォント中グレー48x64.描画する(dc, 右位置dpx, 位置dpx - 84f, chip.小節番号.ToString(), 右揃え: true); // -84f は適当なマージン。 } } else if (chip.チップ種別 == チップ種別.拍線) { // 拍線 if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節線と拍線を表示する) { float 位置dpx = (float)(ヒット判定位置Ydpx + ヒット判定バーとの距離dpx - 1f); // -1f は拍線の厚みの半分。 dc.DrawLine(new Vector2(441f, 位置dpx), new Vector2(441f + 780f, 位置dpx), this._拍線色, strokeWidth: 1f); } } }); }); }
public void 描画する(DeviceContext1 dc, 種類 type, Vector2 中央位置dpx, float 拡大率 = 1f) { var 矩形 = new RectangleF(); switch (type) { case 種類._Tom1: 矩形 = this._矢印の矩形リスト["Up"]; break; case 種類._Tom2: 矩形 = this._矢印の矩形リスト["Down"]; break; case 種類.左_Snare: 矩形 = this._矢印の矩形リスト["Left"]; break; case 種類.右_Tom3: 矩形 = this._矢印の矩形リスト["Right"]; break; } var 左上位置dpx = new Vector2(中央位置dpx.X - 矩形.Width * 拡大率 / 2f, 中央位置dpx.Y - 矩形.Height * 拡大率 / 2f); var 換行列 = Matrix3x2.Scaling(拡大率) * Matrix3x2.Translation(左上位置dpx); this._矢印画像.描画する(dc, 換行列, 転送元矩形: 矩形); }
public void 描画する(DeviceContext1 dc) { var 選択曲 = App.曲ツリー.フォーカス曲ノード; Debug.Assert(null != 選択曲); var preimage = 選択曲.ノード画像 ?? Node.既定のノード画像; Debug.Assert(null != preimage); // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。 var 換行列 = Matrix.Scaling( this._プレビュー画像表示サイズdpx.X / preimage.サイズ.Width, this._プレビュー画像表示サイズdpx.Y / preimage.サイズ.Height, 0f) * Matrix.Translation( グラフィックデバイス.Instance.画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f, グラフィックデバイス.Instance.画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f, 0f); preimage.描画する(換行列); }
public void 描画する(DeviceContext1 dc, float 達成率) { var 描画領域 = new RectangleF(220f, 650f, 165f, 80f); 達成率 = Math.Max(Math.Min(達成率, 99.99f), 0f); // 0~99.99にクリッピング string 達成率文字列 = (達成率.ToString("0.00") + '%').PadLeft(6).Replace(' ', 'o'); // 右詰め、余白は'o'。例:"99.00%", "o8.12%", "o0.00%" グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { var pretrans = dc.Transform; // 達成率ロゴを描画する dc.Transform = Matrix3x2.Scaling(0.4f, 0.5f) * Matrix3x2.Translation(描画領域.X - 30f, 描画領域.Y - 60f) * pretrans; this._達成率ロゴ画像.描画する(dc, 0f, 0f); // 小数部を描画する('%'含む) dc.Transform = Matrix3x2.Scaling(0.5f, 0.8f) * Matrix3x2.Translation(描画領域.X + 65f, 描画領域.Y + (描画領域.Height * 0.2f)) * pretrans; this._数字画像.描画する(dc, 0f, 0f, 達成率文字列.Substring(3)); // 整数部を描画する('.'含む) dc.Transform = Matrix3x2.Scaling(0.5f, 1.0f) * Matrix3x2.Translation(描画領域.X, 描画領域.Y) * pretrans; this._数字画像.描画する(dc, 0f, 0f, 達成率文字列.Substring(0, 3)); }); }
private void _その他パネルを描画する(DeviceContext1 dc) { グラフィックデバイス.Instance.D2DBatchDraw(dc, () => { using (var ソートタブ上色 = new SolidColorBrush(dc, new Color4(0xFF121212))) using (var ソートタブ下色 = new SolidColorBrush(dc, new Color4(0xFF1f1f1f))) { // 曲リストソートタブ dc.FillRectangle(new RectangleF(927f, 50f, 993f, 138f), ソートタブ上色); dc.FillRectangle(new RectangleF(927f, 142f, 993f, 46f), ソートタブ下色); } // インフォメーションバー dc.FillRectangle(new RectangleF(0f, 0f, 1920f, 50f), this._黒); dc.DrawLine(new Vector2(0f, 50f), new Vector2(1920f, 50f), this._白, strokeWidth: 1f); // ボトムバー dc.FillRectangle(new RectangleF(0f, 1080f - 43f, 1920f, 1080f), this._黒); // プレビュー領域 dc.FillRectangle(new RectangleF(0f, 52f, 927f, 476f), this._黒透過); dc.DrawRectangle(new RectangleF(0f, 52f, 927f, 476f), this._灰透過, strokeWidth: 1f); dc.DrawLine(new Vector2(1f, 442f), new Vector2(925f, 442f), this._灰透過, strokeWidth: 1f); }); }
/// <summary> /// ステージの通常速度での進行と描画を行う。 /// </summary> public virtual void 進行描画する(DeviceContext1 dc) { }
public override void 進行描画する(DeviceContext1 dc) { App.入力管理.すべての入力デバイスをポーリングする(); switch (this.現在のフェーズ) { case フェーズ.表示: #region " タイトル画面を表示し、入力の判定を行う。" //---------------- { // 進行描画 this._舞台画像.進行描画する(dc); this._タイトルロゴ.描画する( dc, (グラフィックデバイス.Instance.設計画面サイズ.Width - this._タイトルロゴ.サイズ.Width) / 2f, (グラフィックデバイス.Instance.設計画面サイズ.Height - this._タイトルロゴ.サイズ.Height) / 2f - 100f); this._帯メッセージを描画する(dc); // 入力 if (App.入力管理.確定キーが入力された()) { Log.Info($"確定キーが入力されました。フェードアウトを開始します。"); App.システムサウンド.再生する(設定.システムサウンド種別.タイトルステージ_確定音); App.ステージ管理.アイキャッチを選択しクローズする(nameof(シャッター)); this.現在のフェーズ = フェーズ.フェードアウト; } else if (App.入力管理.キャンセルキーが入力された()) { Log.Info($"キャンセルキーが入力されました。"); this.現在のフェーズ = フェーズ.キャンセル; } } //---------------- #endregion break; case フェーズ.フェードアウト: #region " アイキャッチを使って、タイトル画面をフェードアウトする。" //---------------- { // 画面描画 this._舞台画像.進行描画する(dc); this._タイトルロゴ.描画する( dc, (グラフィックデバイス.Instance.設計画面サイズ.Width - this._タイトルロゴ.サイズ.Width) / 2f, (グラフィックデバイス.Instance.設計画面サイズ.Height - this._タイトルロゴ.サイズ.Height) / 2f - 100f); this._帯メッセージを描画する(dc); // アイキャッチ描画 App.ステージ管理.現在のアイキャッチ.進行描画する(dc); if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.クローズ完了) { this.現在のフェーズ = フェーズ.確定; Log.Info($"フェードアウトが完了しました。"); } } //---------------- #endregion break; case フェーズ.確定: case フェーズ.キャンセル: break; } }