• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqtwindows誰得cocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision196 (tree)
Zeit2018-02-28 00:54:39
Autorxops-mikan

Log Message

武器を持ち替えると、連射間隔とリロード時間が正しく計算されない問題の改善。一部関数の戻り値の型と、戻り値の説明(コメント)が誤っていた点を修正。

Ändern Zusammenfassung

Diff

--- trunk/gamemain.cpp (revision 195)
+++ trunk/gamemain.cpp (revision 196)
@@ -2152,7 +2152,6 @@
21522152 if( weapon[i] != NULL ){
21532153 if( selectweapon == i ){
21542154 weapon[i]->GetParamData(&weapon_paramid[i], &lnbs, &nbs);
2155- reloadcnt = weapon[i]->GetReloadCnt();
21562155 }
21572156 else{
21582157 weapon[i]->GetParamData(&weapon_paramid[i], NULL, NULL);
@@ -2159,6 +2158,7 @@
21592158 }
21602159 }
21612160 }
2161+ reloadcnt = myHuman->GetWeaponReloadCnt();
21622162 selectweaponcnt = myHuman->GetChangeWeaponCnt();
21632163 GameParamInfo.GetWeapon(weapon_paramid[selectweapon], &weapon_paramdata);
21642164 strcpy(weaponname, weapon_paramdata.name);
--- trunk/object.cpp (revision 195)
+++ trunk/object.cpp (revision 196)
@@ -184,6 +184,8 @@
184184 weapon[i] = NULL;
185185 }
186186 selectweapon = 1;
187+ weaponshotcnt = 0;
188+ weaponreloadcnt = 0;
187189 //if( Param->GetHuman(id_param, &data) == 0 ){
188190 // hp = data.hp;
189191 //}
@@ -250,6 +252,8 @@
250252 weapon[i] = NULL;
251253 }
252254 selectweapon = 1;
255+ weaponshotcnt = 0;
256+ weaponreloadcnt = 0;
253257 if( Param->GetHuman(id_param, &data) == 0 ){
254258 hp = data.hp;
255259 }
@@ -321,7 +325,7 @@
321325 }
322326
323327 //! @brief 無敵フラグを取得
324-//! @return true:無敵 false:通常
328+//! @return 無敵:true 通常:false
325329 //! @attention 無敵状態の場合、銃弾・手榴弾の爆発・落下 によるダメージを一切受けません。
326330 bool human::GetInvincibleFlag()
327331 {
@@ -329,7 +333,7 @@
329333 }
330334
331335 //! @brief 無敵フラグを設定
332-//! @param flag true:無敵 false:通常
336+//! @param flag 無敵:true 通常:false
333337 //! @attention 無敵状態の場合、銃弾・手榴弾の爆発・落下 によるダメージを一切受けません。
334338 void human::SetInvincibleFlag(bool flag)
335339 {
@@ -423,9 +427,7 @@
423427 if( hp <= 0 ){ return; }
424428
425429 //リロード中なら失敗
426- if( weapon[selectweapon] != NULL ){
427- if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return; }
428- }
430+ if( weaponreloadcnt > 0 ){ return; }
429431
430432 //同じ武器に切り替えようとしているなら、失敗
431433 if( selectweapon == id ){ return; }
@@ -474,6 +476,13 @@
474476 return selectweaponcnt;
475477 }
476478
479+//! @brief 武器のリロードカウントを取得
480+//! @return カウント数 (リロード中:1以上)
481+int human::GetWeaponReloadCnt()
482+{
483+ return weaponreloadcnt;
484+}
485+
477486 //! @brief 武器を取得
478487 //! @param out_selectweapon 選択されている武器 (0 〜 [TOTAL_HAVEWEAPON]-1)
479488 //! @param out_weapon 受け取るweaponクラスのポインタ配列 (配列数:TOTAL_HAVEWEAPON)
@@ -520,7 +529,7 @@
520529 //! @brief 発砲処理
521530 //! @param weapon_paramid 発砲した武器の番号を受け取るポインタ
522531 //! @param GunsightErrorRange 発砲した際の照準誤差を受け取るポインタ
523-//! @return 成功:1 失敗:0
532+//! @return 成功:true 失敗:false
524533 //! @attention 弾オブジェクトの処理や、発砲音の再生は別途行う必要があります。
525534 //! @attention ゲーム上から直接呼び出すことは避け、ObjectManagerクラスから呼び出してください。
526535 bool human::ShotWeapon(int *weapon_paramid, int *GunsightErrorRange)
@@ -533,6 +542,10 @@
533542 //武器を装備していなければ、失敗
534543 if( weapon[selectweapon] == NULL ){ return false; }
535544
545+ //発射間隔に満たないか、リロード中ならば失敗
546+ if( weaponshotcnt > 0 ){ return false; }
547+ if( weaponreloadcnt > 0 ){ return false; }
548+
536549 //弾の発射処理を行う
537550 if( weapon[selectweapon]->Shot() != 0 ){ return false; }
538551
@@ -544,6 +557,9 @@
544557 WeaponParameter ParamData;
545558 if( Param->GetWeapon(param_id, &ParamData) != 0 ){ return false; }
546559
560+ //連射カウントを設定
561+ weaponshotcnt = ParamData.blazings;
562+
547563 //精密スコープの武器でスコープを覗いていなければ、誤差 20。
548564 if( (scopemode == 0)&&(ParamData.scopemode == 2) ){
549565 ReactionGunsightErrorRange = 20;
@@ -620,7 +636,7 @@
620636 //何かしらの武器を装備していれば〜
621637 if( weapon[selectweapon] != NULL ){
622638 //リロード中なら失敗
623- if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; }
639+ if( weaponreloadcnt > 0 ){ return false; }
624640
625641 //リロード処理を開始
626642 if( weapon[selectweapon]->StartReload() != 0 ){ return false; }
@@ -635,6 +651,15 @@
635651 nowweapon->GetParamData(&id_param, NULL, NULL);
636652 MotionCtrl->ReloadWeapon(id_param);
637653
654+ //武器の性能値を取得
655+ int param_id;
656+ WeaponParameter ParamData;
657+ weapon[selectweapon]->GetParamData(&param_id, NULL, NULL);
658+ if( Param->GetWeapon(param_id, &ParamData) != 0 ){ return 1; }
659+
660+ //リロードカウントを設定
661+ weaponreloadcnt = ParamData.reloads + 1;
662+
638663 return true;
639664 }
640665 return false;
@@ -651,7 +676,7 @@
651676 //何かしらの武器を装備していれば〜
652677 if( weapon[selectweapon] != NULL ){
653678 //リロード中なら失敗
654- if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; }
679+ if( weaponreloadcnt > 0 ){ return false; }
655680
656681 //武器を捨て、装備を解除
657682 weapon[selectweapon]->Dropoff(pos_x, pos_y, pos_z, rotation_x, 1.63f);
@@ -798,7 +823,7 @@
798823 if( weapon[selectweapon] == NULL ){ return false; }
799824
800825 //リロード中なら失敗
801- if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; }
826+ if( weaponreloadcnt > 0 ){ return false; }
802827
803828 //武器の種類番号を取得
804829 weapon[selectweapon]->GetParamData(&param_id, NULL, NULL);
@@ -1613,7 +1638,7 @@
16131638
16141639 if( deadstate == 5 ){ return 3; }
16151640
1616- int WeaponReloadCnt;
1641+ int WeaponReloadMotionCnt;
16171642 float FallDistance;
16181643 float nowmove_x, nowmove_z;
16191644 int CheckDead;
@@ -1624,12 +1649,24 @@
16241649 selectweaponcnt -= 1;
16251650 }
16261651
1627- //リロードカウント取得
1652+ //連射カウントが残っていれば、1 減らす
1653+ if( weaponshotcnt > 0 ){
1654+ weaponshotcnt -= 1;
1655+ }
1656+ else if( weaponreloadcnt > 0 ){
1657+ //リロードカウントが残っていれば 1 減らし、カウントが 0 ならばリロード処理を実行
1658+ weaponreloadcnt -= 1;
1659+ if( weaponreloadcnt == 0 ){
1660+ if( weapon[selectweapon] != NULL ){ weapon[selectweapon]->RunReload(); }
1661+ }
1662+ }
1663+
1664+ //リロードカウント取得(モーション用)
16281665 if( weapon[selectweapon] != NULL ){
1629- WeaponReloadCnt = weapon[selectweapon]->GetReloadCnt();
1666+ WeaponReloadMotionCnt = weaponreloadcnt;
16301667 }
16311668 else{
1632- WeaponReloadCnt = 0;
1669+ WeaponReloadMotionCnt = 0;
16331670 }
16341671
16351672 //照準の状態誤差の処理
@@ -1697,7 +1734,7 @@
16971734 }
16981735
16991736 //モーション計算
1700- MotionCtrl->RunFrame(rotation_x, armrotation_y, weapon_paramid, WeaponReloadCnt, MoveFlag_lt, hp, player);
1737+ MotionCtrl->RunFrame(rotation_x, armrotation_y, weapon_paramid, WeaponReloadMotionCnt, MoveFlag_lt, hp, player);
17011738
17021739 if( CheckDead != 0 ){ return 3; }
17031740 return 1;
@@ -1792,7 +1829,6 @@
17921829 usingflag = false;
17931830 bullets = nbs;
17941831 Loadbullets = 0;
1795- shotcnt = 0;
17961832 motionflag = true;
17971833
17981834 if( Param != NULL ){
@@ -1840,8 +1876,6 @@
18401876
18411877 if( init == true ){
18421878 usingflag = false;
1843- shotcnt = 0;
1844- reloadcnt = 0;
18451879 motionflag = true;
18461880 }
18471881 }
@@ -1904,9 +1938,7 @@
19041938 //クラスが設定されていなければ失敗
19051939 if( Param == NULL ){ return 1; }
19061940
1907- //発射間隔に満たないか、リロード中か、弾が無ければ失敗
1908- if( shotcnt > 0 ){ return 1; }
1909- if( reloadcnt > 0 ){ return 1; }
1941+ //弾が無ければ失敗
19101942 if( Loadbullets == 0 ){ return 1; }
19111943
19121944 //設定値を取得
@@ -1915,10 +1947,9 @@
19151947
19161948 //武器が手榴弾ならば〜
19171949 if( id_parameter == ID_WEAPON_GRENADE ){
1918- //弾を減らし、連射カウントを設定
1950+ //弾を減らす
19191951 bullets -= 1;
19201952 Loadbullets -= 1;
1921- shotcnt = ParamData.blazings;
19221953
19231954 if( (bullets - Loadbullets) <= 0 ){ //(リロードしていない)弾が無くなれば、武器ごと消滅させる。
19241955 EnableFlag = false;
@@ -1930,10 +1961,9 @@
19301961 return 0;
19311962 }
19321963
1933- //弾を減らし、連射カウントを設定
1964+ //弾を減らす
19341965 Loadbullets -= 1;
19351966 bullets -= 1;
1936- shotcnt = ParamData.blazings;
19371967 return 0;
19381968 }
19391969
@@ -1940,28 +1970,19 @@
19401970 //! @brief リロードを開始
19411971 //! @return 成功:0 失敗:1
19421972 //! @attention リロード時間も考慮されます。
1943-//! @attention 関数が失敗するのは、いずれかの条件です。 「リロード実行中」「弾がない」「無効な武器の種類が設定されている」
1973+//! @attention 関数が失敗するのは、いずれかの条件です。 「弾がない」「無効な武器の種類が設定されている」
19441974 int weapon::StartReload()
19451975 {
19461976 //クラスが設定されていなければ失敗
19471977 if( Param == NULL ){ return 1; }
19481978
1949- //リロード中か、弾が無ければ失敗
1950- if( reloadcnt > 0 ){ return 1; }
1979+ //弾が無ければ失敗
19511980 if( (bullets - Loadbullets) == 0 ){ return 1; }
1952-
1953- //武器の性能値を取得
1954- WeaponParameter ParamData;
1955- if( Param->GetWeapon(id_parameter, &ParamData) != 0 ){ return 1; }
1956-
1957- //リロードカウントを設定
1958- reloadcnt = ParamData.reloads + 1;
19591981 return 0;
19601982 }
19611983
19621984 //! @brief リロードを実行
19631985 //! @attention StartReload()関数と異なり、瞬時に弾を補充します。リロード時間は考慮されません。
1964-//! @attention リロード時間を考慮する場合、StartReload()関数を呼び出してください。この関数は自動的に実行されます。
19651986 int weapon::RunReload()
19661987 {
19671988 //クラスが設定されていなければ失敗
@@ -1989,25 +2010,18 @@
19892010 return 0;
19902011 }
19912012
1992-//! @brief リロードカウントを取得
1993-//! @return カウント数 (リロード中:1以上)
1994-int weapon::GetReloadCnt()
1995-{
1996- return reloadcnt;
1997-}
1998-
19992013 //! @brief 武器の種類・装弾数の変更
20002014 //! @param Resource ResourceManagerのポインタ
20012015 //! @param id_param 種類番号
20022016 //! @param lnbs 装弾数
20032017 //! @param nbs 合計弾数
2004-//! @return 成功:1 失敗:0
2018+//! @return 成功:true 失敗:false
20052019 //! @attention プレイヤーによる裏技(F6・F7)用に用意された関数です。手榴弾が選択された場合、自動的に弾を補充します。
20062020 //! @attention 使用されていない武器オブジェクトに対して実行すると、この関数は失敗します。
20072021 bool weapon::ResetWeaponParam(class ResourceManager *Resource, int id_param, int lnbs, int nbs)
20082022 {
20092023 //初期化されていなければ、失敗
2010- if( EnableFlag == false ){ return 0; }
2024+ if( EnableFlag == false ){ return false; }
20112025
20122026 //指定された設定値へ上書き
20132027 id_parameter = id_param;
@@ -2028,7 +2042,7 @@
20282042 model_size = param.size;
20292043 }
20302044
2031- return 1;
2045+ return true;
20322046 }
20332047
20342048 //! @brief 計算を実行(自由落下)
@@ -2041,18 +2055,6 @@
20412055 //初期化されていなければ、失敗
20422056 if( EnableFlag == false ){ return 0; }
20432057
2044- //連射カウントが残っていれば、1 減らす
2045- if( shotcnt > 0 ){
2046- shotcnt -= 1;
2047- }
2048- else if( reloadcnt > 0 ){
2049- //リロードカウントが残っていれば 1 減らし、カウントが 0 ならばリロード処理を実行
2050- reloadcnt -= 1;
2051- if( reloadcnt == 0 ){
2052- RunReload();
2053- }
2054- }
2055-
20562058 //誰にも使われておらず、移動フラグが有効ならば〜
20572059 if( (usingflag == false)&&(motionflag == true) ){
20582060 float Dist;
--- trunk/object.h (revision 195)
+++ trunk/object.h (revision 196)
@@ -143,6 +143,8 @@
143143 class weapon *weapon[TOTAL_HAVEWEAPON]; //!< 武器
144144 int selectweapon; //!< 武器A/Bの選択
145145 int selectweaponcnt; //!< 武器の切り替えカウント
146+ int weaponshotcnt; //!< 武器の連射カウント
147+ int weaponreloadcnt; //!< 武器のリロードカウント
146148 int hp; //!< 体力
147149 int deadstate; //!< 死体になっているか
148150 float add_ry; //!< 死体の倒れる加速度
@@ -182,6 +184,7 @@
182184 virtual int PickupWeapon(class weapon *in_weapon);
183185 virtual void ChangeWeapon(int id = -1);
184186 virtual int GetChangeWeaponCnt();
187+ virtual int GetWeaponReloadCnt();
185188 virtual void GetWeapon(int *out_selectweapon, class weapon *out_weapon[]);
186189 virtual int GetMainWeaponTypeNO();
187190 virtual bool GetWeaponBlazingmode();
@@ -226,8 +229,6 @@
226229 bool usingflag; //!< 使用中を表すフラグ
227230 int bullets; //!< 合計弾数
228231 int Loadbullets; //!< 装弾数
229- int shotcnt; //!< 連射カウント
230- int reloadcnt; //!< リロードカウント
231232 bool motionflag; //!< 座標移動中を表すフラグ
232233
233234 public:
@@ -242,7 +243,6 @@
242243 virtual int Shot();
243244 virtual int StartReload();
244245 virtual int RunReload();
245- virtual int GetReloadCnt();
246246 virtual bool ResetWeaponParam(class ResourceManager *Resource, int id_param, int lnbs, int nbs);
247247 virtual int RunFrame(class Collision *CollD);
248248 virtual void Render(class D3DGraphics *d3dg);