X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 214 (tree) |
|---|---|
| Time | 2018-12-09 16:37:09 |
| Author | |
銃弾の当たり判定を改良、発砲時の誤差計算を改良
| @@ -939,6 +939,33 @@ | ||
| 939 | 939 | return false; |
| 940 | 940 | } |
| 941 | 941 | |
| 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 | + | |
| 942 | 969 | //! @brief 球体とレイ(光線)の当たり判定 |
| 943 | 970 | //! @param s_x 球体のx座標 |
| 944 | 971 | //! @param s_y 球体のy座標 |
| @@ -1158,6 +1185,44 @@ | ||
| 1158 | 1185 | return false; |
| 1159 | 1186 | } |
| 1160 | 1187 | |
| 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 | + | |
| 1161 | 1226 | //! @brief 円柱とレイ(光線)の当たり判定 |
| 1162 | 1227 | //! @param c_x 円柱 底辺のx座標 |
| 1163 | 1228 | //! @param c_y 円柱 底辺のy座標 |
| @@ -88,8 +88,10 @@ | ||
| 88 | 88 | |
| 89 | 89 | 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); |
| 90 | 90 | 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); | |
| 91 | 92 | 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); |
| 92 | 93 | 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); | |
| 93 | 95 | 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); |
| 94 | 96 | 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); |
| 95 | 97 | bool Collide2DLine(int A1x, int A1y, int A2x, int A2y, int B1x, int B1y, int B2x, int B2y, int *out_x, int *out_y); |
| @@ -79,7 +79,7 @@ | ||
| 79 | 79 | #define HUMAN_DEADLINE -100.0f //!< 人が死亡するY座標(デッドライン) |
| 80 | 80 | #define HUMAN_DEADADDRY DegreeToRadian(0.75f) //!< 死体の倒れる加速度 |
| 81 | 81 | |
| 82 | -#define BULLET_SPEEDSCALE 3 //!< 弾速の倍率 | |
| 82 | +#define BULLET_SPEEDSCALE 2.5f //!< 弾速の倍率 | |
| 83 | 83 | #define BULLET_DESTROYFRAME 40 //!< 弾の消滅フレーム数 |
| 84 | 84 | #define GRENADE_DESTROYFRAME 100 //!< 手榴弾の爆発フレーム数 |
| 85 | 85 |
| @@ -651,19 +651,9 @@ | ||
| 651 | 651 | int humanid; |
| 652 | 652 | float ontargetcnt; |
| 653 | 653 | 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:ブロックあり判定済み | |
| 665 | 656 | |
| 666 | - int id, face; | |
| 667 | 657 | float Dist; |
| 668 | 658 | |
| 669 | 659 | //弾オブジェクトのデータ番号を取得 |
| @@ -676,39 +666,28 @@ | ||
| 676 | 666 | vy = sin(bry); |
| 677 | 667 | vz = sin(brx)*cos(bry); |
| 678 | 668 | |
| 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 | + } | |
| 681 | 673 | |
| 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); | |
| 684 | 676 | |
| 685 | - //貫通力が残っていなければ | |
| 677 | + // BULLET_SPEEDSCALE定数 の分解能で当たり判定 | |
| 678 | + for(int cnt=0; cnt<maxcnt; cnt++){ | |
| 679 | + //貫通力が残っていなければ弾は無効にする(判定 1回目) | |
| 686 | 680 | if( penetration < 0 ){ |
| 687 | - //弾は無効にする | |
| 688 | 681 | in_bullet->SetEnableFlag(false); |
| 682 | + mapflag = 0; | |
| 689 | 683 | break; |
| 690 | 684 | } |
| 691 | 685 | |
| 692 | 686 | 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; | |
| 696 | 690 | |
| 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 | - | |
| 712 | 691 | //人との当たり判定 |
| 713 | 692 | for(int i=0; i<MAX_HUMAN; i++){ |
| 714 | 693 | //その人自身が発砲した弾なら処理しない。 |
| @@ -733,30 +712,61 @@ | ||
| 733 | 712 | } |
| 734 | 713 | |
| 735 | 714 | //頭の当たり判定 |
| 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; | |
| 741 | 728 | } |
| 742 | 729 | |
| 743 | 730 | //上半身と当たり判定 |
| 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; | |
| 749 | 744 | } |
| 750 | 745 | |
| 751 | 746 | //足と当たり判定 |
| 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; | |
| 757 | 760 | } |
| 758 | 761 | } |
| 759 | 762 | |
| 763 | + //貫通力が残っていなければ弾は無効にする(判定 2回目) | |
| 764 | + if( penetration < 0 ){ | |
| 765 | + in_bullet->SetEnableFlag(false); | |
| 766 | + mapflag = 0; | |
| 767 | + break; | |
| 768 | + } | |
| 769 | + | |
| 760 | 770 | //小物との当たり判定 |
| 761 | 771 | for(int i=0; i<MAX_SMALLOBJECT; i++){ |
| 762 | 772 | //使用されていなければ処理しない |
| @@ -780,118 +790,56 @@ | ||
| 780 | 790 | } |
| 781 | 791 | |
| 782 | 792 | //当たり判定 |
| 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); | |
| 790 | 797 | |
| 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 )); | |
| 795 | 800 | |
| 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; | |
| 803 | 802 | } |
| 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; | |
| 816 | 803 | } |
| 817 | 804 | |
| 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); | |
| 822 | 810 | |
| 823 | - //対人判定用リスト設定 | |
| 824 | - BulletObj_HumanIndex[objectID].SetIndexFlag(HumanHead_id); | |
| 811 | + //攻撃力と貫通力を計算 | |
| 812 | + if( penetration > 0 ){ | |
| 813 | + attacks = (int)((float)attacks * 0.6f); | |
| 814 | + penetration -= 1; | |
| 815 | + } | |
| 825 | 816 | |
| 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 | + } | |
| 831 | 820 | } |
| 821 | + } | |
| 832 | 822 | |
| 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); | |
| 837 | 828 | |
| 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); | |
| 846 | 832 | } |
| 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); | |
| 861 | 835 | } |
| 862 | 836 | |
| 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 | + } | |
| 867 | 839 | |
| 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); | |
| 872 | 842 | |
| 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 | - | |
| 895 | 843 | return CollideFlag; |
| 896 | 844 | } |
| 897 | 845 |
| @@ -1951,14 +1899,9 @@ | ||
| 1951 | 1899 | if( GetRand(2) == 0 ){ ErrorRange_x *= -1; } |
| 1952 | 1900 | if( GetRand(2) == 0 ){ ErrorRange_y *= -1; } |
| 1953 | 1901 | |
| 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); | |
| 1962 | 1905 | } |
| 1963 | 1906 | |
| 1964 | 1907 | //手榴弾でなければ |
| @@ -2001,7 +1944,7 @@ | ||
| 2001 | 1944 | |
| 2002 | 1945 | //銃弾を発射 |
| 2003 | 1946 | 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); | |
| 2005 | 1948 | newbullet->SetEnableFlag(true); |
| 2006 | 1949 | |
| 2007 | 1950 | //対人判定用リスト初期化 |
| @@ -46,12 +46,12 @@ | ||
| 46 | 46 | |
| 47 | 47 | #define HUMAN_HUMANCOLLISION_R 2.5f //!< 人同士の当たり判定の半径 |
| 48 | 48 | |
| 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 //!< 足の当たり判定の半径 | |
| 55 | 55 | |
| 56 | 56 | #define SMALLOBJECT_COLLISIONSCALE 0.13f //!< 小物当たり判定の倍率 |
| 57 | 57 |