• 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

Revision139 (tree)
Time2016-08-13 22:38:53
Authorxops-mikan

Log Message

人とマップのあたり判定を改善。人が立てない斜面への処理を改良。

Change Summary

Incremental Difference

--- trunk/object.h (revision 138)
+++ trunk/object.h (revision 139)
@@ -68,7 +68,7 @@
6868 #define HUMAN_MAPCOLLISION_R 5.0f //!< 人とマップの当たり判定 半径
6969 #define HUMAN_MAPCOLLISION_HEIGTH 10.2f //!< 人とマップの当たり判定 高さ(注:腰程度)
7070 #define HUMAN_MAPCOLLISION_SLOPEANGLE DegreeToRadian(50) //!< 人とマップの当たり判定 登れない斜面の角度
71-#define HUMAN_MAPCOLLISION_SLOPEFORCE 1.0f //!< 人とマップの当たり判定 登れない斜面が人を押し出す力
71+#define HUMAN_MAPCOLLISION_SLOPEFORCEANGLE DegreeToRadian(22.62f) //!< 人とマップの当たり判定 登れない斜面が人を押し出す角度
7272 #define HUMAN_DEADLINE -100.0f //!< 人が死亡するY座標(デッドライン)
7373 #define HUMAN_DEADADDRY DegreeToRadian(0.75f) //!< 死体の倒れる加速度
7474
--- trunk/object.cpp (revision 138)
+++ trunk/object.cpp (revision 139)
@@ -1284,6 +1284,8 @@
12841284 float Dist;
12851285 float FallDistance;
12861286 float offset;
1287+ float move_x2 = move_x;
1288+ float move_z2 = move_z;
12871289
12881290 //足元ギリギリは当たり判定から除外する
12891291 offset = 0.1f;
@@ -1335,9 +1337,20 @@
13351337 //地面と認めない (ジャンプ対策)
13361338 move_y_flag = true;
13371339
1340+ float angvx = atan2(bdata.material[face].vz, bdata.material[face].vx);
1341+ float angvy = acos(bdata.material[face].vy);
1342+
1343+ //押し出す力の決定
1344+ //y = -0.6*x*x + 1.9*x - 0.2
1345+ float force = -0.6f*angvy*angvy + 1.9f*angvy - 0.2f;
1346+
13381347 //押し出す
1339- move_x += bdata.material[face].vx * HUMAN_MAPCOLLISION_SLOPEFORCE;
1340- move_z += bdata.material[face].vz * HUMAN_MAPCOLLISION_SLOPEFORCE;
1348+ move_x = cos(angvx) * cos(HUMAN_MAPCOLLISION_SLOPEFORCEANGLE) * force;
1349+ move_y = sin(HUMAN_MAPCOLLISION_SLOPEFORCEANGLE) * force;
1350+ move_z = sin(angvx) * cos(HUMAN_MAPCOLLISION_SLOPEFORCEANGLE) * force;
1351+
1352+ move_x2 = move_x;
1353+ move_z2 = move_z;
13411354 }
13421355 else{
13431356 move_y_flag = false;
@@ -1359,9 +1372,9 @@
13591372 // 水平方向のあたり判定(移動)
13601373 //--------------------------------------------------
13611374
1362- if( (move_x*move_x + move_z*move_z) ){
1375+ if( (move_x2*move_x2 + move_z2*move_z2) ){
13631376 int surface;
1364- float ang = atan2(move_z, move_x);
1377+ float ang = atan2(move_z2, move_x2);
13651378 float newpos_x, newpos_y, newpos_z;
13661379
13671380 //腰付近を当たり判定
@@ -1379,18 +1392,18 @@
13791392 if( surface != -1 ){
13801393 //HUMAN_MAPCOLLISION_R 分の先を調べる
13811394 if( CollD->CheckBlockInside(i, pos_x + cos(ang)*HUMAN_MAPCOLLISION_R, pos_y + HUMAN_MAPCOLLISION_HEIGTH, pos_z + sin(ang)*HUMAN_MAPCOLLISION_R, true, NULL) == true ){
1382- CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z);
1395+ CollD->ScratchVector(i, surface, move_x2, vy, move_z2, &move_x2, &vy, &move_z2);
13831396 }
13841397
13851398 //左右90度づつを調べる
13861399 if( CollD->CheckBlockInside(i, pos_x + cos(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_R, pos_y + HUMAN_MAPCOLLISION_HEIGTH, pos_z + sin(ang + (float)M_PI/2)*HUMAN_MAPCOLLISION_R, true, NULL) == true ){
13871400 if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜
1388- CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z);
1401+ CollD->ScratchVector(i, surface, move_x2, vy, move_z2, &move_x2, &vy, &move_z2);
13891402 }
13901403 }
13911404 if( CollD->CheckBlockInside(i, pos_x + cos(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_R, pos_y + HUMAN_MAPCOLLISION_HEIGTH, pos_z + sin(ang - (float)M_PI/2)*HUMAN_MAPCOLLISION_R, true, NULL) == true ){
13921405 if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜
1393- CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z);
1406+ CollD->ScratchVector(i, surface, move_x2, vy, move_z2, &move_x2, &vy, &move_z2);
13941407 }
13951408 }
13961409 }
@@ -1398,8 +1411,8 @@
13981411 }
13991412
14001413 //進行方向を示すベクトルを算出
1401- vx = move_x;
1402- vz = move_z;
1414+ vx = move_x2;
1415+ vz = move_z2;
14031416 speed = sqrt(vx*vx + vz*vz);
14041417 if( speed > 0.0f ){
14051418 vx = vx / speed;
@@ -1409,7 +1422,7 @@
14091422 //頭を当たり判定
14101423 if( CollD->CheckALLBlockIntersectDummyRay(pos_x, pos_y + HUMAN_HEIGTH, pos_z, vx, 0, vz, NULL, NULL, &Dist, speed) == true ){
14111424 CollD->CheckALLBlockIntersectRay(pos_x, pos_y + FallDistance + HUMAN_HEIGTH, pos_z, vx, 0, vz, &id, &face, &Dist, speed);
1412- CollD->ScratchVector(id, face, move_x, vy, move_z, &move_x, &vy, &move_z);
1425+ CollD->ScratchVector(id, face, move_x2, vy, move_z2, &move_x2, &vy, &move_z2);
14131426 }
14141427
14151428 //足元がブロックに埋まっていなければ
@@ -1416,8 +1429,8 @@
14161429 if( CollD->CheckALLBlockInside(pos_x, pos_y + offset, pos_z) == false ){
14171430
14181431 //進行方向を示すベクトルを算出
1419- vx = move_x;
1420- vz = move_z;
1432+ vx = move_x2;
1433+ vz = move_z2;
14211434 speed = sqrt(vx*vx + vz*vz);
14221435 if( speed > 0.0f ){
14231436 vx = vx / speed;
@@ -1440,7 +1453,7 @@
14401453 }
14411454
14421455 //足元を当たり判定
1443- CollD->ScratchVector(id, face, move_x, vy, move_z, &move_x, &vy, &move_z);
1456+ CollD->ScratchVector(id, face, move_x2, vy, move_z2, &move_x2, &vy, &move_z2);
14441457 }
14451458 else{ //水平〜斜面なら
14461459 //地面と認めない (ジャンプ対策)
@@ -1447,9 +1460,9 @@
14471460 move_y_flag = true;
14481461
14491462 //移動先の位置を計算
1450- newpos_x = pos_x + move_x;
1463+ newpos_x = pos_x + move_x2;
14511464 newpos_y = pos_y + FallDistance;
1452- newpos_z = pos_z + move_z;
1465+ newpos_z = pos_z + move_z2;
14531466
14541467 //移動先の高さを調べる
14551468 if( CollD->CheckALLBlockInside(newpos_x, newpos_y + HUMAN_HEIGTH, newpos_z) == false ){
@@ -1464,7 +1477,9 @@
14641477 FallDistance = height;
14651478 }
14661479
1480+ //move_x2 = 0.0f;
14671481 move_y = 0.0f;
1482+ //move_z2 = 0.0f;
14681483 }
14691484 }
14701485 }
@@ -1472,9 +1487,9 @@
14721487 }
14731488
14741489 //移動先の位置を計算
1475- newpos_x = pos_x + move_x;
1490+ newpos_x = pos_x + move_x2;
14761491 newpos_y = pos_y + FallDistance;
1477- newpos_z = pos_z + move_z;
1492+ newpos_z = pos_z + move_z2;
14781493
14791494 //全身を改めて確認
14801495 if(
@@ -1482,16 +1497,15 @@
14821497 (CollD->CheckALLBlockIntersectRay(newpos_x, newpos_y + offset, newpos_z, 0, 1, 0, NULL, NULL, &Dist, HUMAN_HEIGTH - offset - 1.0f) == true)
14831498 ){
14841499 //めり込むなら移動しない
1485- move_x = 0.0f;
1486- move_z = 0.0f;
1500+ move_x2 = 0.0f;
1501+ move_z2 = 0.0f;
14871502 inside = true;
14881503 }
14891504 }
14901505
1491- *nowmove_x = move_x;
1492- *nowmove_z = move_z;
1493-
14941506 *FallDist = FallDistance;
1507+ *nowmove_x = move_x2;
1508+ *nowmove_z = move_z2;
14951509 return inside;
14961510 }
14971511