• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

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


Commit MetaInfo

Revision131 (tree)
Time2016-05-29 14:25:44
Authorxops-mikan

Log Message

発砲時の誤差計算を修正、ショットガンの発散パターンを改善。

Change Summary

Incremental Difference

--- trunk/objectmanager.cpp (revision 130)
+++ trunk/objectmanager.cpp (revision 131)
@@ -1706,34 +1706,50 @@
17061706 //武器の情報を取得
17071707 if( GameParamInfo->GetWeapon(weapon_paramid, &ParamData) != 0 ){ return 0; }
17081708
1709+ //手榴弾か判定
1710+ if( weapon_paramid == ID_WEAPON_GRENADE ){ grenadeflag = true; }
1711+ else{ grenadeflag = false; }
1712+
17091713 //誤差の範囲を計算
17101714 int ErrorRange;
17111715 ErrorRange = GunsightErrorRange;
17121716 if( ErrorRange < ParamData.ErrorRangeMIN ){ ErrorRange = ParamData.ErrorRangeMIN; }
17131717
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;
17171722
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; }
17201735
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));
17271740
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);
17331744
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++){
17361751 int attacks;
1752+ float rx2, ry2;
17371753
17381754 //(ショットガンなど)発射する弾が複数あれば
17391755 if( ParamData.burst > 1 ){
@@ -1740,18 +1756,29 @@
17401756 //1個の弾当たりの攻撃力を算出
17411757 //  全弾合わせて、攻撃力の2倍になるようにする。
17421758 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);
17431766 }
17441767 else{
17451768 //そのまま攻撃力へ反映
17461769 attacks = ParamData.attacks;
1770+
1771+ //発射誤差はそのまま
1772+ rx2 = rx;
1773+ ry2 = ry;
17471774 }
17481775
17491776 //発射する未使用のオブジェクトを取得
17501777 newbullet = GetNewBulletObject();
1751- if( newbullet == NULL ){ break; }
1778+ if( newbullet == NULL ){ return 0; }
17521779
17531780 //銃弾を発射
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);
17551782 newbullet->SetParamData(attacks, ParamData.penetration, ParamData.speed * BULLET_SPEEDSCALE, teamid, human_id, true);
17561783 newbullet->SetEnableFlag(true);
17571784
@@ -1758,27 +1785,23 @@
17581785 //対人判定用リスト初期化
17591786 BulletObj_HumanIndex[ GetBulletObjectID(newbullet) ].Init();
17601787 }
1761- else{
1762- //発射する未使用のオブジェクトを取得
1763- newgrenade = GetNewGrenadeObject();
1764- if( newgrenade == NULL ){ break; }
17651788
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 ){
17781789 //発砲フラグを設定
17791790 Human_ShotFlag[human_id] = true;
17801791 }
1792+ else{
1793+ class grenade* newgrenade;
17811794
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+
17821805 if( ParamData.soundvolume > 0 ){
17831806 //銃声を再生
17841807 GameSound->ShotWeapon(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, weapon_paramid, teamid, playerflag);