X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 263 (tree) |
|---|---|
| Time | 2021-02-21 10:55:18 |
| Author | |
人とマップの当たり判定でブロック面の判定処理を改良、コメントを追加
| @@ -1524,10 +1524,13 @@ | ||
| 1524 | 1524 | int cnt = 0; |
| 1525 | 1525 | float ang = atan2(move_z, move_x); |
| 1526 | 1526 | |
| 1527 | + //落下 | |
| 1527 | 1528 | pos_y += move_y*0.33f; |
| 1528 | 1529 | |
| 1529 | 1530 | if( player == true ){ |
| 1530 | 1531 | cnt = 0; |
| 1532 | + | |
| 1533 | + //4方向判定 No.1 | |
| 1531 | 1534 | if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.15f, pos_y - 0.5f, pos_z + sin(ang)*0.15f) == true ){ cnt += 1; } |
| 1532 | 1535 | if( CollD->CheckALLBlockInside(pos_x - cos(ang)*0.15f, pos_y - 0.5f, pos_z - sin(ang)*0.15f) == true ){ cnt += 1; } |
| 1533 | 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; } |
| @@ -1534,6 +1537,7 @@ | ||
| 1534 | 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; } |
| 1535 | 1538 | if( cnt == 4 ){ FallFlag = true; break; } |
| 1536 | 1539 | |
| 1540 | + //4方向判定 No.2 | |
| 1537 | 1541 | if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.5f, pos_y - 0.5f, pos_z + sin(ang)*0.5f) == true ){ cnt += 1; } |
| 1538 | 1542 | if( CollD->CheckALLBlockInside(pos_x - cos(ang)*0.5f, pos_y - 0.5f, pos_z - sin(ang)*0.5f) == true ){ cnt += 1; } |
| 1539 | 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; } |
| @@ -1541,7 +1545,10 @@ | ||
| 1541 | 1545 | if( cnt == 4 ){ FallFlag = true; break; } |
| 1542 | 1546 | } |
| 1543 | 1547 | else{ |
| 1548 | + //真下判定 | |
| 1544 | 1549 | if( CollD->CheckALLBlockInside(pos_x, pos_y - 0.5f, pos_z) == true ){ FallFlag = true; break; } |
| 1550 | + | |
| 1551 | + //外側へ0.3だけ外して判定 | |
| 1545 | 1552 | if( CollD->CheckALLBlockInside(pos_x + cos(ang)*0.3f, pos_y - 0.5f, pos_z + sin(ang)*0.3f) == true ){ FallFlag = true; break; } |
| 1546 | 1553 | } |
| 1547 | 1554 |
| @@ -1552,6 +1559,7 @@ | ||
| 1552 | 1559 | move_y_flag = true; |
| 1553 | 1560 | } |
| 1554 | 1561 | |
| 1562 | + //地面に接地している場合の処理 | |
| 1555 | 1563 | if( FallFlag == true ){ |
| 1556 | 1564 | int id, face; |
| 1557 | 1565 | struct blockdata bdata; |
| @@ -1653,7 +1661,6 @@ | ||
| 1653 | 1661 | |
| 1654 | 1662 | float px2, py2, pz2; |
| 1655 | 1663 | float vx, vy, vz; |
| 1656 | - float speed; | |
| 1657 | 1664 | float dist; |
| 1658 | 1665 | int id, face; |
| 1659 | 1666 | float face_vx, face_vy, face_vz, face_angle, face_angle_per; |
| @@ -1663,14 +1670,6 @@ | ||
| 1663 | 1670 | py2 = *py; |
| 1664 | 1671 | pz2 = *pz; |
| 1665 | 1672 | |
| 1666 | - //追突したブロック面取得 | |
| 1667 | - vx = in_vx - px_old; | |
| 1668 | - vy = in_vy - py_old; | |
| 1669 | - vz = in_vz - pz_old; | |
| 1670 | - speed = VectorNormalization(&vx, &vy, &vz); | |
| 1671 | - if( CollD->CheckALLBlockIntersectDummyRay(px_old, py_old, pz_old, vx, vy, vz, NULL, NULL, &dist, speed) == false ){ return false; } | |
| 1672 | - if( CollD->CheckALLBlockIntersectRay(px_old, py_old, pz_old, vx, vy, vz, &id, &face, &dist, speed) == false ){ return false; } | |
| 1673 | - | |
| 1674 | 1673 | //現在の移動ベクトルと距離算出 |
| 1675 | 1674 | vx = *px - px_old; |
| 1676 | 1675 | vy = *py - py_old; |
| @@ -1677,6 +1676,10 @@ | ||
| 1677 | 1676 | vz = *pz - pz_old; |
| 1678 | 1677 | dist = VectorNormalization(&vx, &vy, &vz); |
| 1679 | 1678 | |
| 1679 | + //追突したブロック面取得 | |
| 1680 | + if( CollD->CheckALLBlockIntersectDummyRay(in_vx - vx, in_vy - vy, in_vz - vz, vx, vy, vz, NULL, NULL, &temp, dist) == false ){ return false; } | |
| 1681 | + if( CollD->CheckALLBlockIntersectRay(in_vx - vx, in_vy - vy, in_vz - vz, vx, vy, vz, &id, &face, &temp, dist) == false ){ return false; } | |
| 1682 | + | |
| 1680 | 1683 | //ブロックに沿って移動するベクトルと進入角度を求める |
| 1681 | 1684 | if( CollD->ScratchAngleVector(id, face, vx, vy, vz, &vx, &vy, &vz, &face_angle) == false ){ return false; } |
| 1682 | 1685 |