X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
修订版 | 309 (tree) |
---|---|
时间 | 2022-05-01 00:19:09 |
作者 | xops-mikan |
iniファイルによりゲーム全体の音量を設定できるように。
@@ -51,6 +51,7 @@ | ||
51 | 51 | ShowArmFlag = false; |
52 | 52 | ScreenWidth = 0; |
53 | 53 | ScreenHeight = 0; |
54 | + mastervolume = 0.0f; | |
54 | 55 | } |
55 | 56 | |
56 | 57 | //! @brief ディストラクタ |
@@ -545,6 +546,11 @@ | ||
545 | 546 | default: ScreenWidth = DEFAULT_SCREEN_WIDTH; ScreenHeight = DEFAULT_SCREEN_HEIGHT; break; |
546 | 547 | } |
547 | 548 | |
549 | + //音量取得 | |
550 | + mastervolume = INIConfig.GetINIFileFloat("Sounds", "MasterVolume", 1.0f, NULL); | |
551 | + if( mastervolume < 0.0f ){ mastervolume = 0.0f; } | |
552 | + if( mastervolume > 1.0f ){ mastervolume = 1.0f; } | |
553 | + | |
548 | 554 | INIConfig.ReleaseINIFile(); |
549 | 555 | |
550 | 556 | #ifdef ENABLE_DEBUGLOG |
@@ -556,6 +562,7 @@ | ||
556 | 562 | ShowArmFlag = false; |
557 | 563 | ScreenWidth = DEFAULT_SCREEN_WIDTH; |
558 | 564 | ScreenHeight = DEFAULT_SCREEN_HEIGHT; |
565 | + mastervolume = 1.0f; | |
559 | 566 | #endif |
560 | 567 | return 0; |
561 | 568 | } |
@@ -567,6 +574,7 @@ | ||
567 | 574 | ShowArmFlag = false; |
568 | 575 | ScreenWidth = DEFAULT_SCREEN_WIDTH; |
569 | 576 | ScreenHeight = DEFAULT_SCREEN_HEIGHT; |
577 | + mastervolume = 1.0f; | |
570 | 578 | } |
571 | 579 | |
572 | 580 | //! @brief 腕表示フラグを取得 |
@@ -589,3 +597,10 @@ | ||
589 | 597 | { |
590 | 598 | return ScreenHeight; |
591 | 599 | } |
600 | + | |
601 | +//! @brief 音量設定を取得 | |
602 | +//! @return 値 | |
603 | +float Config::GetVolume() | |
604 | +{ | |
605 | + return mastervolume; | |
606 | +} |
@@ -81,6 +81,7 @@ | ||
81 | 81 | bool ShowArmFlag; //!< 腕表示フラグ |
82 | 82 | int ScreenWidth; //!< 画面解像度(幅) |
83 | 83 | int ScreenHeight; //!< 画面解像度(高さ) |
84 | + float mastervolume; //!< 音量 | |
84 | 85 | |
85 | 86 | public: |
86 | 87 | Config(); |
@@ -115,6 +116,7 @@ | ||
115 | 116 | bool GetShowArmFlag(); |
116 | 117 | int GetScreenWidth(); |
117 | 118 | int GetScreenHeight(); |
119 | + float GetVolume(); | |
118 | 120 | }; |
119 | 121 | |
120 | 122 | #endif |
\ No newline at end of file |
@@ -105,7 +105,11 @@ | ||
105 | 105 | volume = 0.0f; |
106 | 106 | } |
107 | 107 | else{ |
108 | +#ifdef ENABLE_ADDCONFIG | |
109 | + volume = GameConfig.GetVolume(); | |
110 | +#else | |
108 | 111 | volume = 1.0f; |
112 | +#endif | |
109 | 113 | } |
110 | 114 | GameSound.SetClass(&SoundCtrl, &Resource, &GameParamInfo); |
111 | 115 | SoundCtrl.SetVolume(volume); |
@@ -44,6 +44,7 @@ | ||
44 | 44 | } |
45 | 45 | p3DListener = NULL; |
46 | 46 | mastervolume = 1.0f; |
47 | + volume_dBper = 1.0f; | |
47 | 48 | } |
48 | 49 | |
49 | 50 | //! @brief ディストラクタ |
@@ -125,10 +126,18 @@ | ||
125 | 126 | } |
126 | 127 | |
127 | 128 | //! @brief 再生音量を設定 |
128 | -//! @param volume 再生音量 (0.0=無音 1.0=100%) | |
129 | +//! @param volume 再生音量 (0.0=無音 1.0=100%) | |
130 | +//! @attention 0.01(1%)未満は 0.00(0%)として処理されます。 | |
129 | 131 | void SoundControl::SetVolume(float volume) |
130 | 132 | { |
131 | 133 | mastervolume = volume; |
134 | + if( mastervolume < 0.01f ){ mastervolume = 0.0f; } | |
135 | + if( mastervolume > 1.00f ){ mastervolume = 1.0f; } | |
136 | + | |
137 | + //dBを考慮して最大音量を決定 | |
138 | + if( mastervolume == 0.0f ){ volume_dBper = 0.0f; return; } | |
139 | + if( mastervolume == 1.0f ){ volume_dBper = 1.0f; return; } | |
140 | + volume_dBper = 1.0f - log10f(mastervolume)*-0.2f; | |
132 | 141 | } |
133 | 142 | |
134 | 143 | //! @brief カメラの座標と角度を設定 |
@@ -565,7 +574,7 @@ | ||
565 | 574 | if( volume >= 100 ){ return DSBVOLUME_MAX; } |
566 | 575 | |
567 | 576 | //float volume2 = 1.0f/200 * (volume + 100); |
568 | - float volume2 = 1.0f/200 * (volume + 100) * mastervolume; | |
577 | + float volume2 = (1.0f/200 * (volume + 100)) * volume_dBper; | |
569 | 578 | int retn = (int)((DSBVOLUME_MIN-DSBVOLUME_MAX) * (1.0f - volume2)); |
570 | 579 | return retn; |
571 | 580 | } |
@@ -54,6 +54,7 @@ | ||
54 | 54 | camera_z = 0.0f; |
55 | 55 | camera_rx = 0.0f; |
56 | 56 | mastervolume = 1.0f; |
57 | + volume_max = 100; | |
57 | 58 | } |
58 | 59 | |
59 | 60 | //! @brief ディストラクタ |
@@ -140,10 +141,18 @@ | ||
140 | 141 | } |
141 | 142 | |
142 | 143 | //! @brief 再生音量を設定 |
143 | -//! @param volume 再生音量 (0.0=無音 1.0=100%) | |
144 | +//! @param volume 再生音量 (0.0=無音 1.0=100%) | |
145 | +//! @attention 0.01(1%)未満は 0.00(0%)として処理されます。 | |
144 | 146 | void SoundControl::SetVolume(float volume) |
145 | 147 | { |
146 | 148 | mastervolume = volume; |
149 | + if( mastervolume < 0.01f ){ mastervolume = 0.0f; } | |
150 | + if( mastervolume > 1.00f ){ mastervolume = 1.0f; } | |
151 | + | |
152 | + //dBを考慮して最大音量を決定 | |
153 | + if( mastervolume == 0.0f ){ volume_max = -100; return; } | |
154 | + if( mastervolume == 1.0f ){ volume_max = 100; return; } | |
155 | + volume_max = 100 - (int)(log10f(mastervolume)*-0.2f*200); | |
147 | 156 | } |
148 | 157 | |
149 | 158 | //! @brief カメラの座標と角度を設定 |
@@ -224,7 +233,8 @@ | ||
224 | 233 | //サウンドを再生 |
225 | 234 | if( DSplay == NULL ){ return 0; } |
226 | 235 | //return DSplay(id, volume, pan); |
227 | - return DSplay(id, (int)(mastervolume * (volume + 100)) - 100, pan); | |
236 | + int volume2 = 1.0f/200 * (volume + 100) * (volume_max + 100) - 100; | |
237 | + return DSplay(id, volume2, pan); | |
228 | 238 | } |
229 | 239 | |
230 | 240 | //! @brief サウンドを再生(3D再生) |
@@ -87,7 +87,8 @@ | ||
87 | 87 | float camera_y; //!< カメラ座標 |
88 | 88 | float camera_z; //!< カメラ座標 |
89 | 89 | float camera_rx; //!< カメラX軸角度 |
90 | - float mastervolume; //!< 音量 | |
90 | + float mastervolume; //!< 音量(パーセント) | |
91 | + int volume_max; //!< 最大音量 | |
91 | 92 | |
92 | 93 | |
93 | 94 | bool CheckSourceDist(float x, float y, float z, bool near, float *out_dist); |
@@ -96,7 +97,8 @@ | ||
96 | 97 | LPDIRECTSOUND8 pDSound; //!< DIRECTSOUND8のポインタ |
97 | 98 | LPDIRECTSOUNDBUFFER pDSBuffer[MAX_LOADSOUND][MAX_SOUNDLISTS]; //!< セカンダリーバッファー |
98 | 99 | LPDIRECTSOUND3DLISTENER8 p3DListener; //!< リスナー |
99 | - float mastervolume; //!< 音量 | |
100 | + float mastervolume; //!< 音量(パーセント) | |
101 | + float volume_dBper; //!< 最大音量 | |
100 | 102 | |
101 | 103 | bool CheckSoundFile(const char* filename, int *filesize, int *fileoffset, WAVEFORMATEX** pwfex); |
102 | 104 | int GetDSVolume(int volume); |