X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 264 (tree) |
|---|---|
| Time | 2021-02-23 18:04:24 |
| Author | |
人とマップの当たり判定にて頭部の計算を修正、当たり判定の一部数値を定数化。
| @@ -1445,7 +1445,7 @@ | ||
| 1445 | 1445 | if( (speed != 0.0f)||(move_y != 0.0f) ){ |
| 1446 | 1446 | |
| 1447 | 1447 | //頭部で当たり判定 |
| 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 ){ | |
| 1449 | 1449 | if( move_y > 0.0f ){ move_y = 0.0f; } |
| 1450 | 1450 | } |
| 1451 | 1451 |
| @@ -1468,7 +1468,7 @@ | ||
| 1468 | 1468 | if( move_y_upper == 0 ){ |
| 1469 | 1469 | if( |
| 1470 | 1470 | (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) | |
| 1472 | 1472 | ){ |
| 1473 | 1473 | int id, face; |
| 1474 | 1474 | struct blockdata bdata; |
| @@ -1487,7 +1487,7 @@ | ||
| 1487 | 1487 | } |
| 1488 | 1488 | |
| 1489 | 1489 | if( flag == false ){ |
| 1490 | - pos_y += 0.4f; | |
| 1490 | + pos_y += HUMAN_MAPCOLLISION_CLIMBADDY; | |
| 1491 | 1491 | move_y *= 0.2f; |
| 1492 | 1492 | } |
| 1493 | 1493 | } |
| @@ -1497,7 +1497,7 @@ | ||
| 1497 | 1497 | //移動先がブロックへめり込んでいるなら移動を無効にする |
| 1498 | 1498 | if( |
| 1499 | 1499 | (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) | |
| 1501 | 1501 | ){ |
| 1502 | 1502 | pos_x = pos_x2; |
| 1503 | 1503 | pos_z = pos_z2; |
| @@ -1504,9 +1504,9 @@ | ||
| 1504 | 1504 | } |
| 1505 | 1505 | |
| 1506 | 1506 | //移動先がブロックにめり込む&移動先もめり込む ならば、移動を無効にする |
| 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 ){ | |
| 1510 | 1510 | pos_x = pos_x2; |
| 1511 | 1511 | pos_y = pos_y2; |
| 1512 | 1512 | pos_z = pos_z2; |
| @@ -1523,6 +1523,7 @@ | ||
| 1523 | 1523 | for(int i=0; i<3; i++){ |
| 1524 | 1524 | int cnt = 0; |
| 1525 | 1525 | float ang = atan2(move_z, move_x); |
| 1526 | + float x, y, z; | |
| 1526 | 1527 | |
| 1527 | 1528 | //落下 |
| 1528 | 1529 | pos_y += move_y*0.33f; |
| @@ -1530,30 +1531,54 @@ | ||
| 1530 | 1531 | if( player == true ){ |
| 1531 | 1532 | cnt = 0; |
| 1532 | 1533 | |
| 1534 | + y = pos_y + HUMAN_MAPCOLLISION_GROUND_HEIGHT; | |
| 1535 | + | |
| 1533 | 1536 | //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; } | |
| 1538 | 1549 | if( cnt == 4 ){ FallFlag = true; break; } |
| 1539 | 1550 | |
| 1540 | 1551 | //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; } | |
| 1545 | 1564 | if( cnt == 4 ){ FallFlag = true; break; } |
| 1546 | 1565 | } |
| 1547 | 1566 | else{ |
| 1567 | + y = pos_y + HUMAN_MAPCOLLISION_GROUND_HEIGHT; | |
| 1568 | + | |
| 1548 | 1569 | //真下判定 |
| 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; } | |
| 1550 | 1573 | |
| 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; } | |
| 1553 | 1578 | } |
| 1554 | 1579 | |
| 1555 | 1580 | //落下速度加算 |
| 1556 | - move_y -= 0.066f; | |
| 1581 | + move_y -= HUMAN_DAMAGE_SPEED; | |
| 1557 | 1582 | if( move_y < HUMAN_DAMAGE_MAXSPEED ){ move_y = HUMAN_DAMAGE_MAXSPEED; } |
| 1558 | 1583 | |
| 1559 | 1584 | move_y_flag = true; |
| @@ -1620,7 +1645,7 @@ | ||
| 1620 | 1645 | speed = sqrt((move_x*2)*(move_x*2) + (move_z*2)*(move_z*2)); |
| 1621 | 1646 | |
| 1622 | 1647 | //明らかに移動量がおかしいならば元に戻す |
| 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) ){ | |
| 1624 | 1649 | pos_x = pos_x2; |
| 1625 | 1650 | pos_y = pos_y2; |
| 1626 | 1651 | pos_z = pos_z2; |
| @@ -1629,10 +1654,10 @@ | ||
| 1629 | 1654 | if( player == true ){ |
| 1630 | 1655 | speed = sqrt(dist_x*dist_x + dist_y*dist_y + dist_z*dist_z); |
| 1631 | 1656 | |
| 1632 | - //移動先との間にブロックがあるならば元に戻す(目線ぐらいの高さで判定) | |
| 1657 | + //移動先との間にブロックがあるならば元に戻す | |
| 1633 | 1658 | 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) | |
| 1636 | 1661 | ){ |
| 1637 | 1662 | pos_x = pos_x2; |
| 1638 | 1663 | pos_y = pos_y2; |
| @@ -51,7 +51,7 @@ | ||
| 51 | 51 | #define HUMAN_DAMAGE_LEG 0.7f //!< 弾が 下半身 に当たった場合のダメージ倍率 |
| 52 | 52 | #define HUMAN_DAMAGE_ZOMBIEU 15 //!< ゾンビの攻撃を受けた場合の最低ダメージ |
| 53 | 53 | #define HUMAN_DAMAGE_ZOMBIEA 5 //!< ゾンビの攻撃を受けた場合の追加ダメージ量 |
| 54 | -#define HUMAN_DAMAGE_SPEED (0.066f + 0.132f) //!< 落下量 | |
| 54 | +#define HUMAN_DAMAGE_SPEED 0.066f //!< 落下量 | |
| 55 | 55 | #define HUMAN_DAMAGE_MINSPEED -3.8f //!< 落下によりダメージを受けない速度 |
| 56 | 56 | #define HUMAN_DAMAGE_MAXSPEED -7.0f //!< 最大落下速度 |
| 57 | 57 | #define HUMAN_DAMAGE_MAXFALL 120 //!< 落下による最大ダメージ |
| @@ -75,7 +75,14 @@ | ||
| 75 | 75 | #define HUMAN_MAPCOLLISION_ADD_HEIGHT_A 9.0f //!< 人とマップの当たり判定 追加分 高さ(注:標準マップ SCHOOL に合わせる) |
| 76 | 76 | #define HUMAN_MAPCOLLISION_ADD_HEIGHT_B 13.0f //!< 人とマップの当たり判定 追加分 高さ(注:標準マップ SCHOOL に合わせる) |
| 77 | 77 | #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) //!< 人とマップの当たり判定 最終的な移動可否を判定する高さ(注:肩程度) | |
| 79 | 86 | #define HUMAN_DEADLINE -100.0f //!< 人が死亡するY座標(デッドライン) |
| 80 | 87 | #define HUMAN_DEADADDRY DegreeToRadian(0.75f) //!< 死体の倒れる加速度 |
| 81 | 88 |
| @@ -1065,7 +1065,7 @@ | ||
| 1065 | 1065 | } |
| 1066 | 1066 | |
| 1067 | 1067 | //頭に当たり判定 |
| 1068 | - y = hy + 18.0f - gy; | |
| 1068 | + y = hy + (HUMAN_HEIGHT-2.0f) - gy; | |
| 1069 | 1069 | r = sqrt(x*x + y*y + z*z); |
| 1070 | 1070 | //ブロックが遮っていなければ (レイで当たり判定を行い、当たっていなければ) |
| 1071 | 1071 | if( CollD->CheckALLBlockIntersectRay(gx, gy, gz, x/r, y/r, z/r, NULL, NULL, &dummy, r) == false ){ |