X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 196 (tree) |
|---|---|
| Time | 2018-02-28 00:54:39 |
| Author | |
武器を持ち替えると、連射間隔とリロード時間が正しく計算されない問題の改善。一部関数の戻り値の型と、戻り値の説明(コメント)が誤っていた点を修正。
| @@ -2152,7 +2152,6 @@ | ||
| 2152 | 2152 | if( weapon[i] != NULL ){ |
| 2153 | 2153 | if( selectweapon == i ){ |
| 2154 | 2154 | weapon[i]->GetParamData(&weapon_paramid[i], &lnbs, &nbs); |
| 2155 | - reloadcnt = weapon[i]->GetReloadCnt(); | |
| 2156 | 2155 | } |
| 2157 | 2156 | else{ |
| 2158 | 2157 | weapon[i]->GetParamData(&weapon_paramid[i], NULL, NULL); |
| @@ -2159,6 +2158,7 @@ | ||
| 2159 | 2158 | } |
| 2160 | 2159 | } |
| 2161 | 2160 | } |
| 2161 | + reloadcnt = myHuman->GetWeaponReloadCnt(); | |
| 2162 | 2162 | selectweaponcnt = myHuman->GetChangeWeaponCnt(); |
| 2163 | 2163 | GameParamInfo.GetWeapon(weapon_paramid[selectweapon], &weapon_paramdata); |
| 2164 | 2164 | strcpy(weaponname, weapon_paramdata.name); |
| @@ -184,6 +184,8 @@ | ||
| 184 | 184 | weapon[i] = NULL; |
| 185 | 185 | } |
| 186 | 186 | selectweapon = 1; |
| 187 | + weaponshotcnt = 0; | |
| 188 | + weaponreloadcnt = 0; | |
| 187 | 189 | //if( Param->GetHuman(id_param, &data) == 0 ){ |
| 188 | 190 | // hp = data.hp; |
| 189 | 191 | //} |
| @@ -250,6 +252,8 @@ | ||
| 250 | 252 | weapon[i] = NULL; |
| 251 | 253 | } |
| 252 | 254 | selectweapon = 1; |
| 255 | + weaponshotcnt = 0; | |
| 256 | + weaponreloadcnt = 0; | |
| 253 | 257 | if( Param->GetHuman(id_param, &data) == 0 ){ |
| 254 | 258 | hp = data.hp; |
| 255 | 259 | } |
| @@ -321,7 +325,7 @@ | ||
| 321 | 325 | } |
| 322 | 326 | |
| 323 | 327 | //! @brief 無敵フラグを取得 |
| 324 | -//! @return true:無敵 false:通常 | |
| 328 | +//! @return 無敵:true 通常:false | |
| 325 | 329 | //! @attention 無敵状態の場合、銃弾・手榴弾の爆発・落下 によるダメージを一切受けません。 |
| 326 | 330 | bool human::GetInvincibleFlag() |
| 327 | 331 | { |
| @@ -329,7 +333,7 @@ | ||
| 329 | 333 | } |
| 330 | 334 | |
| 331 | 335 | //! @brief 無敵フラグを設定 |
| 332 | -//! @param flag true:無敵 false:通常 | |
| 336 | +//! @param flag 無敵:true 通常:false | |
| 333 | 337 | //! @attention 無敵状態の場合、銃弾・手榴弾の爆発・落下 によるダメージを一切受けません。 |
| 334 | 338 | void human::SetInvincibleFlag(bool flag) |
| 335 | 339 | { |
| @@ -423,9 +427,7 @@ | ||
| 423 | 427 | if( hp <= 0 ){ return; } |
| 424 | 428 | |
| 425 | 429 | //リロード中なら失敗 |
| 426 | - if( weapon[selectweapon] != NULL ){ | |
| 427 | - if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return; } | |
| 428 | - } | |
| 430 | + if( weaponreloadcnt > 0 ){ return; } | |
| 429 | 431 | |
| 430 | 432 | //同じ武器に切り替えようとしているなら、失敗 |
| 431 | 433 | if( selectweapon == id ){ return; } |
| @@ -474,6 +476,13 @@ | ||
| 474 | 476 | return selectweaponcnt; |
| 475 | 477 | } |
| 476 | 478 | |
| 479 | +//! @brief 武器のリロードカウントを取得 | |
| 480 | +//! @return カウント数 (リロード中:1以上) | |
| 481 | +int human::GetWeaponReloadCnt() | |
| 482 | +{ | |
| 483 | + return weaponreloadcnt; | |
| 484 | +} | |
| 485 | + | |
| 477 | 486 | //! @brief 武器を取得 |
| 478 | 487 | //! @param out_selectweapon 選択されている武器 (0 〜 [TOTAL_HAVEWEAPON]-1) |
| 479 | 488 | //! @param out_weapon 受け取るweaponクラスのポインタ配列 (配列数:TOTAL_HAVEWEAPON) |
| @@ -520,7 +529,7 @@ | ||
| 520 | 529 | //! @brief 発砲処理 |
| 521 | 530 | //! @param weapon_paramid 発砲した武器の番号を受け取るポインタ |
| 522 | 531 | //! @param GunsightErrorRange 発砲した際の照準誤差を受け取るポインタ |
| 523 | -//! @return 成功:1 失敗:0 | |
| 532 | +//! @return 成功:true 失敗:false | |
| 524 | 533 | //! @attention 弾オブジェクトの処理や、発砲音の再生は別途行う必要があります。 |
| 525 | 534 | //! @attention ゲーム上から直接呼び出すことは避け、ObjectManagerクラスから呼び出してください。 |
| 526 | 535 | bool human::ShotWeapon(int *weapon_paramid, int *GunsightErrorRange) |
| @@ -533,6 +542,10 @@ | ||
| 533 | 542 | //武器を装備していなければ、失敗 |
| 534 | 543 | if( weapon[selectweapon] == NULL ){ return false; } |
| 535 | 544 | |
| 545 | + //発射間隔に満たないか、リロード中ならば失敗 | |
| 546 | + if( weaponshotcnt > 0 ){ return false; } | |
| 547 | + if( weaponreloadcnt > 0 ){ return false; } | |
| 548 | + | |
| 536 | 549 | //弾の発射処理を行う |
| 537 | 550 | if( weapon[selectweapon]->Shot() != 0 ){ return false; } |
| 538 | 551 |
| @@ -544,6 +557,9 @@ | ||
| 544 | 557 | WeaponParameter ParamData; |
| 545 | 558 | if( Param->GetWeapon(param_id, &ParamData) != 0 ){ return false; } |
| 546 | 559 | |
| 560 | + //連射カウントを設定 | |
| 561 | + weaponshotcnt = ParamData.blazings; | |
| 562 | + | |
| 547 | 563 | //精密スコープの武器でスコープを覗いていなければ、誤差 20。 |
| 548 | 564 | if( (scopemode == 0)&&(ParamData.scopemode == 2) ){ |
| 549 | 565 | ReactionGunsightErrorRange = 20; |
| @@ -620,7 +636,7 @@ | ||
| 620 | 636 | //何かしらの武器を装備していれば〜 |
| 621 | 637 | if( weapon[selectweapon] != NULL ){ |
| 622 | 638 | //リロード中なら失敗 |
| 623 | - if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; } | |
| 639 | + if( weaponreloadcnt > 0 ){ return false; } | |
| 624 | 640 | |
| 625 | 641 | //リロード処理を開始 |
| 626 | 642 | if( weapon[selectweapon]->StartReload() != 0 ){ return false; } |
| @@ -635,6 +651,15 @@ | ||
| 635 | 651 | nowweapon->GetParamData(&id_param, NULL, NULL); |
| 636 | 652 | MotionCtrl->ReloadWeapon(id_param); |
| 637 | 653 | |
| 654 | + //武器の性能値を取得 | |
| 655 | + int param_id; | |
| 656 | + WeaponParameter ParamData; | |
| 657 | + weapon[selectweapon]->GetParamData(¶m_id, NULL, NULL); | |
| 658 | + if( Param->GetWeapon(param_id, &ParamData) != 0 ){ return 1; } | |
| 659 | + | |
| 660 | + //リロードカウントを設定 | |
| 661 | + weaponreloadcnt = ParamData.reloads + 1; | |
| 662 | + | |
| 638 | 663 | return true; |
| 639 | 664 | } |
| 640 | 665 | return false; |
| @@ -651,7 +676,7 @@ | ||
| 651 | 676 | //何かしらの武器を装備していれば〜 |
| 652 | 677 | if( weapon[selectweapon] != NULL ){ |
| 653 | 678 | //リロード中なら失敗 |
| 654 | - if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; } | |
| 679 | + if( weaponreloadcnt > 0 ){ return false; } | |
| 655 | 680 | |
| 656 | 681 | //武器を捨て、装備を解除 |
| 657 | 682 | weapon[selectweapon]->Dropoff(pos_x, pos_y, pos_z, rotation_x, 1.63f); |
| @@ -798,7 +823,7 @@ | ||
| 798 | 823 | if( weapon[selectweapon] == NULL ){ return false; } |
| 799 | 824 | |
| 800 | 825 | //リロード中なら失敗 |
| 801 | - if( weapon[selectweapon]->GetReloadCnt() > 0 ){ return false; } | |
| 826 | + if( weaponreloadcnt > 0 ){ return false; } | |
| 802 | 827 | |
| 803 | 828 | //武器の種類番号を取得 |
| 804 | 829 | weapon[selectweapon]->GetParamData(¶m_id, NULL, NULL); |
| @@ -1613,7 +1638,7 @@ | ||
| 1613 | 1638 | |
| 1614 | 1639 | if( deadstate == 5 ){ return 3; } |
| 1615 | 1640 | |
| 1616 | - int WeaponReloadCnt; | |
| 1641 | + int WeaponReloadMotionCnt; | |
| 1617 | 1642 | float FallDistance; |
| 1618 | 1643 | float nowmove_x, nowmove_z; |
| 1619 | 1644 | int CheckDead; |
| @@ -1624,12 +1649,24 @@ | ||
| 1624 | 1649 | selectweaponcnt -= 1; |
| 1625 | 1650 | } |
| 1626 | 1651 | |
| 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 | + //リロードカウント取得(モーション用) | |
| 1628 | 1665 | if( weapon[selectweapon] != NULL ){ |
| 1629 | - WeaponReloadCnt = weapon[selectweapon]->GetReloadCnt(); | |
| 1666 | + WeaponReloadMotionCnt = weaponreloadcnt; | |
| 1630 | 1667 | } |
| 1631 | 1668 | else{ |
| 1632 | - WeaponReloadCnt = 0; | |
| 1669 | + WeaponReloadMotionCnt = 0; | |
| 1633 | 1670 | } |
| 1634 | 1671 | |
| 1635 | 1672 | //照準の状態誤差の処理 |
| @@ -1697,7 +1734,7 @@ | ||
| 1697 | 1734 | } |
| 1698 | 1735 | |
| 1699 | 1736 | //モーション計算 |
| 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); | |
| 1701 | 1738 | |
| 1702 | 1739 | if( CheckDead != 0 ){ return 3; } |
| 1703 | 1740 | return 1; |
| @@ -1792,7 +1829,6 @@ | ||
| 1792 | 1829 | usingflag = false; |
| 1793 | 1830 | bullets = nbs; |
| 1794 | 1831 | Loadbullets = 0; |
| 1795 | - shotcnt = 0; | |
| 1796 | 1832 | motionflag = true; |
| 1797 | 1833 | |
| 1798 | 1834 | if( Param != NULL ){ |
| @@ -1840,8 +1876,6 @@ | ||
| 1840 | 1876 | |
| 1841 | 1877 | if( init == true ){ |
| 1842 | 1878 | usingflag = false; |
| 1843 | - shotcnt = 0; | |
| 1844 | - reloadcnt = 0; | |
| 1845 | 1879 | motionflag = true; |
| 1846 | 1880 | } |
| 1847 | 1881 | } |
| @@ -1904,9 +1938,7 @@ | ||
| 1904 | 1938 | //クラスが設定されていなければ失敗 |
| 1905 | 1939 | if( Param == NULL ){ return 1; } |
| 1906 | 1940 | |
| 1907 | - //発射間隔に満たないか、リロード中か、弾が無ければ失敗 | |
| 1908 | - if( shotcnt > 0 ){ return 1; } | |
| 1909 | - if( reloadcnt > 0 ){ return 1; } | |
| 1941 | + //弾が無ければ失敗 | |
| 1910 | 1942 | if( Loadbullets == 0 ){ return 1; } |
| 1911 | 1943 | |
| 1912 | 1944 | //設定値を取得 |
| @@ -1915,10 +1947,9 @@ | ||
| 1915 | 1947 | |
| 1916 | 1948 | //武器が手榴弾ならば〜 |
| 1917 | 1949 | if( id_parameter == ID_WEAPON_GRENADE ){ |
| 1918 | - //弾を減らし、連射カウントを設定 | |
| 1950 | + //弾を減らす | |
| 1919 | 1951 | bullets -= 1; |
| 1920 | 1952 | Loadbullets -= 1; |
| 1921 | - shotcnt = ParamData.blazings; | |
| 1922 | 1953 | |
| 1923 | 1954 | if( (bullets - Loadbullets) <= 0 ){ //(リロードしていない)弾が無くなれば、武器ごと消滅させる。 |
| 1924 | 1955 | EnableFlag = false; |
| @@ -1930,10 +1961,9 @@ | ||
| 1930 | 1961 | return 0; |
| 1931 | 1962 | } |
| 1932 | 1963 | |
| 1933 | - //弾を減らし、連射カウントを設定 | |
| 1964 | + //弾を減らす | |
| 1934 | 1965 | Loadbullets -= 1; |
| 1935 | 1966 | bullets -= 1; |
| 1936 | - shotcnt = ParamData.blazings; | |
| 1937 | 1967 | return 0; |
| 1938 | 1968 | } |
| 1939 | 1969 |
| @@ -1940,28 +1970,19 @@ | ||
| 1940 | 1970 | //! @brief リロードを開始 |
| 1941 | 1971 | //! @return 成功:0 失敗:1 |
| 1942 | 1972 | //! @attention リロード時間も考慮されます。 |
| 1943 | -//! @attention 関数が失敗するのは、いずれかの条件です。 「リロード実行中」「弾がない」「無効な武器の種類が設定されている」 | |
| 1973 | +//! @attention 関数が失敗するのは、いずれかの条件です。 「弾がない」「無効な武器の種類が設定されている」 | |
| 1944 | 1974 | int weapon::StartReload() |
| 1945 | 1975 | { |
| 1946 | 1976 | //クラスが設定されていなければ失敗 |
| 1947 | 1977 | if( Param == NULL ){ return 1; } |
| 1948 | 1978 | |
| 1949 | - //リロード中か、弾が無ければ失敗 | |
| 1950 | - if( reloadcnt > 0 ){ return 1; } | |
| 1979 | + //弾が無ければ失敗 | |
| 1951 | 1980 | 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; | |
| 1959 | 1981 | return 0; |
| 1960 | 1982 | } |
| 1961 | 1983 | |
| 1962 | 1984 | //! @brief リロードを実行 |
| 1963 | 1985 | //! @attention StartReload()関数と異なり、瞬時に弾を補充します。リロード時間は考慮されません。 |
| 1964 | -//! @attention リロード時間を考慮する場合、StartReload()関数を呼び出してください。この関数は自動的に実行されます。 | |
| 1965 | 1986 | int weapon::RunReload() |
| 1966 | 1987 | { |
| 1967 | 1988 | //クラスが設定されていなければ失敗 |
| @@ -1989,25 +2010,18 @@ | ||
| 1989 | 2010 | return 0; |
| 1990 | 2011 | } |
| 1991 | 2012 | |
| 1992 | -//! @brief リロードカウントを取得 | |
| 1993 | -//! @return カウント数 (リロード中:1以上) | |
| 1994 | -int weapon::GetReloadCnt() | |
| 1995 | -{ | |
| 1996 | - return reloadcnt; | |
| 1997 | -} | |
| 1998 | - | |
| 1999 | 2013 | //! @brief 武器の種類・装弾数の変更 |
| 2000 | 2014 | //! @param Resource ResourceManagerのポインタ |
| 2001 | 2015 | //! @param id_param 種類番号 |
| 2002 | 2016 | //! @param lnbs 装弾数 |
| 2003 | 2017 | //! @param nbs 合計弾数 |
| 2004 | -//! @return 成功:1 失敗:0 | |
| 2018 | +//! @return 成功:true 失敗:false | |
| 2005 | 2019 | //! @attention プレイヤーによる裏技(F6・F7)用に用意された関数です。手榴弾が選択された場合、自動的に弾を補充します。 |
| 2006 | 2020 | //! @attention 使用されていない武器オブジェクトに対して実行すると、この関数は失敗します。 |
| 2007 | 2021 | bool weapon::ResetWeaponParam(class ResourceManager *Resource, int id_param, int lnbs, int nbs) |
| 2008 | 2022 | { |
| 2009 | 2023 | //初期化されていなければ、失敗 |
| 2010 | - if( EnableFlag == false ){ return 0; } | |
| 2024 | + if( EnableFlag == false ){ return false; } | |
| 2011 | 2025 | |
| 2012 | 2026 | //指定された設定値へ上書き |
| 2013 | 2027 | id_parameter = id_param; |
| @@ -2028,7 +2042,7 @@ | ||
| 2028 | 2042 | model_size = param.size; |
| 2029 | 2043 | } |
| 2030 | 2044 | |
| 2031 | - return 1; | |
| 2045 | + return true; | |
| 2032 | 2046 | } |
| 2033 | 2047 | |
| 2034 | 2048 | //! @brief 計算を実行(自由落下) |
| @@ -2041,18 +2055,6 @@ | ||
| 2041 | 2055 | //初期化されていなければ、失敗 |
| 2042 | 2056 | if( EnableFlag == false ){ return 0; } |
| 2043 | 2057 | |
| 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 | - | |
| 2056 | 2058 | //誰にも使われておらず、移動フラグが有効ならば〜 |
| 2057 | 2059 | if( (usingflag == false)&&(motionflag == true) ){ |
| 2058 | 2060 | float Dist; |
| @@ -143,6 +143,8 @@ | ||
| 143 | 143 | class weapon *weapon[TOTAL_HAVEWEAPON]; //!< 武器 |
| 144 | 144 | int selectweapon; //!< 武器A/Bの選択 |
| 145 | 145 | int selectweaponcnt; //!< 武器の切り替えカウント |
| 146 | + int weaponshotcnt; //!< 武器の連射カウント | |
| 147 | + int weaponreloadcnt; //!< 武器のリロードカウント | |
| 146 | 148 | int hp; //!< 体力 |
| 147 | 149 | int deadstate; //!< 死体になっているか |
| 148 | 150 | float add_ry; //!< 死体の倒れる加速度 |
| @@ -182,6 +184,7 @@ | ||
| 182 | 184 | virtual int PickupWeapon(class weapon *in_weapon); |
| 183 | 185 | virtual void ChangeWeapon(int id = -1); |
| 184 | 186 | virtual int GetChangeWeaponCnt(); |
| 187 | + virtual int GetWeaponReloadCnt(); | |
| 185 | 188 | virtual void GetWeapon(int *out_selectweapon, class weapon *out_weapon[]); |
| 186 | 189 | virtual int GetMainWeaponTypeNO(); |
| 187 | 190 | virtual bool GetWeaponBlazingmode(); |
| @@ -226,8 +229,6 @@ | ||
| 226 | 229 | bool usingflag; //!< 使用中を表すフラグ |
| 227 | 230 | int bullets; //!< 合計弾数 |
| 228 | 231 | int Loadbullets; //!< 装弾数 |
| 229 | - int shotcnt; //!< 連射カウント | |
| 230 | - int reloadcnt; //!< リロードカウント | |
| 231 | 232 | bool motionflag; //!< 座標移動中を表すフラグ |
| 232 | 233 | |
| 233 | 234 | public: |
| @@ -242,7 +243,6 @@ | ||
| 242 | 243 | virtual int Shot(); |
| 243 | 244 | virtual int StartReload(); |
| 244 | 245 | virtual int RunReload(); |
| 245 | - virtual int GetReloadCnt(); | |
| 246 | 246 | virtual bool ResetWeaponParam(class ResourceManager *Resource, int id_param, int lnbs, int nbs); |
| 247 | 247 | virtual int RunFrame(class Collision *CollD); |
| 248 | 248 | virtual void Render(class D3DGraphics *d3dg); |