Visual C# 7.0, Windows10 Desktop App
Revision | 855a7b393aff84f10156db844358f85b5d5ade95 (tree) |
---|---|
Time | 2017-06-11 19:42:00 |
Author | くまかみ工房 <kumakamikoubou@gmai...> |
Commiter | くまかみ工房 |
演奏画面での、AutoPlayチップのヒット処理と発声処理を分離。
@@ -214,15 +214,16 @@ namespace SST.ステージ.演奏 | ||
214 | 214 | |
215 | 215 | #region " 自動ヒット処理。" |
216 | 216 | //---------------- |
217 | - this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離 ) => { | |
217 | + this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離 ) => { | |
218 | 218 | |
219 | 219 | var オプション設定 = App.ユーザ管理.選択されているユーザ.オプション設定; |
220 | 220 | var 対応表 = オプション設定.ドラムとチップと入力の対応表[ chip.チップ種別 ]; |
221 | 221 | var AutoPlay = オプション設定.AutoPlay[ 対応表.AutoPlay種別 ]; |
222 | 222 | |
223 | 223 | bool チップはヒット済みである = chip.ヒット済みである; |
224 | - bool チップはMISSエリアに達している = ( ヒット判定バーとの時間sec > オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ); | |
225 | - bool チップはヒット判定バーを通過した = ( 0 <= ヒット判定バーとの距離 ); | |
224 | + bool チップはMISSエリアに達している = ( ヒット判定バーと描画との時間sec > オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ); | |
225 | + bool チップは描画についてヒット判定バーを通過した = ( 0 <= ヒット判定バーと描画との時間sec ); | |
226 | + bool チップは発声についてヒット判定バーを通過した = ( 0 <= ヒット判定バーと発声との時間sec ); | |
226 | 227 | |
227 | 228 | if( チップはヒット済みである ) |
228 | 229 | { |
@@ -249,7 +250,17 @@ namespace SST.ステージ.演奏 | ||
249 | 250 | } |
250 | 251 | } |
251 | 252 | |
252 | - if( チップはヒット判定バーを通過した ) | |
253 | + if( チップは発声についてヒット判定バーを通過した ) | |
254 | + { | |
255 | + // 自動ヒット判定。 | |
256 | + if( ( AutoPlay && 対応表.AutoPlayON.自動ヒット && 対応表.AutoPlayON.自動ヒット時処理.再生 ) || | |
257 | + ( AutoPlay && 対応表.AutoPlayON.自動ヒット && 対応表.AutoPlayON.自動ヒット時処理.再生 ) ) | |
258 | + { | |
259 | + this._チップの発声を行う( chip ); | |
260 | + } | |
261 | + } | |
262 | + | |
263 | + if( チップは描画についてヒット判定バーを通過した ) | |
253 | 264 | { |
254 | 265 | // 自動ヒット判定。 |
255 | 266 | if( AutoPlay && 対応表.AutoPlayON.自動ヒット ) |
@@ -299,7 +310,7 @@ namespace SST.ステージ.演奏 | ||
299 | 310 | |
300 | 311 | var 処理済み入力 = new List<ドラム入力イベント>(); // ヒット処理が終わった入力は、二重処理しないよう、この中に追加しておく。 |
301 | 312 | |
302 | - this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離 ) => { | |
313 | + this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離 ) => { | |
303 | 314 | |
304 | 315 | #region " ヒット判定 " |
305 | 316 | //---------------- |
@@ -314,10 +325,10 @@ namespace SST.ステージ.演奏 | ||
314 | 325 | if( !( チップの対応表.AutoPlayOFF.ユーザヒット ) ) |
315 | 326 | return; // このチップは、AutoPlay OFF 時でもユーザヒットの対象ではない。 |
316 | 327 | |
317 | - double ヒット判定バーとの時間の絶対値sec = Math.Abs( ヒット判定バーとの時間sec ); | |
328 | + double ヒット判定バーとの時間の絶対値sec = Math.Abs( ヒット判定バーと描画との時間sec ); | |
318 | 329 | |
319 | - bool チップはMISSエリアに達している = ( ヒット判定バーとの時間sec > オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ); | |
320 | - if( !( ヒット判定バーとの時間sec >= -( オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ) && !チップはMISSエリアに達している ) ) | |
330 | + bool チップはMISSエリアに達している = ( ヒット判定バーと描画との時間sec > オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ); | |
331 | + if( !( ヒット判定バーと描画との時間sec >= -( オプション設定.最大ヒット距離sec[ ヒットランク種別.POOR ] ) && !チップはMISSエリアに達している ) ) | |
321 | 332 | return; // チップはヒット可能エリアにある。 |
322 | 333 | |
323 | 334 | var ヒット入力 = App.入力管理.ポーリング結果.FirstOrDefault( ( 入力 ) => { |
@@ -775,7 +786,7 @@ namespace SST.ステージ.演奏 | ||
775 | 786 | double 再生開始時刻sec = ( 時刻sec - 背景動画チップ.発声時刻sec ); |
776 | 787 | this._背景動画?.再生を開始する( 再生開始時刻sec ); |
777 | 788 | this._背景動画開始済み = true; |
778 | - this._BGM?.Play( 再生開始時刻sec ); | |
789 | + this._BGM?.Play( 再生開始時刻sec - App.サウンドデバイス.遅延sec ); | |
779 | 790 | this._BGM再生開始済み = true; |
780 | 791 | Log.Info( $"背景動画の再生を開始しました。(再生開始時刻: {再生開始時刻sec} sec)" ); |
781 | 792 | } |
@@ -800,7 +811,7 @@ namespace SST.ステージ.演奏 | ||
800 | 811 | |
801 | 812 | this._チップ画像.加算合成 = false; |
802 | 813 | |
803 | - this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離 ) => { | |
814 | + this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離 ) => { | |
804 | 815 | |
805 | 816 | if( chip.チップ種別 == チップ種別.小節線 ) |
806 | 817 | { |
@@ -841,7 +852,7 @@ namespace SST.ステージ.演奏 | ||
841 | 852 | |
842 | 853 | this._チップ画像.加算合成 = false; |
843 | 854 | |
844 | - this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーとの時間sec, ヒット判定バーとの距離 ) => { | |
855 | + this._描画範囲のチップに処理を適用する( 現在の演奏時刻sec, ( chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離 ) => { | |
845 | 856 | |
846 | 857 | float 縦中央位置 = (float)( ヒット判定バーの中央Y座標 + ヒット判定バーとの距離 ); |
847 | 858 |
@@ -1039,7 +1050,7 @@ namespace SST.ステージ.演奏 | ||
1039 | 1050 | /// <see cref="_描画開始チップ番号"/> から画面上端にはみ出すまでの間の各チップに対して、指定された処理を適用する。 |
1040 | 1051 | /// </summary> |
1041 | 1052 | /// <param name="適用する処理">引数は、順に、対象のチップ、チップ番号、ヒット判定バーとの時間sec、ヒット判定バーとの距離</param> |
1042 | - private void _描画範囲のチップに処理を適用する( double 現在の演奏時刻sec, Action<チップ, int, double, double> 適用する処理 ) | |
1053 | + private void _描画範囲のチップに処理を適用する( double 現在の演奏時刻sec, Action<チップ, int, double, double, double> 適用する処理 ) | |
1043 | 1054 | { |
1044 | 1055 | var スコア = App.演奏スコア; |
1045 | 1056 | if( null == スコア ) |
@@ -1050,8 +1061,9 @@ namespace SST.ステージ.演奏 | ||
1050 | 1061 | var チップ = スコア.チップリスト[ i ]; |
1051 | 1062 | |
1052 | 1063 | // ヒット判定バーとチップの間の、時間 と 距離 を算出。→ いずれも、負数ならバー未達、0でバー直上、正数でバー通過。 |
1053 | - double ヒット判定バーとの時間sec = 現在の演奏時刻sec - チップ.描画時刻sec; | |
1054 | - double ヒット判定バーとの距離 = スコア.指定された時間secに対応する符号付きピクセル数を返す( this._現在進行描画中の譜面スクロール速度の倍率, ヒット判定バーとの時間sec ); | |
1064 | + double ヒット判定バーと描画との時間sec = 現在の演奏時刻sec - チップ.描画時刻sec; | |
1065 | + double ヒット判定バーと発声との時間sec = 現在の演奏時刻sec - チップ.発声時刻sec; | |
1066 | + double ヒット判定バーとの距離 = スコア.指定された時間secに対応する符号付きピクセル数を返す( this._現在進行描画中の譜面スクロール速度の倍率, ヒット判定バーと描画との時間sec ); | |
1055 | 1067 | |
1056 | 1068 | // 終了判定。 |
1057 | 1069 | bool チップは画面上端より上に出ている = ( ( ヒット判定バーの中央Y座標 + ヒット判定バーとの距離 ) < -40.0 ); // -40 はチップが隠れるであろう適当なマージン。 |
@@ -1059,7 +1071,7 @@ namespace SST.ステージ.演奏 | ||
1059 | 1071 | break; |
1060 | 1072 | |
1061 | 1073 | // 処理実行。開始判定(描画開始チップ番号の更新)もこの中で。 |
1062 | - 適用する処理( チップ, i, ヒット判定バーとの時間sec, ヒット判定バーとの距離 ); | |
1074 | + 適用する処理( チップ, i, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離 ); | |
1063 | 1075 | } |
1064 | 1076 | } |
1065 | 1077 |
@@ -1069,27 +1081,10 @@ namespace SST.ステージ.演奏 | ||
1069 | 1081 | |
1070 | 1082 | if( ヒット処理表.再生 ) |
1071 | 1083 | { |
1072 | - #region " チップを再生する。" | |
1084 | + #region " チップの発声を行う。" | |
1073 | 1085 | //---------------- |
1074 | - if( chip.チップ種別 == チップ種別.背景動画 ) | |
1075 | - { | |
1076 | - App.サウンドタイマ.一時停止する(); | |
1077 | - | |
1078 | - // 背景動画の再生を開始する。 | |
1079 | - this._背景動画?.再生を開始する(); | |
1080 | - this._背景動画開始済み = true; | |
1081 | - | |
1082 | - // BGMの再生を開始する。 | |
1083 | - this._BGM?.Play(); | |
1084 | - this._BGM再生開始済み = true; | |
1085 | - | |
1086 | - App.サウンドタイマ.再開する(); | |
1087 | - } | |
1088 | - else | |
1089 | - { | |
1090 | - if( App.システム設定.Autoチップのドラム音を再生する ) | |
1091 | - this._ドラムサウンド.発声する( chip.チップ種別, ( chip.音量 / (float) チップ.最大音量 ) ); | |
1092 | - } | |
1086 | + if( chip.発声されていない ) | |
1087 | + this._チップの発声を行う( chip ); | |
1093 | 1088 | //---------------- |
1094 | 1089 | #endregion |
1095 | 1090 | } |
@@ -1144,5 +1139,33 @@ namespace SST.ステージ.演奏 | ||
1144 | 1139 | #endregion |
1145 | 1140 | } |
1146 | 1141 | } |
1142 | + | |
1143 | + private void _チップの発声を行う( チップ chip ) | |
1144 | + { | |
1145 | + if( chip.発声済みである ) | |
1146 | + return; | |
1147 | + | |
1148 | + chip.発声済みである = true; | |
1149 | + | |
1150 | + if( chip.チップ種別 == チップ種別.背景動画 ) | |
1151 | + { | |
1152 | + App.サウンドタイマ.一時停止する(); | |
1153 | + | |
1154 | + // 背景動画の再生を開始する。 | |
1155 | + this._背景動画?.再生を開始する(); | |
1156 | + this._背景動画開始済み = true; | |
1157 | + | |
1158 | + // BGMの再生を開始する。 | |
1159 | + this._BGM?.Play(); | |
1160 | + this._BGM再生開始済み = true; | |
1161 | + | |
1162 | + App.サウンドタイマ.再開する(); | |
1163 | + } | |
1164 | + else | |
1165 | + { | |
1166 | + if( App.システム設定.Autoチップのドラム音を再生する ) | |
1167 | + this._ドラムサウンド.発声する( chip.チップ種別, ( chip.音量 / (float) チップ.最大音量 ) ); | |
1168 | + } | |
1169 | + } | |
1147 | 1170 | } |
1148 | 1171 | } |