X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 131 (tree) |
|---|---|
| Time | 2016-05-29 14:25:44 |
| Author | |
発砲時の誤差計算を修正、ショットガンの発散パターンを改善。
| @@ -1706,34 +1706,50 @@ | ||
| 1706 | 1706 | //武器の情報を取得 |
| 1707 | 1707 | if( GameParamInfo->GetWeapon(weapon_paramid, &ParamData) != 0 ){ return 0; } |
| 1708 | 1708 | |
| 1709 | + //手榴弾か判定 | |
| 1710 | + if( weapon_paramid == ID_WEAPON_GRENADE ){ grenadeflag = true; } | |
| 1711 | + else{ grenadeflag = false; } | |
| 1712 | + | |
| 1709 | 1713 | //誤差の範囲を計算 |
| 1710 | 1714 | int ErrorRange; |
| 1711 | 1715 | ErrorRange = GunsightErrorRange; |
| 1712 | 1716 | if( ErrorRange < ParamData.ErrorRangeMIN ){ ErrorRange = ParamData.ErrorRangeMIN; } |
| 1713 | 1717 | |
| 1714 | - //手榴弾か判定 | |
| 1715 | - if( weapon_paramid == ID_WEAPON_GRENADE ){ grenadeflag = true; } | |
| 1716 | - else{ grenadeflag = false; } | |
| 1718 | + //発射角度(誤差ゼロのベース)を決定 | |
| 1719 | + float rx, ry; | |
| 1720 | + rx = rotation_x*-1 + (float)M_PI/2; | |
| 1721 | + ry = armrotation_y; | |
| 1717 | 1722 | |
| 1718 | - class bullet* newbullet; | |
| 1719 | - class grenade* newgrenade; | |
| 1723 | + //誤差を決定 | |
| 1724 | + int ErrorRange_x, ErrorRange_y; | |
| 1725 | + if( (ErrorRange - ParamData.ErrorRangeMIN) == 0 ){ | |
| 1726 | + ErrorRange_x = ErrorRange; | |
| 1727 | + ErrorRange_y = ErrorRange; | |
| 1728 | + } | |
| 1729 | + else{ | |
| 1730 | + ErrorRange_x = GetRand(ErrorRange - ParamData.ErrorRangeMIN) + ParamData.ErrorRangeMIN; | |
| 1731 | + ErrorRange_y = GetRand(ErrorRange - ParamData.ErrorRangeMIN) + ParamData.ErrorRangeMIN; | |
| 1732 | + } | |
| 1733 | + if( GetRand(2) == 0 ){ ErrorRange_x *= -1; } | |
| 1734 | + if( GetRand(2) == 0 ){ ErrorRange_y *= -1; } | |
| 1720 | 1735 | |
| 1721 | - //(ショットガンなど)発射する弾の数分繰り返す | |
| 1722 | - for(int i=0; i<ParamData.burst; i++){ | |
| 1723 | - //発射角度を決定 | |
| 1724 | - float rx, ry; | |
| 1725 | - rx = rotation_x*-1 + (float)M_PI/2; | |
| 1726 | - ry = armrotation_y; | |
| 1736 | + //発射誤差の角度を求める | |
| 1737 | + float a, r; | |
| 1738 | + a = atan2((float)ErrorRange_y, (float)ErrorRange_x); | |
| 1739 | + r = sqrt((float)(ErrorRange_x*ErrorRange_x + ErrorRange_y*ErrorRange_y)); | |
| 1727 | 1740 | |
| 1728 | - //誤差分 加算する | |
| 1729 | - float a; | |
| 1730 | - a = DegreeToRadian(1) * GetRand(360); | |
| 1731 | - rx += cos(a)*ErrorRange * DegreeToRadian(0.15f); | |
| 1732 | - ry += sin(a)*ErrorRange * DegreeToRadian(0.15f); | |
| 1741 | + //誤差分 角度に加算 | |
| 1742 | + rx += cos(a)*r * DegreeToRadian(0.15f); | |
| 1743 | + ry += sin(a)*r * DegreeToRadian(0.15f); | |
| 1733 | 1744 | |
| 1734 | - //手榴弾でなければ | |
| 1735 | - if( grenadeflag == false ){ | |
| 1745 | + //手榴弾でなければ | |
| 1746 | + if( grenadeflag == false ){ | |
| 1747 | + class bullet* newbullet; | |
| 1748 | + | |
| 1749 | + //(ショットガンなど)発射する弾の数分繰り返す | |
| 1750 | + for(int i=0; i<ParamData.burst; i++){ | |
| 1736 | 1751 | int attacks; |
| 1752 | + float rx2, ry2; | |
| 1737 | 1753 | |
| 1738 | 1754 | //(ショットガンなど)発射する弾が複数あれば |
| 1739 | 1755 | if( ParamData.burst > 1 ){ |
| @@ -1740,18 +1756,29 @@ | ||
| 1740 | 1756 | //1個の弾当たりの攻撃力を算出 |
| 1741 | 1757 | // 全弾合わせて、攻撃力の2倍になるようにする。 |
| 1742 | 1758 | attacks = (int)( (float)ParamData.attacks / ((float)ParamData.burst/2) ); |
| 1759 | + | |
| 1760 | + //さらに誤差を増やして拡散させる | |
| 1761 | + int len; | |
| 1762 | + a = DegreeToRadian(10) * GetRand(36); | |
| 1763 | + len = GetRand(5)*2+5; | |
| 1764 | + rx2 = rx + cos(a)*len * DegreeToRadian(0.15f); | |
| 1765 | + ry2 = ry + sin(a)*len * DegreeToRadian(0.15f); | |
| 1743 | 1766 | } |
| 1744 | 1767 | else{ |
| 1745 | 1768 | //そのまま攻撃力へ反映 |
| 1746 | 1769 | attacks = ParamData.attacks; |
| 1770 | + | |
| 1771 | + //発射誤差はそのまま | |
| 1772 | + rx2 = rx; | |
| 1773 | + ry2 = ry; | |
| 1747 | 1774 | } |
| 1748 | 1775 | |
| 1749 | 1776 | //発射する未使用のオブジェクトを取得 |
| 1750 | 1777 | newbullet = GetNewBulletObject(); |
| 1751 | - if( newbullet == NULL ){ break; } | |
| 1778 | + if( newbullet == NULL ){ return 0; } | |
| 1752 | 1779 | |
| 1753 | 1780 | //銃弾を発射 |
| 1754 | - newbullet->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx, ry); | |
| 1781 | + newbullet->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx2, ry2); | |
| 1755 | 1782 | newbullet->SetParamData(attacks, ParamData.penetration, ParamData.speed * BULLET_SPEEDSCALE, teamid, human_id, true); |
| 1756 | 1783 | newbullet->SetEnableFlag(true); |
| 1757 | 1784 |
| @@ -1758,27 +1785,23 @@ | ||
| 1758 | 1785 | //対人判定用リスト初期化 |
| 1759 | 1786 | BulletObj_HumanIndex[ GetBulletObjectID(newbullet) ].Init(); |
| 1760 | 1787 | } |
| 1761 | - else{ | |
| 1762 | - //発射する未使用のオブジェクトを取得 | |
| 1763 | - newgrenade = GetNewGrenadeObject(); | |
| 1764 | - if( newgrenade == NULL ){ break; } | |
| 1765 | 1788 | |
| 1766 | - //手榴弾発射 | |
| 1767 | - newgrenade->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx, ry); | |
| 1768 | - newgrenade->SetParamData(8.0f, human_id, true); | |
| 1769 | - newgrenade->SetEnableFlag(true); | |
| 1770 | - } | |
| 1771 | - | |
| 1772 | - //誤差を加算(ショットガン用) | |
| 1773 | - ErrorRange += ParamData.ErrorRangeMIN; | |
| 1774 | - } | |
| 1775 | - | |
| 1776 | - //手榴弾でなければ | |
| 1777 | - if( grenadeflag == false ){ | |
| 1778 | 1789 | //発砲フラグを設定 |
| 1779 | 1790 | Human_ShotFlag[human_id] = true; |
| 1780 | 1791 | } |
| 1792 | + else{ | |
| 1793 | + class grenade* newgrenade; | |
| 1781 | 1794 | |
| 1795 | + //発射する未使用のオブジェクトを取得 | |
| 1796 | + newgrenade = GetNewGrenadeObject(); | |
| 1797 | + if( newgrenade == NULL ){ return 0; } | |
| 1798 | + | |
| 1799 | + //手榴弾発射 | |
| 1800 | + newgrenade->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx, ry); | |
| 1801 | + newgrenade->SetParamData(8.0f, human_id, true); | |
| 1802 | + newgrenade->SetEnableFlag(true); | |
| 1803 | + } | |
| 1804 | + | |
| 1782 | 1805 | if( ParamData.soundvolume > 0 ){ |
| 1783 | 1806 | //銃声を再生 |
| 1784 | 1807 | GameSound->ShotWeapon(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, weapon_paramid, teamid, playerflag); |