Violet Vreath is Shooter Game for Windows XP+(個人制作シューティングゲーム)
Revisão | 0c4c49bf1b50cdb83f8552fdf0f61dc85da81f04 (tree) |
---|---|
Hora | 2023-08-25 00:51:00 |
Autor | gecchi <gecchi@boch...> |
Commiter | gecchi |
Configちょっと修正
@@ -19,23 +19,6 @@ | ||
19 | 19 | /** ミリ秒 → フレーム数 変換 */ |
20 | 20 | #define MSEC_F(X) ( (frame)(((X) * 0.001) * (CONFIG::FPS)) ) |
21 | 21 | |
22 | - | |
23 | -/** 共通遅延解放フレーム数(≒エフェクト最大再生時間) */ | |
24 | -#define GGAF_END_DELAY (SEC_F(90)) | |
25 | -//GGAF_END_DELAYは全Element共通の解放遅延フレーム数で、 | |
26 | -//アクター消失後、直ぐに不正ポインタになるのではなく、しばらく参照が可能とするための仕組み。 | |
27 | -//少し長めに設定しないと、いろいろ不都合が多い。 | |
28 | -//例えば、消滅後の爆発SE等で、3D効果のためSE発声元座標情報がしばらく必要とか、 | |
29 | -//消滅後の消滅アクター配下に属する発射弾(子アクター)が、親アクターの座標を参照しているなど、 | |
30 | -//消滅しても、しばらくは残存させなければいけない場合が多々ある。 | |
31 | -//GGAF_END_DELAYには、基本的に、画面から消滅確定→完全にdeleteまでのフレームの最大フレームを指定する。 | |
32 | -//現在は90秒。 | |
33 | -//もし、GGAF_END_DELAYを短めに設定すると、 | |
34 | -//消滅後の子の発射弾については、残された発射弾が突然消えるので少し不自然。という程度で問題はない。 | |
35 | -//しかし、SEの3D効果は、エラーになるため、SE再生時間の最大フレーム数を設定しなければいけない。 | |
36 | -//例えば効果音が90秒以上かかるようなWAVEが一つでもあるならば、90秒以上を設定しなければならない。 | |
37 | - | |
38 | - | |
39 | 22 | namespace GgafCore { |
40 | 23 | |
41 | 24 | /** |
@@ -52,9 +35,10 @@ public: | ||
52 | 35 | static frame FPS; |
53 | 36 | /** [r] 1フレームの秒数 */ |
54 | 37 | static double FRAME_SEC; |
55 | - | |
38 | + /** [r/w] 共通遅延解放フレーム数。*/ | |
39 | + static frame END_DELAY_FRAME; | |
56 | 40 | /** [r/w] 最高フレームスキップ数。つまりどんなに重くも最低描画するフレーム間隔。*/ |
57 | - static uint32_t MAX_SKIP_FRAME; | |
41 | + static frame MAX_SKIP_FRAME; | |
58 | 42 | /** [r/w] 処理落ち演出を行うかどうかの第一段階の境界。1フレームあたりのアクティブなアクター数設定 */ |
59 | 43 | static uint32_t OBJNUM_TO_SLOWDOWN1; |
60 | 44 | /** [r/w] 処理落ち演出を行うかどうかの第二段階の境界。1フレームあたりのアクティブなアクター数設定 */ |
@@ -110,4 +94,19 @@ public: | ||
110 | 94 | |
111 | 95 | } |
112 | 96 | #endif /*GGAF_CORE_CONFIG_H_*/ |
97 | +//END_DELAY_FRAME について | |
98 | +//共通遅延解放フレーム数(≒エフェクト最大再生時間) | |
99 | +//END_DELAY_FRAMEは全Element共通の解放遅延フレーム数で、 | |
100 | +//アクター消失後、直ぐに不正ポインタになるのではなく、しばらく参照が可能とするための仕組み。 | |
101 | +//少し長めに設定しないと、いろいろ不都合が多い。 | |
102 | +//例えば、消滅後の爆発SE等で、3D効果のためSE発声元座標情報がしばらく必要とか、 | |
103 | +//消滅後の消滅アクター配下に属する発射弾(子アクター)が、親アクターの座標を参照しているなど、 | |
104 | +//消滅しても、しばらくは残存させなければいけない場合が多々ある。 | |
105 | +//CONFIG::END_DELAY_FRAMEには、基本的に、画面から消滅確定→完全にdeleteまでの最小時間を指定する。 | |
106 | +//現在は90秒分のフレーム。 | |
107 | +//もし、CONFIG::END_DELAY_FRAMEを短めに設定すると、 | |
108 | +//消滅後の子の発射弾については、残された発射弾が突然消えるので少し不自然。という程度で問題はない。 | |
109 | +//しかし、SEの3D効果は、エラーになるため、SE再生時間の最大フレーム数を設定しなければいけない。 | |
110 | +//例えば効果音が90秒以上かかるようなWAVEが一つでもあるならば、90秒以上を設定しなければならない。 | |
111 | + | |
113 | 112 |
@@ -631,7 +631,7 @@ public: | ||
631 | 631 | * end(frame) 実行後、ゴミ箱(GarbageBox) に取り込まれる直前に呼び出される。<BR> |
632 | 632 | * つまり、_can_live_flg が false から true になった時に呼び出される。<BR> |
633 | 633 | * ですが、まだツリーに所属していおり、自身のノードの鎖はまだ切れていない状態です。<BR> |
634 | - * 最速で、end(frame) で指定したフレーム + GGAF_END_DELAY 後に発生する。<BR> | |
634 | + * 最速で、end(frame) で指定したフレーム +END_DELAY_FRAME 後に発生する。<BR> | |
635 | 635 | * 処理がもたつくと、それ以上の先のフレームで発生する。<BR> |
636 | 636 | * 直前に処理が必要な場合は、オーバーライドして実装可能。<BR> |
637 | 637 | */ |
@@ -1332,13 +1332,13 @@ void Element<T>::inactivateTreeImmed() { | ||
1332 | 1332 | template<class T> |
1333 | 1333 | void Element<T>::end(frame prm_offset_frames) { |
1334 | 1334 | if (_frame_of_life < _frame_of_life_when_end && |
1335 | - _frame_of_life_when_end < _frame_of_life + prm_offset_frames + GGAF_END_DELAY) { | |
1335 | + _frame_of_life_when_end < _frame_of_life + prm_offset_frames + GgafCore::Config::END_DELAY_FRAME) { | |
1336 | 1336 | //既にend()実行済みであり、さらに今回指定のよりも早く _frame_of_life_when_end に到達するため無視する。 |
1337 | 1337 | return; |
1338 | 1338 | } |
1339 | - _frame_of_life_when_end = _frame_of_life + prm_offset_frames + GGAF_END_DELAY; | |
1339 | + _frame_of_life_when_end = _frame_of_life + prm_offset_frames + GgafCore::Config::END_DELAY_FRAME; | |
1340 | 1340 | inactivateDelay(prm_offset_frames); |
1341 | - //指定フレーム時には、まずinactivateが行われ、+GGAF_END_DELAY フレーム後 _can_live_flg = falseになる。 | |
1341 | + //指定フレーム時には、まずinactivateが行われ、+END_DELAY_FRAME フレーム後 _can_live_flg = falseになる。 | |
1342 | 1342 | //onEnd()は _can_live_flg = false 時発生 |
1343 | 1343 | T* pElementTemp = Node<T>::_pChildFirst; |
1344 | 1344 | while (pElementTemp) { |
@@ -11,7 +11,8 @@ std::string Config::_load_properties_filename = ""; | ||
11 | 11 | Properties Config::_properties; |
12 | 12 | frame Config::FPS = 60; |
13 | 13 | double Config::FRAME_SEC = 1.0 / Config::FPS; |
14 | -uint32_t Config::MAX_SKIP_FRAME = 20; | |
14 | +frame Config::END_DELAY_FRAME = 5400; | |
15 | +frame Config::MAX_SKIP_FRAME = 20; | |
15 | 16 | uint32_t Config::OBJNUM_TO_SLOWDOWN1 = 99999; |
16 | 17 | uint32_t Config::OBJNUM_TO_SLOWDOWN2 = 99999; |
17 | 18 | double Config::RATE_OF_SLOWDOWN1 = 1.0; |
@@ -49,7 +50,9 @@ void Config::loadProperties(std::string prm_properties_filename) { | ||
49 | 50 | Config::FPS = _properties.getUInt("FPS"); |
50 | 51 | } |
51 | 52 | Config::FRAME_SEC = 1.0 / CONFIG::FPS; |
52 | - | |
53 | + if (_properties.isExistKey("END_DELAY_FRAME")) { | |
54 | + Config::END_DELAY_FRAME = _properties.getUInt("END_DELAY_FRAME"); | |
55 | + } | |
53 | 56 | if (_properties.isExistKey("MAX_SKIP_FRAME")) { |
54 | 57 | Config::MAX_SKIP_FRAME = _properties.getUInt("MAX_SKIP_FRAME"); |
55 | 58 | } |
@@ -116,6 +119,7 @@ void Config::loadProperties(std::string prm_properties_filename) { | ||
116 | 119 | } |
117 | 120 | Config::_is_lock = false; |
118 | 121 | _TRACE_("Config::FPS="<<Config::FPS); |
122 | + _TRACE_("Config::END_DELAY_FRAME="<<Config::END_DELAY_FRAME); | |
119 | 123 | _TRACE_("Config::MAX_SKIP_FRAME="<<Config::MAX_SKIP_FRAME); |
120 | 124 | _TRACE_("Config::OBJNUM_TO_SLOWDOWN1="<<Config::OBJNUM_TO_SLOWDOWN1); |
121 | 125 | _TRACE_("Config::OBJNUM_TO_SLOWDOWN2="<<Config::OBJNUM_TO_SLOWDOWN2); |
@@ -61,11 +61,11 @@ void ActorDepository::end(frame prm_offset_frames) { | ||
61 | 61 | frame end_frame_delay = prm_offset_frames + (_child_num*2) + 1; //メンバーを順に少し遅らせる。 |
62 | 62 | //既にend()実行済みの場合、より早くend()するならば有効とする |
63 | 63 | if (_frame_of_life < _frame_of_life_when_end && |
64 | - _frame_of_life_when_end < _frame_of_life + end_frame_delay + GGAF_END_DELAY) { | |
64 | + _frame_of_life_when_end < _frame_of_life + end_frame_delay + GgafCore::Config::END_DELAY_FRAME) { | |
65 | 65 | //既にend()実行済みであり、さらに今回指定のよりも早く _frame_of_life_when_end に到達するため無視する。 |
66 | 66 | return; |
67 | 67 | } |
68 | - _frame_of_life_when_end = _frame_of_life + end_frame_delay + GGAF_END_DELAY; | |
68 | + _frame_of_life_when_end = _frame_of_life + end_frame_delay + GgafCore::Config::END_DELAY_FRAME; | |
69 | 69 | inactivateDelay(prm_offset_frames); //指定フレームにはinactivateが行われるのは同じ |
70 | 70 | |
71 | 71 | Actor* pElementTemp = _pChildFirst; |
@@ -84,7 +84,7 @@ public: | ||
84 | 84 | /** [r/w] SE最大同時発声数(1〜64) */ |
85 | 85 | static int MAX_SE_AT_ONCE; |
86 | 86 | /** [r/w] ゲーム空間でカメラからの最遠距離(zf)のに位置したアクターのSE発声遅延ミリ秒数 */ |
87 | - static int FRAME_OF_SE_DELAY_MAX_DEPTH; | |
87 | + static uint32_t MILLISEC_OF_SE_DELAY_MAX_DEPTH; | |
88 | 88 | /** [r/w] ゲーム空間でカメラからの最遠距離(zf)のに位置したアクターのSE発声ボリュームの減衰割合 */ |
89 | 89 | static double SE_VOLUME_RATE_MAX_DEPTH; |
90 | 90 |
@@ -45,7 +45,7 @@ public: | ||
45 | 45 | |
46 | 46 | /** |
47 | 47 | * SEの設定を行う . |
48 | - * SEの再生時間は GGAF_END_DELAY+(最大距離遅延) フレーム以内でなければいけない。 | |
48 | + * SEの再生時間は CONFIG::END_DELAY_FRAME+(最大距離遅延) フレーム以内でなければいけない。 | |
49 | 49 | * チャンネル数は、引数の prm_se_key+"_CH" というプロパティ値が参照される。 |
50 | 50 | * 存在しない場合、再生チャンネル番号は0固定(∴チャンネル数は1) |
51 | 51 | * 設定済みIDに、上書き再設定可能。 |
@@ -56,7 +56,7 @@ public: | ||
56 | 56 | |
57 | 57 | /** |
58 | 58 | * SEの設定を行う . |
59 | - * 但し、SEの再生時間は GGAF_END_DELAY+(最大距離遅延) フレーム以内でなければいけない。 | |
59 | + * 但し、SEの再生時間は CONFIG::END_DELAY_FRAME+(最大距離遅延) フレーム以内でなければいけない。 | |
60 | 60 | * 上書き再設定可能。 |
61 | 61 | * @param se_no SE登録番号 ( 0 〜 SE数-1 ) |
62 | 62 | * @param prm_se_key SE定義名(プロパティファイルのキー) |
@@ -37,7 +37,7 @@ public: | ||
37 | 37 | * SEの設定を行う . |
38 | 38 | * 引数のチャンネル番号が異なれば、同じSE定義名のWaveでも、複数同時発声ができる。 |
39 | 39 | * 引数のチャンネル番号が同じであれば、一つの発声しかできない。 |
40 | - * 但し、SEの再生時間は GGAF_END_DELAY+(最大距離遅延) フレーム以内でなければいけない。 | |
40 | + * 但し、SEの再生時間は CONFIG::END_DELAY_FRAME+(最大距離遅延) フレーム以内でなければいけない。 | |
41 | 41 | * 上書き再設定可能。 |
42 | 42 | * @param prm_se_no SE登録番号 ( 0 〜 SE数-1 ) |
43 | 43 | * @param prm_se_key SE定義名(プロパティファイルのwaveファイル指定のキー) |
@@ -36,7 +36,7 @@ int Config::MASTER_VOLUME = 800; | ||
36 | 36 | int Config::BGM_VOLUME = 800; |
37 | 37 | int Config::SE_VOLUME = 800; |
38 | 38 | int Config::MAX_SE_AT_ONCE = 16; |
39 | -int Config::FRAME_OF_SE_DELAY_MAX_DEPTH = 3000; | |
39 | +uint32_t Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH = 3000; | |
40 | 40 | double Config::SE_VOLUME_RATE_MAX_DEPTH=0.2; |
41 | 41 | |
42 | 42 | std::string Config::DIRNAME_RESOURCE_SKINXXX_MODEL = "model"; |
@@ -403,13 +403,13 @@ void Config::loadProperties(std::string prm_properties_filename) { | ||
403 | 403 | if (GgafCore::Config::_properties.isExistKey("MAX_SE_AT_ONCE")) { |
404 | 404 | Config::MAX_SE_AT_ONCE = GgafCore::Config::_properties.getInt("MAX_SE_AT_ONCE"); |
405 | 405 | } |
406 | - if (GgafCore::Config::_properties.isExistKey("FRAME_OF_SE_DELAY_MAX_DEPTH")) { | |
407 | - Config::FRAME_OF_SE_DELAY_MAX_DEPTH = GgafCore::Config::_properties.getInt("FRAME_OF_SE_DELAY_MAX_DEPTH"); | |
406 | + if (GgafCore::Config::_properties.isExistKey("MILLISEC_OF_SE_DELAY_MAX_DEPTH")) { | |
407 | + Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH = GgafCore::Config::_properties.getUInt("MILLISEC_OF_SE_DELAY_MAX_DEPTH"); | |
408 | 408 | } |
409 | 409 | |
410 | - if (Config::FRAME_OF_SE_DELAY_MAX_DEPTH*2 > GGAF_END_DELAY*1000) { | |
411 | - throwCriticalException("Config::FRAME_OF_SE_DELAY_MAX_DEPTH("<<Config::FRAME_OF_SE_DELAY_MAX_DEPTH<<")は、GGAF_END_DELAY*1000("<<(GGAF_END_DELAY*1000)<<")の半分以下である必要があります。\n"<< | |
412 | - "FRAME_OF_SE_DELAY_MAX_DEPTH の設定値をもっと下げてください。"); | |
410 | + if (MSEC_F(Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH)*2 > GgafCore::Config::END_DELAY_FRAME) { | |
411 | + throwCriticalException("Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH("<<Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH<<")="<<MSEC_F(Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH)<<"frameは、END_DELAY_FRAME("<<(GgafCore::Config::END_DELAY_FRAME)<<")フレームの半分以下の時間である必要があります。\n"<< | |
412 | + "MILLISEC_OF_SE_DELAY_MAX_DEPTH の設定値をもっと下げてください。"); | |
413 | 413 | } |
414 | 414 | |
415 | 415 | if (GgafCore::Config::_properties.isExistKey("SE_VOLUME_RATE_MAX_DEPTH")) { |
@@ -625,7 +625,7 @@ void Config::loadProperties(std::string prm_properties_filename) { | ||
625 | 625 | _TRACE_("Config::BGM_VOLUME=" << Config::BGM_VOLUME); |
626 | 626 | _TRACE_("Config::SE_VOLUME=" << Config::SE_VOLUME); |
627 | 627 | _TRACE_("Config::MAX_SE_AT_ONCE=" << Config::MAX_SE_AT_ONCE); |
628 | - _TRACE_("Config::FRAME_OF_SE_DELAY_MAX_DEPTH=" << Config::FRAME_OF_SE_DELAY_MAX_DEPTH); | |
628 | + _TRACE_("Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH=" << Config::MILLISEC_OF_SE_DELAY_MAX_DEPTH); | |
629 | 629 | _TRACE_("Config::SE_VOLUME_RATE_MAX_DEPTH=" << Config::SE_VOLUME_RATE_MAX_DEPTH); |
630 | 630 | |
631 | 631 | _TRACE_("Config::DIRNAME_RESOURCE_SKINXXX_MODEL=" << Config::DIRNAME_RESOURCE_SKINXXX_MODEL); |
@@ -13,7 +13,7 @@ | ||
13 | 13 | |
14 | 14 | using namespace GgafDx; |
15 | 15 | |
16 | -frame SeTransmitterForActor::_se_delay_max_depth = MSEC_F(CONFIG::FRAME_OF_SE_DELAY_MAX_DEPTH); | |
16 | +frame SeTransmitterForActor::_se_delay_max_depth = MSEC_F(CONFIG::MILLISEC_OF_SE_DELAY_MAX_DEPTH); | |
17 | 17 | |
18 | 18 | SeTransmitterForActor::SeTransmitterForActor(GeometricActor* prm_pActor) : SeTransmitter() , |
19 | 19 | _pActor(prm_pActor), |
@@ -160,7 +160,7 @@ void SeTransmitterForActor::updatePanVolume3D() { | ||
160 | 160 | |
161 | 161 | //備忘録 |
162 | 162 | //例えば消滅時の爆発だった場合、_pActor->_x みたいに、消滅後も値を参照したい。 |
163 | - //そこで GGAF_END_DELAY が重要になっている | |
163 | + //そこで CONFIG::END_DELAY_FRAME が重要になっている | |
164 | 164 | |
165 | 165 | //リアルタイムの音量を計算 |
166 | 166 | const double px_d = sqrt(DX*DX + DY*DY + DZ*DZ); //dはピクセル |
@@ -122,7 +122,7 @@ _y_bound_top_b (-_y_bound_top + PX_C(CONFIG::GAME_BUFFER_HEIGHT / 2)) | ||
122 | 122 | getSceneChief()->appendGroupChild(_pCamera); |
123 | 123 | |
124 | 124 | _pRing_pSeArray = NEW GgafCore::RingLinkedList<SeArray>(); |
125 | - for (int i = 0; i < SeTransmitterForActor::_se_delay_max_depth; i++) { //GGAF_END_DELAYは最大解放遅れフレームだが、遠方SEの遅延の最高フレーム数としても使う | |
125 | + for (int i = 0; i < SeTransmitterForActor::_se_delay_max_depth; i++) { //CONFIG::END_DELAY_FRAMEは最大解放遅れフレームだが、遠方SEの遅延の最高フレーム数としても使う | |
126 | 126 | _pRing_pSeArray->addLast(NEW SeArray(), true); |
127 | 127 | } |
128 | 128 | _pRing_pSeArray->createIndex(); |
@@ -2,7 +2,7 @@ | ||
2 | 2 | |
3 | 3 | #include "jp/ggaf/dx/actor/supporter/LocoVehicle.h" |
4 | 4 | #include "jp/ggaf/dx/actor/supporter/Scaler.h" |
5 | - | |
5 | +#include "jp/gecchi/VioletVreath/Config.h" | |
6 | 6 | |
7 | 7 | |
8 | 8 | using namespace GgafLib; |
@@ -41,7 +41,7 @@ void EffectBlink::processBehavior() { | ||
41 | 41 | setPositionAt(pTarget_); |
42 | 42 | } |
43 | 43 | } |
44 | - if (getActiveFrame() >= GGAF_END_DELAY) { | |
44 | + if (getActiveFrame() >= CONFIG::END_DELAY_FRAME) { | |
45 | 45 | pTarget_ = nullptr; |
46 | 46 | if (sayonara_end_) { |
47 | 47 | sayonara(); |
@@ -4,6 +4,8 @@ | ||
4 | 4 | |
5 | 5 | #ゲームのFPS |
6 | 6 | FPS=60.606060 |
7 | +#共通遅延解放フレーム数。 | |
8 | +END_DELAY_FRAME=5400 | |
7 | 9 | #最高フレームスキップ数。つまりどんなに重くも最低描画するフレーム間隔。(少なくとも MAX_SKIP_FRAME に 1 回は強制描画) |
8 | 10 | MAX_SKIP_FRAME=20 |
9 | 11 | #60fps→40fpsの処理落ち演出を行うかどうかの境界。1フレームあたり内部描画回数で設定。 |
@@ -134,8 +136,8 @@ BGM_VOLUME=800 | ||
134 | 136 | SE_VOLUME=800 |
135 | 137 | #SE最大同時発声数(1~64) |
136 | 138 | MAX_SE_AT_ONCE=16 |
137 | -#ゲーム空間でカメラからの最遠距離(zf)のに位置したアクターのSE発声遅延レーム数 | |
138 | -FRAME_OF_SE_DELAY_MAX_DEPTH=3000 | |
139 | +#ゲーム空間でカメラからの最遠距離(zf)のに位置したアクターのSE発声遅延ミリ秒数 | |
140 | +MILLISEC_OF_SE_DELAY_MAX_DEPTH=3000 | |
139 | 141 | #ゲーム空間でカメラからの最遠距離(zf)のに位置したアクターのSE発声ボリュームの減衰割合 |
140 | 142 | SE_VOLUME_RATE_MAX_DEPTH=0.2 |
141 | 143 |
@@ -4,6 +4,8 @@ | ||
4 | 4 | |
5 | 5 | #ゲームのFPS |
6 | 6 | FPS=60.606060 |
7 | +#共通遅延解放フレーム数。 | |
8 | +END_DELAY_FRAME=5400 | |
7 | 9 | #最高フレームスキップ数。つまりどんなに重くも最低描画するフレーム間隔。(少なくとも MAX_SKIP_FRAME に 1 回は強制描画) |
8 | 10 | MAX_SKIP_FRAME=20 |
9 | 11 | #60fps→40fpsの処理落ち演出を行うかどうかの境界。1フレームあたり内部描画回数で設定。 |