X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
リビジョン | 349 (tree) |
---|---|
日時 | 2023-02-04 17:26:37 |
作者 | ![]() |
人とマップの当たり判定を修正、無敵状態でも落下ダメージを受けるバグの修正
@@ -32,7 +32,7 @@ | ||
32 | 32 | #ifndef COLLISION_H |
33 | 33 | #define COLLISION_H |
34 | 34 | |
35 | -#define COLLISION_ADDSIZE 0.1f //!< 当たり判定範囲の加算量 | |
35 | +#define COLLISION_ADDSIZE 0.01f //!< 当たり判定範囲の加算量 | |
36 | 36 | |
37 | 37 | #ifndef H_LAYERLEVEL |
38 | 38 | #define H_LAYERLEVEL 2 //!< Select include file. |
@@ -1778,10 +1778,11 @@ | ||
1778 | 1778 | |
1779 | 1779 | if( move_y < HUMAN_MAPCOLLISION_GROUND_HEIGHT ){ move_y_landing = true; } |
1780 | 1780 | |
1781 | - //落下ダメージを与える | |
1782 | - if( move_y < HUMAN_DAMAGE_MINSPEED ){ | |
1783 | - //hp -= GetRand(6) + (int)( fabsf(move_y + HUMAN_DAMAGE_MINSPEED)*37.5f ); | |
1784 | - hp -= GetRand(6) + (int)((float)HUMAN_DAMAGE_MAXFALL / fabsf(HUMAN_DAMAGE_MAXSPEED - (HUMAN_DAMAGE_MINSPEED)) * fabsf(move_y - (HUMAN_DAMAGE_MINSPEED))); | |
1781 | + if( Invincible == false ){ | |
1782 | + //落下ダメージを与える | |
1783 | + if( move_y < HUMAN_DAMAGE_MINSPEED ){ | |
1784 | + hp -= GetRand(6) + (int)((float)HUMAN_DAMAGE_MAXFALL / fabsf(HUMAN_DAMAGE_MAXSPEED - (HUMAN_DAMAGE_MINSPEED)) * fabsf(move_y - (HUMAN_DAMAGE_MINSPEED))); | |
1785 | + } | |
1785 | 1786 | } |
1786 | 1787 | |
1787 | 1788 | move_y = 0.0f; |
@@ -1898,6 +1899,14 @@ | ||
1898 | 1899 | float face_vx, face_vy, face_vz, face_angle, face_angle_per; |
1899 | 1900 | float temp; |
1900 | 1901 | |
1902 | + //メモ: | |
1903 | + //OpenXOPSの当たり判定は、計算誤差を吸収するため僅かに大きめにブロックを判定している。 | |
1904 | + //そのため、足元のブロックのつなぎ目で引っ掛かる場合が生じる。 | |
1905 | + //対策として、足元の判定(mode 0x00 通常)の場合は、判定するY座標を補正する。 | |
1906 | + if( mode == 0 ){ | |
1907 | + in_vy += COLLISION_ADDSIZE; | |
1908 | + } | |
1909 | + | |
1901 | 1910 | px2 = *px; |
1902 | 1911 | py2 = *py; |
1903 | 1912 | pz2 = *pz; |
@@ -1910,12 +1919,12 @@ | ||
1910 | 1919 | |
1911 | 1920 | //AABBを作る |
1912 | 1921 | float rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z; |
1913 | - GetAABBRay(in_vx - vx, in_vy - vy, in_vz - vz, vx, vy, vz, dist, &rmin_x, &rmin_y, &rmin_z, &rmax_x, &rmax_y, &rmax_z); | |
1922 | + GetAABBRay(in_vx - vx*dist, in_vy - vy*dist, in_vz - vz*dist, vx, vy, vz, dist, &rmin_x, &rmin_y, &rmin_z, &rmax_x, &rmax_y, &rmax_z); | |
1914 | 1923 | |
1915 | 1924 | //追突したブロック面取得 |
1916 | 1925 | face = -1; |
1917 | 1926 | if( CollD->CheckBlockAABB(blockid, rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z) == false ){ return false; } |
1918 | - if( CollD->CheckBlockIntersectRay(blockid, in_vx - vx, in_vy - vy, in_vz - vz, vx, vy, vz, &face, &temp, dist) == false ){ return false; } | |
1927 | + if( CollD->CheckBlockIntersectRay(blockid, in_vx - vx*dist, in_vy - vy*dist, in_vz - vz*dist, vx, vy, vz, &face, &temp, dist) == false ){ return false; } | |
1919 | 1928 | |
1920 | 1929 | //ブロックの面に対するベクトルのなす角を求める |
1921 | 1930 | if( CollD->AngleVector2(blockid, face, vx, vy, vz, &face_angle) == false ){ return false; } |