• R/O
  • SSH
  • HTTPS

コミット

よく使われているワード(クリックで追加)

javaandroidc++linuxc#windowsobjective-ccocoaqtpython誰得phprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

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


コミットメタ情報

リビジョン349 (tree)
日時2023-02-04 17:26:37
作者xops-mikan

ログメッセージ

人とマップの当たり判定を修正、無敵状態でも落下ダメージを受けるバグの修正

変更サマリ

差分

--- trunk/collision.h (revision 348)
+++ trunk/collision.h (revision 349)
@@ -32,7 +32,7 @@
3232 #ifndef COLLISION_H
3333 #define COLLISION_H
3434
35-#define COLLISION_ADDSIZE 0.1f //!< 当たり判定範囲の加算量
35+#define COLLISION_ADDSIZE 0.01f //!< 当たり判定範囲の加算量
3636
3737 #ifndef H_LAYERLEVEL
3838 #define H_LAYERLEVEL 2 //!< Select include file.
--- trunk/object.cpp (revision 348)
+++ trunk/object.cpp (revision 349)
@@ -1778,10 +1778,11 @@
17781778
17791779 if( move_y < HUMAN_MAPCOLLISION_GROUND_HEIGHT ){ move_y_landing = true; }
17801780
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+ }
17851786 }
17861787
17871788 move_y = 0.0f;
@@ -1898,6 +1899,14 @@
18981899 float face_vx, face_vy, face_vz, face_angle, face_angle_per;
18991900 float temp;
19001901
1902+ //メモ:
1903+ //OpenXOPSの当たり判定は、計算誤差を吸収するため僅かに大きめにブロックを判定している。
1904+ //そのため、足元のブロックのつなぎ目で引っ掛かる場合が生じる。
1905+ //対策として、足元の判定(mode 0x00 通常)の場合は、判定するY座標を補正する。
1906+ if( mode == 0 ){
1907+ in_vy += COLLISION_ADDSIZE;
1908+ }
1909+
19011910 px2 = *px;
19021911 py2 = *py;
19031912 pz2 = *pz;
@@ -1910,12 +1919,12 @@
19101919
19111920 //AABBを作る
19121921 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);
19141923
19151924 //追突したブロック面取得
19161925 face = -1;
19171926 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; }
19191928
19201929 //ブロックの面に対するベクトルのなす角を求める
19211930 if( CollD->AngleVector2(blockid, face, vx, vy, vz, &face_angle) == false ){ return false; }