• 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

Revision214 (tree)
Time2018-12-09 16:37:09
Authorxops-mikan

Log Message

銃弾の当たり判定を改良、発砲時の誤差計算を改良

Change Summary

Incremental Difference

--- trunk/collision.cpp (revision 213)
+++ trunk/collision.cpp (revision 214)
@@ -939,6 +939,33 @@
939939 return false;
940940 }
941941
942+//! @brief 球体と点の当たり判定
943+//! @param s_x 球体のx座標
944+//! @param s_y 球体のy座標
945+//! @param s_z 球体のz座標
946+//! @param s_r 球体の半径
947+//! @param p_x X座標
948+//! @param p_y Y座標
949+//! @param p_z Z座標
950+//! @return 当たっている:true 当たっていない:false
951+bool CollideSphereInside(float s_x, float s_y, float s_z, float s_r, float p_x, float p_y, float p_z)
952+{
953+ float x, y, z, d;
954+
955+ //距離を算出
956+ x = s_x - p_x;
957+ y = s_y - p_y;
958+ z = s_z - p_z;
959+ d = x*x + y*y + z*z;
960+
961+ //距離が半径より近い
962+ if( d < s_r*s_r ){
963+ return true;
964+ }
965+
966+ return false;
967+}
968+
942969 //! @brief 球体とレイ(光線)の当たり判定
943970 //! @param s_x 球体のx座標
944971 //! @param s_y 球体のy座標
@@ -1158,6 +1185,44 @@
11581185 return false;
11591186 }
11601187
1188+//! @brief 円柱と点の当たり判定
1189+//! @param c_x 円柱 底辺のx座標
1190+//! @param c_y 円柱 底辺のy座標
1191+//! @param c_z 円柱 底辺のz座標
1192+//! @param c_r 円柱 の半径
1193+//! @param c_h 円柱 の高さ
1194+//! @param p_x X座標
1195+//! @param p_y Y座標
1196+//! @param p_z Z座標
1197+//! @return 当たっている:true 当たっていない:false
1198+bool CollideCylinderInside(float c_x, float c_y, float c_z, float c_r, float c_h, float p_x, float p_y, float p_z)
1199+{
1200+ float x, z, d;
1201+
1202+
1203+ // X-Z平面で円として処理する
1204+
1205+ //距離を算出
1206+ x = c_x - p_x;
1207+ z = c_z - p_z;
1208+ d = x*x + z*z;
1209+
1210+ //距離が半径より離れている時点で当たらない
1211+ if( d > c_r*c_r ){
1212+ return false;
1213+ }
1214+
1215+
1216+ //Y軸のみAABBと同様の処理
1217+
1218+ if( (c_y <= p_y)&&(p_y <= (c_y+c_h)) ){
1219+ //Y軸でも内側に入っていれば、当たっている
1220+ return true;
1221+ }
1222+
1223+ return false;
1224+}
1225+
11611226 //! @brief 円柱とレイ(光線)の当たり判定
11621227 //! @param c_x 円柱 底辺のx座標
11631228 //! @param c_y 円柱 底辺のy座標
--- trunk/collision.h (revision 213)
+++ trunk/collision.h (revision 214)
@@ -88,8 +88,10 @@
8888
8989 bool CollideBoxAABB(float box1_min_x, float box1_min_y, float box1_min_z, float box1_max_x, float box1_max_y, float box1_max_z, float box2_min_x, float box2_min_y, float box2_min_z, float box2_max_x, float box2_max_y, float box2_max_z);
9090 bool CollideCylinder(float c1_x, float c1_y, float c1_z, float c1_r, float c1_h, float c2_x, float c2_y, float c2_z, float c2_r, float c2_h, float *angle, float *length);
91+bool CollideSphereInside(float s_x, float s_y, float s_z, float s_r, float p_x, float p_y, float p_z);
9192 bool CollideSphereRay(float s_x, float s_y, float s_z, float s_r, float RayPos_x, float RayPos_y, float RayPos_z, float RayDir_x, float RayDir_y, float RayDir_z, float *Dist, float maxDist);
9293 bool CollideAABBRay(float box_min_x, float box_min_y, float box_min_z, float box_max_x, float box_max_y, float box_max_z, float RayPos_x, float RayPos_y, float RayPos_z, float RayDir_x, float RayDir_y, float RayDir_z, float *Dist, float maxDist);
94+bool CollideCylinderInside(float c_x, float c_y, float c_z, float c_r, float c_h, float p_x, float p_y, float p_z);
9395 bool CollideCylinderRay(float c_x, float c_y, float c_z, float c_r, float c_h, float RayPos_x, float RayPos_y, float RayPos_z, float RayDir_x, float RayDir_y, float RayDir_z, float *Dist, float maxDist);
9496 float DistancePosRay(float Pos_x, float Pos_y, float Pos_z, float RayPos_x, float RayPos_y, float RayPos_z, float RayDir_x, float RayDir_y, float RayDir_z);
9597 bool Collide2DLine(int A1x, int A1y, int A2x, int A2y, int B1x, int B1y, int B2x, int B2y, int *out_x, int *out_y);
--- trunk/object.h (revision 213)
+++ trunk/object.h (revision 214)
@@ -79,7 +79,7 @@
7979 #define HUMAN_DEADLINE -100.0f //!< 人が死亡するY座標(デッドライン)
8080 #define HUMAN_DEADADDRY DegreeToRadian(0.75f) //!< 死体の倒れる加速度
8181
82-#define BULLET_SPEEDSCALE 3 //!< 弾速の倍率
82+#define BULLET_SPEEDSCALE 2.5f //!< 弾速の倍率
8383 #define BULLET_DESTROYFRAME 40 //!< 弾の消滅フレーム数
8484 #define GRENADE_DESTROYFRAME 100 //!< 手榴弾の爆発フレーム数
8585
--- trunk/objectmanager.cpp (revision 213)
+++ trunk/objectmanager.cpp (revision 214)
@@ -651,19 +651,9 @@
651651 int humanid;
652652 float ontargetcnt;
653653 float vx, vy, vz;
654- int HumanHead_id;
655- int HumanUp_id;
656- int HumanLeg_id;
657- int SmallObject_id;
658- float map_Dist;
659- float HumanHead_Dist;
660- float HumanUp_Dist;
661- float HumanLeg_Dist;
662- float SmallObject_Dist;
663- float CheckDist;
664- bool CollideFlag;
654+ bool CollideFlag = false;
655+ int mapflag = 0; //0:ブロックなし、1:ブロックあり未判定、2:ブロックあり判定済み
665656
666- int id, face;
667657 float Dist;
668658
669659 //弾オブジェクトのデータ番号を取得
@@ -676,39 +666,28 @@
676666 vy = sin(bry);
677667 vz = sin(brx)*cos(bry);
678668
679- CheckDist = 0;
680- CollideFlag = false;
669+ //マップとの当たり判定(弾道上にブロックがあるか)
670+ if( CollD->CheckALLBlockIntersectRay(vx, by, bz, vx, vy, vz, NULL, NULL, &Dist, (float)speed) == true ){
671+ mapflag = 1;
672+ }
681673
682- for(float TotalDist=0.0f; TotalDist<speed; TotalDist+=CheckDist){
683- CheckDist = speed - TotalDist;
674+ // BULLET_SPEEDSCALE定数 の分解能を算出
675+ int maxcnt = (int)ceilf(speed / BULLET_SPEEDSCALE);
684676
685- //貫通力が残っていなければ
677+ // BULLET_SPEEDSCALE定数 の分解能で当たり判定
678+ for(int cnt=0; cnt<maxcnt; cnt++){
679+ //貫通力が残っていなければ弾は無効にする(判定 1回目)
686680 if( penetration < 0 ){
687- //弾は無効にする
688681 in_bullet->SetEnableFlag(false);
682+ mapflag = 0;
689683 break;
690684 }
691685
692686 float bvx, bvy, bvz;
693- bvx = bx + vx*TotalDist;
694- bvy = by + vy*TotalDist;
695- bvz = bz + vz*TotalDist;
687+ bvx = bx + vx * BULLET_SPEEDSCALE * cnt;
688+ bvy = by + vy * BULLET_SPEEDSCALE * cnt;
689+ bvz = bz + vz * BULLET_SPEEDSCALE * cnt;
696690
697- HumanHead_id = -1;
698- HumanUp_id = -1;
699- HumanLeg_id = -1;
700- SmallObject_id = -1;
701- map_Dist = (float)speed - TotalDist + 1;
702- HumanHead_Dist = (float)speed - TotalDist + 1;
703- HumanUp_Dist = (float)speed - TotalDist + 1;
704- HumanLeg_Dist = (float)speed - TotalDist + 1;
705- SmallObject_Dist = (float)speed - TotalDist + 1;
706-
707- //マップとの当たり判定
708- if( CollD->CheckALLBlockIntersectRay(bvx, bvy, bvz, vx, vy, vz, &id, &face, &Dist, (float)speed - TotalDist) == true ){
709- map_Dist = Dist;
710- }
711-
712691 //人との当たり判定
713692 for(int i=0; i<MAX_HUMAN; i++){
714693 //その人自身が発砲した弾なら処理しない。
@@ -733,30 +712,61 @@
733712 }
734713
735714 //頭の当たり判定
736- if( CollideCylinderRay(ox, oy + HUMAN_BULLETCOLLISION_LEG_H + HUMAN_BULLETCOLLISION_UP_H, oz, HUMAN_BULLETCOLLISION_HEAD_R, HUMAN_BULLETCOLLISION_HEAD_H, bvx, bvy, bvz, vx, vy, vz, &Dist, (float)speed - TotalDist) == true ){
737- if( Dist < HumanHead_Dist ){
738- HumanHead_id = i;
739- HumanHead_Dist = Dist;
740- }
715+ if( CollideCylinderInside(ox, oy + HUMAN_BULLETCOLLISION_LEG_H + HUMAN_BULLETCOLLISION_UP_H, oz, HUMAN_BULLETCOLLISION_HEAD_R, HUMAN_BULLETCOLLISION_HEAD_H, bvx, bvy, bvz) == true ){
716+ //人に当たった処理
717+ HitBulletHuman(i, 0, bvx, bvy, bvz, brx, attacks, humanid, ontargetcnt);
718+
719+ //対人判定用リスト設定(一度初期化し、最後に当たった人だけ設定)
720+ BulletObj_HumanIndex[objectID].Init();
721+ BulletObj_HumanIndex[objectID].SetIndexFlag(i);
722+
723+ //攻撃力と貫通力を計算
724+ attacks = (int)((float)attacks * 0.5f);
725+ penetration -= 1;
726+
727+ CollideFlag = true;
741728 }
742729
743730 //上半身と当たり判定
744- if( CollideCylinderRay(ox, oy + HUMAN_BULLETCOLLISION_LEG_H, oz, HUMAN_BULLETCOLLISION_UP_R, HUMAN_BULLETCOLLISION_UP_H, bvx, bvy, bvz, vx, vy, vz, &Dist, (float)speed - TotalDist) == true ){
745- if( Dist < HumanUp_Dist ){
746- HumanUp_id = i;
747- HumanUp_Dist = Dist;
748- }
731+ if( CollideCylinderInside(ox, oy + HUMAN_BULLETCOLLISION_LEG_H, oz, HUMAN_BULLETCOLLISION_UP_R, HUMAN_BULLETCOLLISION_UP_H, bvx, bvy, bvz) == true ){
732+ //人に当たった処理
733+ HitBulletHuman(i, 1, bvx, bvy, bvz, brx, attacks, humanid, ontargetcnt);
734+
735+ //対人判定用リスト設定(一度初期化し、最後に当たった人だけ設定)
736+ BulletObj_HumanIndex[objectID].Init();
737+ BulletObj_HumanIndex[objectID].SetIndexFlag(i);
738+
739+ //攻撃力と貫通力を計算
740+ attacks = (int)((float)attacks * 0.6f);
741+ penetration -= 1;
742+
743+ CollideFlag = true;
749744 }
750745
751746 //足と当たり判定
752- if( CollideCylinderRay(ox, oy, oz, HUMAN_BULLETCOLLISION_LEG_R, HUMAN_BULLETCOLLISION_LEG_H, bvx, bvy, bvz, vx, vy, vz, &Dist, (float)speed - TotalDist) == true ){
753- if( Dist < HumanLeg_Dist ){
754- HumanLeg_id = i;
755- HumanLeg_Dist = Dist;
756- }
747+ if( CollideCylinderInside(ox, oy, oz, HUMAN_BULLETCOLLISION_LEG_R, HUMAN_BULLETCOLLISION_LEG_H, bvx, bvy, bvz) == true ){
748+ //人に当たった処理
749+ HitBulletHuman(i, 2, bvx, bvy, bvz, brx, attacks, humanid, ontargetcnt);
750+
751+ //対人判定用リスト設定(一度初期化し、最後に当たった人だけ設定)
752+ BulletObj_HumanIndex[objectID].Init();
753+ BulletObj_HumanIndex[objectID].SetIndexFlag(i);
754+
755+ //攻撃力と貫通力を計算
756+ attacks = (int)((float)attacks * 0.7f);
757+ penetration -= 1;
758+
759+ CollideFlag = true;
757760 }
758761 }
759762
763+ //貫通力が残っていなければ弾は無効にする(判定 2回目)
764+ if( penetration < 0 ){
765+ in_bullet->SetEnableFlag(false);
766+ mapflag = 0;
767+ break;
768+ }
769+
760770 //小物との当たり判定
761771 for(int i=0; i<MAX_SMALLOBJECT; i++){
762772 //使用されていなければ処理しない
@@ -780,118 +790,56 @@
780790 }
781791
782792 //当たり判定
783- if( CollideSphereRay(ox, oy, oz, decide, bvx, bvy, bvz, vx, vy, vz, &Dist, (float)speed - TotalDist) == true ){
784- if( Dist < SmallObject_Dist ){
785- SmallObject_id = i;
786- SmallObject_Dist = Dist;
787- }
788- }
789- }
793+ if( CollideSphereInside(ox, oy, oz, decide, bvx, bvy, bvz) == true ){
794+ //小物に当たった処理
795+ int attack2 = (int)(floor( (float)attacks * 0.25f ));
796+ HitBulletSmallObject(i, bvx, bvy, bvz, attack2, teamid);
790797
791- //マップとの衝突距離が最短ならば〜
792- if( (map_Dist <= speed)&&(map_Dist < HumanHead_Dist)&&(map_Dist < HumanUp_Dist)&&(map_Dist < HumanLeg_Dist)&&(map_Dist < SmallObject_Dist) ){
793- //弾がマップに当たった処理
794- HitBulletMap(bx + vx*(map_Dist+TotalDist), by + vy*(map_Dist+TotalDist), bz + vz*(map_Dist+TotalDist), teamid);
798+ //攻撃力を計算
799+ attacks = (int)(floor( (float)attacks * 0.7f ));
795800
796- int Penetration_Dist;
797-
798- //マップにめり込んでいる量を調べる
799- //  最終地点がマップにめり込んでいるならば
800- if( CollD->CheckALLBlockIntersectRay(bx + vx*speed, by + vy*speed, bz + vz*speed, vx*-1, vy*-1, vz*-1, &id, &face, &Dist, (float)speed - map_Dist+TotalDist) == true ){
801- //発射地点と最終地点、それぞれからの激突点から貫通距離を求める
802- Penetration_Dist = (int)( ((float)speed - map_Dist+TotalDist - Dist) / 2 );
801+ CollideFlag = true;
803802 }
804- else{
805- //衝突点から最終地点まで移動距離
806- Penetration_Dist = (int)( ((float)speed - map_Dist+TotalDist) / 2 );
807- }
808-
809- //攻撃力と貫通力を計算
810- for(int i=0; i<Penetration_Dist; i++){
811- attacks = (int)((float)attacks * 0.6f);
812- }
813- penetration -= Penetration_Dist;
814-
815- CheckDist = map_Dist + 1.0f;
816803 }
817804
818- //人の頭との衝突距離が最短ならば〜
819- if( (HumanHead_Dist <= speed)&&(HumanHead_Dist < map_Dist)&&(HumanHead_Dist < HumanUp_Dist)&&(HumanHead_Dist < HumanLeg_Dist)&&(HumanHead_Dist < SmallObject_Dist) ){
820- //人に当たった処理
821- HitBulletHuman(HumanHead_id, 0, bx + vx*(HumanHead_Dist+TotalDist), by + vy*(HumanHead_Dist+TotalDist), bz + vz*(HumanHead_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
805+ if( mapflag > 0 ){
806+ //マップとの当たり判定
807+ if( CollD->CheckALLBlockInside(bvx, bvy, bvz) == true ){
808+ //弾がマップに当たった処理
809+ HitBulletMap(bvx, bvy, bvz, teamid);
822810
823- //対人判定用リスト設定
824- BulletObj_HumanIndex[objectID].SetIndexFlag(HumanHead_id);
811+ //攻撃力と貫通力を計算
812+ if( penetration > 0 ){
813+ attacks = (int)((float)attacks * 0.6f);
814+ penetration -= 1;
815+ }
825816
826- //攻撃力と貫通力を計算
827- attacks = (int)((float)attacks * 0.5f);
828- penetration -= 1;
829-
830- CheckDist = HumanHead_Dist + 1.0f;
817+ mapflag = 2;
818+ CollideFlag = true;
819+ }
831820 }
821+ }
832822
833- //人の上半身との衝突距離が最短ならば〜
834- if( (HumanUp_Dist <= speed)&&(HumanUp_Dist < map_Dist)&&(HumanUp_Dist < HumanHead_Dist)&&(HumanUp_Dist < HumanLeg_Dist)&&(HumanUp_Dist < SmallObject_Dist) ){
835- //人に当たった処理
836- HitBulletHuman(HumanUp_id, 1, bx + vx*(HumanUp_Dist+TotalDist), by + vy*(HumanUp_Dist+TotalDist), bz + vz*(HumanUp_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
823+ //弾道上にブロックがあるにも関わらず、ブロックと当たり判定を行っていないならば
824+ // (=薄いブロックがある)
825+ if( mapflag == 1 ){
826+ //弾がマップに当たった処理
827+ HitBulletMap(bx + vx*Dist, by + vy*Dist, bz + vz*Dist, teamid);
837828
838- //対人判定用リスト設定
839- BulletObj_HumanIndex[objectID].SetIndexFlag(HumanUp_id);
840-
841- //攻撃力と貫通力を計算
842- attacks = (int)((float)attacks * 0.6f);
843- penetration -= 1;
844-
845- CheckDist = HumanUp_Dist + 1.0f;
829+ //攻撃力を計算
830+ if( penetration > 0 ){
831+ attacks = (int)((float)attacks * 0.75f);
846832 }
847-
848- //人の足との衝突距離が最短ならば〜
849- if( (HumanLeg_Dist <= speed)&&(HumanLeg_Dist < map_Dist)&&(HumanLeg_Dist < HumanHead_Dist)&&(HumanLeg_Dist < HumanUp_Dist)&&(HumanLeg_Dist < SmallObject_Dist) ){
850- //人に当たった処理
851- HitBulletHuman(HumanLeg_id, 2, bx + vx*(HumanLeg_Dist+TotalDist), by + vy*(HumanLeg_Dist+TotalDist), bz + vz*(HumanLeg_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
852-
853- //対人判定用リスト設定
854- BulletObj_HumanIndex[objectID].SetIndexFlag(HumanLeg_id);
855-
856- //攻撃力と貫通力を計算
857- attacks = (int)((float)attacks * 0.7f);
858- penetration -= 1;
859-
860- CheckDist = HumanLeg_Dist + 1.0f;
833+ else{
834+ attacks = (int)((float)attacks * 0.55f);
861835 }
862836
863- //小物との衝突距離が最短ならば〜
864- if( (SmallObject_Dist <= speed)&&(SmallObject_Dist < map_Dist)&&(SmallObject_Dist < HumanHead_Dist)&&(SmallObject_Dist < HumanUp_Dist)&&(SmallObject_Dist < HumanLeg_Dist) ){
865- //小物に当たった処理
866- HitBulletSmallObject(SmallObject_id, bx + vx*(SmallObject_Dist+TotalDist), by + vy*(SmallObject_Dist+TotalDist), bz + vz*(SmallObject_Dist+TotalDist), attacks, teamid);
837+ CollideFlag = true;
838+ }
867839
868- //小物の種類番号を取得
869- int id;
870- int decide;
871- SmallObjectIndex[SmallObject_id].GetParamData(&id, NULL);
840+ //設定を適用(特に攻撃力・貫通力)
841+ in_bullet->SetParamData(attacks, penetration, speed, teamid, humanid, ontargetcnt, false);
872842
873- //当たり判定の大きさを取得
874- if( (TOTAL_PARAMETERINFO_SMALLOBJECT <= id)&&(id <= (TOTAL_PARAMETERINFO_SMALLOBJECT + MAX_ADDSMALLOBJECT -1)) ){
875- decide = (int)( (float)MIFdata->GetAddSmallobjectDecide(id - TOTAL_PARAMETERINFO_SMALLOBJECT)*SMALLOBJECT_COLLISIONSCALE );
876- }
877- else{
878- SmallObjectParameter Param;
879- GameParamInfo->GetSmallObject(id, &Param);
880- decide = (int)( (float)Param.decide*SMALLOBJECT_COLLISIONSCALE );
881- }
882-
883- //貫通力を計算
884- for(int i=0; i<decide; i++){
885- attacks = (int)((float)attacks * 0.7f);
886- }
887-
888- CheckDist = SmallObject_Dist + 1.0f;
889- }
890-
891- //設定を適用(特に攻撃力・貫通力)
892- in_bullet->SetParamData(attacks, penetration, speed, teamid, humanid, ontargetcnt, false);
893- }
894-
895843 return CollideFlag;
896844 }
897845
@@ -1951,14 +1899,9 @@
19511899 if( GetRand(2) == 0 ){ ErrorRange_x *= -1; }
19521900 if( GetRand(2) == 0 ){ ErrorRange_y *= -1; }
19531901
1954- //発射誤差の角度を求める
1955- float a, r;
1956- a = atan2((float)ErrorRange_y, (float)ErrorRange_x);
1957- r = sqrt((float)(ErrorRange_x*ErrorRange_x + ErrorRange_y*ErrorRange_y));
1958-
1959- //誤差分 角度に加算
1960- rx += cos(a)*r * DegreeToRadian(0.15f);
1961- ry += sin(a)*r * DegreeToRadian(0.15f);
1902+ //発射誤差分 角度に加算
1903+ rx += ErrorRange_x * DegreeToRadian(0.15f);
1904+ ry += ErrorRange_y * DegreeToRadian(0.15f);
19621905 }
19631906
19641907 //手榴弾でなければ
@@ -2001,7 +1944,7 @@
20011944
20021945 //銃弾を発射
20031946 newbullet->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx2, ry2);
2004- newbullet->SetParamData(attacks, ParamData.penetration, ParamData.speed * BULLET_SPEEDSCALE, teamid, human_id, ontargetcnt, true);
1947+ newbullet->SetParamData(attacks, ParamData.penetration, (int)((float)ParamData.speed * BULLET_SPEEDSCALE), teamid, human_id, ontargetcnt, true);
20051948 newbullet->SetEnableFlag(true);
20061949
20071950 //対人判定用リスト初期化
--- trunk/objectmanager.h (revision 213)
+++ trunk/objectmanager.h (revision 214)
@@ -46,12 +46,12 @@
4646
4747 #define HUMAN_HUMANCOLLISION_R 2.5f //!< 人同士の当たり判定の半径
4848
49-#define HUMAN_BULLETCOLLISION_HEAD_H 2.8f //!< 頭の当たり判定の高さ
50-#define HUMAN_BULLETCOLLISION_HEAD_R 1.3f //!< 頭の当たり判定の半径
51-#define HUMAN_BULLETCOLLISION_UP_H 7.5f //!< 上半身の当たり判定の高さ
52-#define HUMAN_BULLETCOLLISION_UP_R 2.5f //!< 上半身の当たり判定の半径
53-#define HUMAN_BULLETCOLLISION_LEG_H 10.0f //!< 足の当たり判定の高さ
54-#define HUMAN_BULLETCOLLISION_LEG_R 2.5f //!< 足の当たり判定の半径
49+#define HUMAN_BULLETCOLLISION_HEAD_H 2.9f //!< 頭の当たり判定の高さ
50+#define HUMAN_BULLETCOLLISION_HEAD_R 1.5f //!< 頭の当たり判定の半径
51+#define HUMAN_BULLETCOLLISION_UP_H 7.0f //!< 上半身の当たり判定の高さ
52+#define HUMAN_BULLETCOLLISION_UP_R 2.4f //!< 上半身の当たり判定の半径
53+#define HUMAN_BULLETCOLLISION_LEG_H 10.5f //!< 足の当たり判定の高さ
54+#define HUMAN_BULLETCOLLISION_LEG_R 2.6f //!< 足の当たり判定の半径
5555
5656 #define SMALLOBJECT_COLLISIONSCALE 0.13f //!< 小物当たり判定の倍率
5757