• 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

Revision179 (tree)
Time2017-06-18 16:46:47
Authorxops-mikan

Log Message

AIが攻撃を受けた方向を向くよう改良、死亡した際に倒れる方向を制御するように

Change Summary

Incremental Difference

--- trunk/ai.cpp (revision 178)
+++ trunk/ai.cpp (revision 179)
@@ -45,6 +45,8 @@
4545 battlemode = AI_NORMAL;
4646 cautionback_posx = 0.0f;
4747 cautionback_posz = 0.0f;
48+ FaceCaution_flag = false;
49+ FaceCaution_rx = 0.0f;
4850 total_move = 0.0f;
4951 waitcnt = 0;
5052 movejumpcnt = 1*((int)GAMEFPS);
@@ -380,6 +382,31 @@
380382 int pointmode;
381383 MoveNavi->GetTargetPos(NULL, NULL, &target_rx, NULL, &pointmode);
382384
385+ //撃たれて警戒したなら、撃たれた方向を向く
386+ if( (battlemode == AI_CAUTION)&&(FaceCaution_flag == true) ){
387+ float tr;
388+
389+ //方向を計算
390+ tr = FaceCaution_rx - rx;
391+ for(; tr > (float)M_PI; tr -= (float)M_PI*2){}
392+ for(; tr < (float)M_PI*-1; tr += (float)M_PI*2){}
393+
394+ //旋回
395+ if( tr > DegreeToRadian(2.5f) ){
396+ ObjDriver->SetModeFlag(AI_CTRL_TURNRIGHT);
397+ }
398+ if( tr < DegreeToRadian(-2.5f) ){
399+ ObjDriver->SetModeFlag(AI_CTRL_TURNLEFT);
400+ }
401+
402+ //特定方向に向き終われば、普通の警戒に移行する
403+ if( fabs(tr) <= DegreeToRadian(2.5f) ){
404+ FaceCaution_flag = false;
405+ }
406+
407+ return;
408+ }
409+
383410 //回転の開始・終了確率を設定
384411 if( battlemode == AI_ACTION ){
385412 return;
@@ -1475,6 +1502,8 @@
14751502 else{
14761503 newbattlemode = AI_CAUTION;
14771504 cautioncnt = 160;
1505+ FaceCaution_flag = false;
1506+ FaceCaution_rx = 0.0f;
14781507 }
14791508 }
14801509
@@ -1491,6 +1520,7 @@
14911520 bool AIcontrol::CautionMain()
14921521 {
14931522 int newbattlemode = AI_CAUTION;
1523+ float caution_rx;
14941524
14951525 //座標とチーム番号を取得
14961526 int teamid;
@@ -1497,7 +1527,7 @@
14971527 ctrlhuman->GetParamData(NULL, NULL, NULL, &teamid);
14981528
14991529 //被弾と音の状況を取得
1500- bool HitFlag = ctrlhuman->CheckHit();
1530+ bool HitFlag = ctrlhuman->CheckHit(&caution_rx);
15011531 soundlist soundlist[MAX_SOUNDMGR_LIST];
15021532 int soundlists = GameSound->GetWorldSound(posx, posy + VIEW_HEIGHT, posz, teamid, soundlist);
15031533
@@ -1511,13 +1541,18 @@
15111541 newbattlemode = AI_ACTION;
15121542 actioncnt = 0;
15131543 }
1514- else if( SearchEnemy() != 0 ){ //敵が見つかれば
1544+ else if( SearchEnemy() != 0 ){ //敵が見つかれば
15151545 newbattlemode = AI_ACTION;
15161546 actioncnt = 0;
15171547 }
1518- else if( (HitFlag == true)||(soundlists > 0) ){ //被弾したか音が聞こえた
1519- cautioncnt = 160; //警戒を再開
1548+ else if( HitFlag == true ){ //被弾した
1549+ cautioncnt = 160; //警戒を再開
1550+ FaceCaution_flag = true;
1551+ FaceCaution_rx = caution_rx;
15201552 }
1553+ else if( soundlists > 0 ){ //音が聞こえた
1554+ cautioncnt = 160; //警戒を再開
1555+ }
15211556 else if( cautioncnt == 0 ){ //警戒を終了するなら
15221557 if( CheckTargetPos(true) == false ){ //警戒開始地点より離れているか
15231558 MoveTarget(true); //警戒開始地点に近づく
@@ -1524,6 +1559,8 @@
15241559 }
15251560 else{
15261561 newbattlemode = AI_NORMAL;
1562+ FaceCaution_flag = false;
1563+ FaceCaution_rx = 0.0f;
15271564
15281565 //警戒待ちパスなら次へ進める
15291566 pointdata pdata;
@@ -1534,7 +1571,7 @@
15341571 }
15351572 }
15361573 }
1537- else if( cautioncnt < 100 ){ //100フレームを切ったら、ランダムに警戒終了(カウント:0に)
1574+ else if( (cautioncnt < 100)&&(FaceCaution_flag == false) ){ //100フレームを切ったら、ランダムに警戒終了(カウント:0に)
15381575 if( GetRand(50) == 0 ){ cautioncnt = 0; }
15391576 }
15401577 else{ cautioncnt -= 1; }
@@ -1569,6 +1606,7 @@
15691606 bool AIcontrol::NormalMain()
15701607 {
15711608 int newbattlemode = AI_NORMAL;
1609+ float caution_rx;
15721610
15731611 MoveNavi->MovePathNowState();
15741612 enemyhuman = NULL;
@@ -1578,7 +1616,7 @@
15781616 ctrlhuman->GetParamData(NULL, NULL, NULL, &teamid);
15791617
15801618 //被弾と音の状況を取得
1581- bool HitFlag = ctrlhuman->CheckHit();
1619+ bool HitFlag = ctrlhuman->CheckHit(&caution_rx);
15821620 soundlist soundlist[MAX_SOUNDMGR_LIST];
15831621 int soundlists = GameSound->GetWorldSound(posx, posy + VIEW_HEIGHT, posz, teamid, soundlist);
15841622
@@ -1614,9 +1652,17 @@
16141652 }
16151653 else{ //優先的な走り以外の処理
16161654 //警戒判定に入る処理
1617- if(
1618- (SearchEnemy() != 0)|| //敵を見つけた
1619- (HitFlag == true)||(soundlists > 0)|| //被弾したか音が聞こえた
1655+ if( HitFlag == true ){ //被弾した
1656+ newbattlemode = AI_CAUTION;
1657+ cautioncnt = 160;
1658+ cautionback_posx = posx;
1659+ cautionback_posz = posz;
1660+ FaceCaution_flag = true;
1661+ FaceCaution_rx = caution_rx;
1662+ }
1663+ else if(
1664+ (SearchEnemy() != 0)|| //敵を見つけた
1665+ (soundlists > 0)|| //音が聞こえた
16201666 (CheckCorpse( GetRand(MAX_HUMAN) ) == true) //死体を見つけた
16211667 ){
16221668 newbattlemode = AI_CAUTION;
@@ -1623,6 +1669,8 @@
16231669 cautioncnt = 160;
16241670 cautionback_posx = posx;
16251671 cautionback_posz = posz;
1672+ FaceCaution_flag = false;
1673+ FaceCaution_rx = 0.0f;
16261674 }
16271675 else{
16281676 MovePath(); //移動実行
@@ -1657,6 +1705,8 @@
16571705 NoFight = false;
16581706 battlemode = AI_NORMAL;
16591707 enemyhuman = NULL;
1708+ FaceCaution_flag = false;
1709+ FaceCaution_rx = 0.0f;
16601710 waitcnt = 0;
16611711 gotocnt = 0;
16621712 cautioncnt = 0;
@@ -1710,6 +1760,8 @@
17101760 }
17111761 battlemode = AI_CAUTION;
17121762 cautioncnt = 160;
1763+ FaceCaution_flag = false;
1764+ FaceCaution_rx = 0.0f;
17131765 }
17141766
17151767 //! @brief 非戦闘化フラグを設定
--- trunk/ai.h (revision 178)
+++ trunk/ai.h (revision 179)
@@ -75,6 +75,8 @@
7575 float ry; //!< Y軸回転角度
7676 float cautionback_posx; //!< 警戒後に戻るX座標
7777 float cautionback_posz; //!< 警戒後に戻るZ座標
78+ bool FaceCaution_flag; //!< 警戒中に特定の報告を向くフラグ
79+ float FaceCaution_rx; //!< 警戒中に向く方向
7880 float total_move; //!< 合計移動量
7981 int waitcnt; //!< 時間待ちカウント
8082 int movejumpcnt; //!< ジャンプ判定カウント
--- trunk/gamemain.cpp (revision 178)
+++ trunk/gamemain.cpp (revision 179)
@@ -1965,7 +1965,7 @@
19651965 }
19661966
19671967 //ダメージを受けていれば、レッドフラッシュを描画する
1968- redflash_flag = myHuman->CheckHit();
1968+ redflash_flag = myHuman->CheckHit(NULL);
19691969
19701970 //-----------------------------------
19711971
--- trunk/object.cpp (revision 178)
+++ trunk/object.cpp (revision 179)
@@ -201,6 +201,7 @@
201201 MoveFlag_lt = MoveFlag;
202202 scopemode = 0;
203203 HitFlag = false;
204+ Hit_rx = 0.0f;
204205 totalmove = 0.0f;
205206 StateGunsightErrorRange = 0;
206207 ReactionGunsightErrorRange = 0;
@@ -265,6 +266,7 @@
265266 MoveFlag_lt = MoveFlag;
266267 scopemode = 0;
267268 HitFlag = false;
269+ Hit_rx = 0.0f;
268270 totalmove = 0.0f;
269271 Invincible = false;
270272
@@ -884,18 +886,23 @@
884886 }
885887
886888 //! @brief 被弾フラグをセット
887-void human::SetHitFlag()
889+//! @param rx 被弾した方向
890+void human::SetHitFlag(float rx)
888891 {
889892 HitFlag = true;
893+ Hit_rx = rx;
890894 }
891895
892896 //! @brief 被弾したかチェックする
897+//! @param rx 被弾した方向を受け取るポインタ(NULL可)
893898 //! @return 被弾した:true 被弾してない:false
894899 //! @attention 実行すると、フラグは false に初期化されます。
895-bool human::CheckHit()
900+bool human::CheckHit(float *rx)
896901 {
897902 bool returnflag = HitFlag;
903+ if( rx != NULL ){ *rx = Hit_rx; }
898904 HitFlag = false;
905+ //Hit_rx = 0.0f;
899906 return returnflag;
900907 }
901908
@@ -985,8 +992,15 @@
985992
986993 if( deadstate == 0 ){
987994 if( hp <= 0 ){ //HPが 0 以下になった(死亡した)瞬間なら、倒し始める
995+ float tr;
996+
997+ //最後に攻撃を受けた方向を計算
998+ tr = Hit_rx - rotation_x;
999+ for(; tr > (float)M_PI; tr -= (float)M_PI*2){}
1000+ for(; tr < (float)M_PI*-1; tr += (float)M_PI*2){}
1001+
9881002 //体の角度
989- if( GetRand(2) == 0 ){
1003+ if( ((float)M_PI/2*-1 < tr)&&(tr < (float)M_PI/2) ){
9901004 add_ry = HUMAN_DEADADDRY;
9911005 }
9921006 else{
--- trunk/object.h (revision 178)
+++ trunk/object.h (revision 179)
@@ -149,6 +149,7 @@
149149 int MoveFlag_lt; //!< (前回の)移動方向を表すフラグ
150150 int scopemode; //!< スコープ使用モード
151151 bool HitFlag; //!< 被弾を表すフラグ
152+ float Hit_rx; //!< 被弾した方向
152153 float totalmove; //!< 合計移動量
153154 int StateGunsightErrorRange; //!< 照準の状態誤差
154155 int ReactionGunsightErrorRange; //!< 照準の反動誤差
@@ -205,8 +206,8 @@
205206 virtual void HitBulletLeg(int attacks);
206207 virtual void HitZombieAttack();
207208 virtual void HitGrenadeExplosion(int attacks);
208- virtual void SetHitFlag();
209- virtual bool CheckHit();
209+ virtual void SetHitFlag(float rx);
210+ virtual bool CheckHit(float *rx);
210211 virtual float GetTotalMove();
211212 virtual int RunFrame(class Collision *CollD, class BlockDataInterface *inblockdata, bool AddCollisionFlag, bool player, bool F5mode);
212213 virtual int GetGunsightErrorRange();
--- trunk/objectmanager.cpp (revision 178)
+++ trunk/objectmanager.cpp (revision 179)
@@ -950,10 +950,10 @@
950950 }
951951
952952 if( flag == true ){
953- HumanIndex[HitHuman_id].SetHitFlag();
953+ HumanIndex[HitHuman_id].SetHitFlag(brx*-1 - (float)M_PI/2);
954954 }
955955 #else
956- HumanIndex[HitHuman_id].SetHitFlag();
956+ HumanIndex[HitHuman_id].SetHitFlag(brx*-1 - (float)M_PI/2);
957957 #endif
958958
959959 //ロボットかどうか判定
@@ -1099,23 +1099,6 @@
10991099
11001100 HumanIndex[i].GetParamData(NULL, NULL, NULL, &HitHuman_TeamID);
11011101
1102-#ifdef ENABLE_BUG_TEAMID
1103- bool flag = true;
1104-
1105- //チーム番号が負数、かつチーム番号が大きいなら、フラグ無効
1106- if( (HitHuman_TeamID < 0)&&(teamid < 0) ){
1107- if( HitHuman_TeamID < teamid ){
1108- flag = false;
1109- }
1110- }
1111-
1112- if( flag == true ){
1113- HumanIndex[i].SetHitFlag();
1114- }
1115-#else
1116- HumanIndex[i].SetHitFlag();
1117-#endif
1118-
11191102 float y2;
11201103 float arx, ary;
11211104
@@ -1143,6 +1126,23 @@
11431126 ary = 0.0f;
11441127 }
11451128
1129+#ifdef ENABLE_BUG_TEAMID
1130+ bool flag = true;
1131+
1132+ //チーム番号が負数、かつチーム番号が大きいなら、フラグ無効
1133+ if( (HitHuman_TeamID < 0)&&(teamid < 0) ){
1134+ if( HitHuman_TeamID < teamid ){
1135+ flag = false;
1136+ }
1137+ }
1138+
1139+ if( flag == true ){
1140+ HumanIndex[i].SetHitFlag(arx*-1 + (float)M_PI/2);
1141+ }
1142+#else
1143+ HumanIndex[i].SetHitFlag(arx*-1 + (float)M_PI/2);
1144+#endif
1145+
11461146 //爆風による風圧
11471147 HumanIndex[i].AddPosOrder(arx, ary, 2.2f/MAX_DAMAGE_GRENADE_DISTANCE * (MAX_DAMAGE_GRENADE_DISTANCE - sqrt(x*x + y*y + z*z)));
11481148
@@ -2254,7 +2254,9 @@
22542254
22552255 int MyHuman_dataID, MyHuman_TeamID;
22562256 int EnemyHuman_dataID, EnemyHuman_TeamID;
2257+ float mx, my, mz;
22572258 float tx, ty, tz;
2259+ float arx;
22582260 int paramid;
22592261 HumanParameter Paraminfo;
22602262 bool NotRobot;
@@ -2263,9 +2265,13 @@
22632265 MyHuman->GetParamData(NULL, &MyHuman_dataID, NULL, &MyHuman_TeamID);
22642266 EnemyHuman->GetParamData(NULL, &EnemyHuman_dataID, NULL, &EnemyHuman_TeamID);
22652267
2268+ MyHuman->GetPosData(&mx, &my, &mz, NULL);
22662269 EnemyHuman->GetPosData(&tx, &ty, &tz, NULL);
22672270 ty += VIEW_HEIGHT;
22682271
2272+ //敵が攻撃を受けた角度を求める
2273+ arx = atan2(mz - tz, mx - tx);
2274+
22692275 //ロボットかどうか判定
22702276 EnemyHuman->GetParamData(&paramid, NULL, NULL, NULL);
22712277 GameParamInfo->GetHuman(paramid, &Paraminfo);
@@ -2290,10 +2296,10 @@
22902296 }
22912297
22922298 if( flag == true ){
2293- EnemyHuman->SetHitFlag();
2299+ EnemyHuman->SetHitFlag(arx*-1 + (float)M_PI/2);
22942300 }
22952301 #else
2296- EnemyHuman->SetHitFlag();
2302+ EnemyHuman->SetHitFlag(arx*-1 + (float)M_PI/2);
22972303 #endif
22982304
22992305 //エフェクト(血)を描画