• 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

Revision264 (tree)
Time2021-02-23 18:04:24
Authorxops-mikan

Log Message

人とマップの当たり判定にて頭部の計算を修正、当たり判定の一部数値を定数化。

Change Summary

Incremental Difference

--- trunk/object.cpp (revision 263)
+++ trunk/object.cpp (revision 264)
@@ -1445,7 +1445,7 @@
14451445 if( (speed != 0.0f)||(move_y != 0.0f) ){
14461446
14471447 //頭部で当たり判定
1448- if( CollisionBlockScratch(CollD, inblockdata, &pos_x, &pos_y, &pos_z, pos_x2, pos_y2, pos_z2, pos_x, pos_y + HUMAN_HEIGHT, pos_z, 0x01) == true ){
1448+ if( CollisionBlockScratch(CollD, inblockdata, &pos_x, &pos_y, &pos_z, pos_x2, pos_y2, pos_z2, pos_x, pos_y + HUMAN_HEIGHT-0.22f, pos_z, 0x01) == true ){
14491449 if( move_y > 0.0f ){ move_y = 0.0f; }
14501450 }
14511451
@@ -1468,7 +1468,7 @@
14681468 if( move_y_upper == 0 ){
14691469 if(
14701470 (CollD->CheckALLBlockInside(pos_x + dist_x*2.0f, pos_y, pos_z + dist_z*2.0f) == true)&&
1471- (CollD->CheckALLBlockInside(pos_x + dist_x*2.0f, pos_y + 3.2f, pos_z + dist_z*2.0f) == false)
1471+ (CollD->CheckALLBlockInside(pos_x + dist_x*2.0f, pos_y + HUMAN_MAPCOLLISION_CLIMBHEIGHT, pos_z + dist_z*2.0f) == false)
14721472 ){
14731473 int id, face;
14741474 struct blockdata bdata;
@@ -1487,7 +1487,7 @@
14871487 }
14881488
14891489 if( flag == false ){
1490- pos_y += 0.4f;
1490+ pos_y += HUMAN_MAPCOLLISION_CLIMBADDY;
14911491 move_y *= 0.2f;
14921492 }
14931493 }
@@ -1497,7 +1497,7 @@
14971497 //移動先がブロックへめり込んでいるなら移動を無効にする
14981498 if(
14991499 (CollD->CheckALLBlockInside(pos_x, pos_y + 2.0f, pos_z) == true)||
1500- (CollD->CheckALLBlockIntersectRay(pos_x, pos_y + 2.0f, pos_z, 0.0f, 1.0f, 0.0f, NULL, NULL, &Dist, (18.0f-2.0f)) == true)
1500+ (CollD->CheckALLBlockIntersectRay(pos_x, pos_y + 2.0f, pos_z, 0.0f, 1.0f, 0.0f, NULL, NULL, &Dist, (HUMAN_HEIGHT-2.0f*2)) == true)
15011501 ){
15021502 pos_x = pos_x2;
15031503 pos_z = pos_z2;
@@ -1504,9 +1504,9 @@
15041504 }
15051505
15061506 //移動先がブロックにめり込む&移動先もめり込む ならば、移動を無効にする
1507- if( CollD->CheckALLBlockInside(pos_x, pos_y + 19.4f, pos_z) == true ){
1508- ////↓ここ怪しい
1509- if( CollD->CheckALLBlockInside(pos_x + move_x*0.2f, pos_y + 19.4f, pos_z + move_x*0.2f) == true ){
1507+ if( CollD->CheckALLBlockInside(pos_x, pos_y + HUMAN_HEIGHT-0.6f, pos_z) == true ){
1508+ //メモ:↓この判定怪しい。十分に遠い位置であれば良く、11倍である必要はない?
1509+ if( CollD->CheckALLBlockInside(pos_x + move_x*11.0f, pos_y + HUMAN_HEIGHT-0.6f, pos_z + move_z*11.0f) == true ){
15101510 pos_x = pos_x2;
15111511 pos_y = pos_y2;
15121512 pos_z = pos_z2;
@@ -1523,6 +1523,7 @@
15231523 for(int i=0; i<3; i++){
15241524 int cnt = 0;
15251525 float ang = atan2(move_z, move_x);
1526+ float x, y, z;
15261527
15271528 //落下
15281529 pos_y += move_y*0.33f;
@@ -1530,30 +1531,54 @@
15301531 if( player == true ){
15311532 cnt = 0;
15321533
1534+ y = pos_y + HUMAN_MAPCOLLISION_GROUND_HEIGHT;
1535+
15331536 //4方向判定 No.1
1534- if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.15f, pos_y - 0.5f, pos_z + sin(ang)*0.15f) == true ){ cnt += 1; }
1535- if( CollD->CheckALLBlockInside(pos_x - cos(ang)*0.15f, pos_y - 0.5f, pos_z - sin(ang)*0.15f) == true ){ cnt += 1; }
1536- if( CollD->CheckALLBlockInside(pos_x + cos(ang + (float)M_PI/2)*0.15f, pos_y - 0.5f, pos_z + sin(ang + (float)M_PI/2)*0.15f) == true ){ cnt += 1; }
1537- if( CollD->CheckALLBlockInside(pos_x + cos(ang - (float)M_PI/2)*0.15f, pos_y - 0.5f, pos_z + sin(ang - (float)M_PI/2)*0.15f) == true ){ cnt += 1; }
1537+ x = pos_x + cos(ang)*HUMAN_MAPCOLLISION_GROUND_R1;
1538+ z = pos_z + sin(ang)*HUMAN_MAPCOLLISION_GROUND_R1;
1539+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1540+ x = pos_x - cos(ang)*HUMAN_MAPCOLLISION_GROUND_R1;
1541+ z = pos_z - sin(ang)*HUMAN_MAPCOLLISION_GROUND_R1;
1542+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1543+ x = pos_x + cos(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R1;
1544+ z = pos_z + sin(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R1;
1545+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1546+ x = pos_x + cos(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R1;
1547+ z = pos_z + sin(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R1;
1548+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
15381549 if( cnt == 4 ){ FallFlag = true; break; }
15391550
15401551 //4方向判定 No.2
1541- if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.5f, pos_y - 0.5f, pos_z + sin(ang)*0.5f) == true ){ cnt += 1; }
1542- if( CollD->CheckALLBlockInside(pos_x - cos(ang)*0.5f, pos_y - 0.5f, pos_z - sin(ang)*0.5f) == true ){ cnt += 1; }
1543- if( CollD->CheckALLBlockInside(pos_x + cos(ang + (float)M_PI/2)*0.5f, pos_y - 0.5f, pos_z + sin(ang + (float)M_PI/2)*0.5f) == true ){ cnt += 1; }
1544- if( CollD->CheckALLBlockInside(pos_x + cos(ang - (float)M_PI/2)*0.5f, pos_y - 0.5f, pos_z + sin(ang - (float)M_PI/2)*0.5f) == true ){ cnt += 1; }
1552+ x = pos_x + cos(ang)*HUMAN_MAPCOLLISION_GROUND_R2;
1553+ z = pos_z + sin(ang)*HUMAN_MAPCOLLISION_GROUND_R2;
1554+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1555+ x = pos_x - cos(ang)*HUMAN_MAPCOLLISION_GROUND_R2;
1556+ z = pos_z - sin(ang)*HUMAN_MAPCOLLISION_GROUND_R2;
1557+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1558+ x = pos_x + cos(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R2;
1559+ z = pos_z + sin(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R2;
1560+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
1561+ x = pos_x + cos(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R2;
1562+ z = pos_z + sin(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_GROUND_R2;
1563+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ cnt += 1; }
15451564 if( cnt == 4 ){ FallFlag = true; break; }
15461565 }
15471566 else{
1567+ y = pos_y + HUMAN_MAPCOLLISION_GROUND_HEIGHT;
1568+
15481569 //真下判定
1549- if( CollD->CheckALLBlockInside(pos_x, pos_y - 0.5f, pos_z) == true ){ FallFlag = true; break; }
1570+ x = pos_x;
1571+ z = pos_z;
1572+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ FallFlag = true; break; }
15501573
1551- //外側へ0.3だけ外して判定
1552- if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.3f, pos_y - 0.5f, pos_z + sin(ang)*0.3f) == true ){ FallFlag = true; break; }
1574+ //外側へ少し外して判定
1575+ x = pos_x + cos(ang)*HUMAN_MAPCOLLISION_GROUND_R3;
1576+ z = pos_z + sin(ang)*HUMAN_MAPCOLLISION_GROUND_R3;
1577+ if( CollD->CheckALLBlockInside(x, y, z) == true ){ FallFlag = true; break; }
15531578 }
15541579
15551580 //落下速度加算
1556- move_y -= 0.066f;
1581+ move_y -= HUMAN_DAMAGE_SPEED;
15571582 if( move_y < HUMAN_DAMAGE_MAXSPEED ){ move_y = HUMAN_DAMAGE_MAXSPEED; }
15581583
15591584 move_y_flag = true;
@@ -1620,7 +1645,7 @@
16201645 speed = sqrt((move_x*2)*(move_x*2) + (move_z*2)*(move_z*2));
16211646
16221647 //明らかに移動量がおかしいならば元に戻す
1623- if( (sqrt(dist_x*dist_x + dist_y*dist_y + dist_z*dist_z) > 12.0f)||(Dist - speed > 1.0f) ){
1648+ if( (sqrt(dist_x*dist_x + dist_y*dist_y + dist_z*dist_z) > HUMAN_MAPCOLLISION_CHECK_MAXDIST)||(Dist - speed > 1.0f) ){
16241649 pos_x = pos_x2;
16251650 pos_y = pos_y2;
16261651 pos_z = pos_z2;
@@ -1629,10 +1654,10 @@
16291654 if( player == true ){
16301655 speed = sqrt(dist_x*dist_x + dist_y*dist_y + dist_z*dist_z);
16311656
1632- //移動先との間にブロックがあるならば元に戻す(目線ぐらいの高さで判定)
1657+ //移動先との間にブロックがあるならば元に戻す
16331658 if(
1634- (CollD->CheckALLBlockInside(pos_x2, pos_y2 + 17.0f, pos_z2) == true)||
1635- (CollD->CheckALLBlockIntersectRay(pos_x2, pos_y2 + 17.0f, pos_z2, dist_x/speed, dist_y/speed, dist_z/speed, NULL, NULL, &Dist, speed) == true)
1659+ (CollD->CheckALLBlockInside(pos_x2, pos_y2 + HUMAN_MAPCOLLISION_CHECK_HEIGHT, pos_z2) == true)||
1660+ (CollD->CheckALLBlockIntersectRay(pos_x2, pos_y2 + HUMAN_MAPCOLLISION_CHECK_HEIGHT, pos_z2, dist_x/speed, dist_y/speed, dist_z/speed, NULL, NULL, &Dist, speed) == true)
16361661 ){
16371662 pos_x = pos_x2;
16381663 pos_y = pos_y2;
--- trunk/object.h (revision 263)
+++ trunk/object.h (revision 264)
@@ -51,7 +51,7 @@
5151 #define HUMAN_DAMAGE_LEG 0.7f //!< 弾が 下半身 に当たった場合のダメージ倍率
5252 #define HUMAN_DAMAGE_ZOMBIEU 15 //!< ゾンビの攻撃を受けた場合の最低ダメージ
5353 #define HUMAN_DAMAGE_ZOMBIEA 5 //!< ゾンビの攻撃を受けた場合の追加ダメージ量
54-#define HUMAN_DAMAGE_SPEED (0.066f + 0.132f) //!< 落下量
54+#define HUMAN_DAMAGE_SPEED 0.066f //!< 落下量
5555 #define HUMAN_DAMAGE_MINSPEED -3.8f //!< 落下によりダメージを受けない速度
5656 #define HUMAN_DAMAGE_MAXSPEED -7.0f //!< 最大落下速度
5757 #define HUMAN_DAMAGE_MAXFALL 120 //!< 落下による最大ダメージ
@@ -75,7 +75,14 @@
7575 #define HUMAN_MAPCOLLISION_ADD_HEIGHT_A 9.0f //!< 人とマップの当たり判定 追加分 高さ(注:標準マップ SCHOOL に合わせる)
7676 #define HUMAN_MAPCOLLISION_ADD_HEIGHT_B 13.0f //!< 人とマップの当たり判定 追加分 高さ(注:標準マップ SCHOOL に合わせる)
7777 #define HUMAN_MAPCOLLISION_SLOPEANGLE DegreeToRadian(50) //!< 人とマップの当たり判定 登れない斜面の角度
78-#define HUMAN_MAPCOLLISION_SLOPEFORCEANGLE DegreeToRadian(22.62f) //!< 人とマップの当たり判定 登れない斜面が人を押し出す角度
78+#define HUMAN_MAPCOLLISION_CLIMBHEIGHT 3.2f //!< 人とマップの当たり判定 登れる高さ
79+#define HUMAN_MAPCOLLISION_CLIMBADDY 0.4f //!< 人とマップの当たり判定 1フレームで登る高さ
80+#define HUMAN_MAPCOLLISION_GROUND_HEIGHT -0.5f //!< 人とマップの当たり判定 地面判定 高さ
81+#define HUMAN_MAPCOLLISION_GROUND_R1 0.15f //!< 人とマップの当たり判定 地面判定 半径(1)
82+#define HUMAN_MAPCOLLISION_GROUND_R2 0.50f //!< 人とマップの当たり判定 地面判定 半径(2)
83+#define HUMAN_MAPCOLLISION_GROUND_R3 0.30f //!< 人とマップの当たり判定 地面判定 半径(3)
84+#define HUMAN_MAPCOLLISION_CHECK_MAXDIST 12.0f //!< 人とマップの当たり判定 1フレームで移動する最大距離
85+#define HUMAN_MAPCOLLISION_CHECK_HEIGHT (HUMAN_HEIGHT-3.0f) //!< 人とマップの当たり判定 最終的な移動可否を判定する高さ(注:肩程度)
7986 #define HUMAN_DEADLINE -100.0f //!< 人が死亡するY座標(デッドライン)
8087 #define HUMAN_DEADADDRY DegreeToRadian(0.75f) //!< 死体の倒れる加速度
8188
--- trunk/objectmanager.cpp (revision 263)
+++ trunk/objectmanager.cpp (revision 264)
@@ -1065,7 +1065,7 @@
10651065 }
10661066
10671067 //頭に当たり判定
1068- y = hy + 18.0f - gy;
1068+ y = hy + (HUMAN_HEIGHT-2.0f) - gy;
10691069 r = sqrt(x*x + y*y + z*z);
10701070 //ブロックが遮っていなければ (レイで当たり判定を行い、当たっていなければ)
10711071 if( CollD->CheckALLBlockIntersectRay(gx, gy, gz, x/r, y/r, z/r, NULL, NULL, &dummy, r) == false ){