X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 130 (tree) |
|---|---|
| Time | 2016-05-28 14:07:23 |
| Author | |
人とマップの当たり判定を軽量化
| @@ -1348,25 +1348,33 @@ | ||
| 1348 | 1348 | |
| 1349 | 1349 | //腰付近を当たり判定 |
| 1350 | 1350 | for(int i=0; i<MAX_BLOCKS; i++){ |
| 1351 | - surface = -1; | |
| 1352 | - CollD->CheckBlockInside(i, pos_x, pos_y + HUMAN_MAPCOLLISION_HEIGTH, pos_z, false, &surface); | |
| 1351 | + float min_x, min_y, min_z, max_x, max_y, max_z; | |
| 1352 | + CollD->GetBlockPosMINMAX(i, &min_x, &min_y, &min_z, &max_x, &max_y, &max_z); | |
| 1353 | 1353 | |
| 1354 | - if( surface != -1 ){ | |
| 1355 | - //HUMAN_MAPCOLLISION_R 分の先を調べる | |
| 1356 | - 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 ){ | |
| 1357 | - CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z); | |
| 1358 | - } | |
| 1354 | + //腰付近をAABBで荒削り | |
| 1355 | + if( CollideBoxAABB(min_x, min_y, min_z, max_x, max_y, max_z, | |
| 1356 | + pos_x - HUMAN_MAPCOLLISION_R - 1.0f, pos_y + HUMAN_MAPCOLLISION_HEIGTH - 1.0f, pos_z - HUMAN_MAPCOLLISION_R - 1.0f, pos_x + HUMAN_MAPCOLLISION_R + 1.0f, pos_y + HUMAN_MAPCOLLISION_HEIGTH + 1.0f, pos_z + HUMAN_MAPCOLLISION_R + 1.0f) == true | |
| 1357 | + ){ | |
| 1358 | + surface = -1; | |
| 1359 | + CollD->CheckBlockInside(i, pos_x, pos_y + HUMAN_MAPCOLLISION_HEIGTH, pos_z, false, &surface); | |
| 1359 | 1360 | |
| 1360 | - //左右90度づつを調べる | |
| 1361 | - 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 ){ | |
| 1362 | - if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜 | |
| 1361 | + if( surface != -1 ){ | |
| 1362 | + //HUMAN_MAPCOLLISION_R 分の先を調べる | |
| 1363 | + 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 ){ | |
| 1363 | 1364 | CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z); |
| 1364 | 1365 | } |
| 1365 | - } | |
| 1366 | - 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 ){ | |
| 1367 | - if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜 | |
| 1368 | - CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z); | |
| 1366 | + | |
| 1367 | + //左右90度づつを調べる | |
| 1368 | + 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 ){ | |
| 1369 | + if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜 | |
| 1370 | + CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z); | |
| 1371 | + } | |
| 1369 | 1372 | } |
| 1373 | + 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 ){ | |
| 1374 | + if( CollD->CheckPolygonFrontRx(i, surface, ang) == true ){ //進行方向に対して表向きなら〜 | |
| 1375 | + CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z); | |
| 1376 | + } | |
| 1377 | + } | |
| 1370 | 1378 | } |
| 1371 | 1379 | } |
| 1372 | 1380 | } |