• 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

Revision130 (tree)
Time2016-05-28 14:07:23
Authorxops-mikan

Log Message

人とマップの当たり判定を軽量化

Change Summary

Incremental Difference

--- trunk/object.cpp (revision 129)
+++ trunk/object.cpp (revision 130)
@@ -1348,25 +1348,33 @@
13481348
13491349 //腰付近を当たり判定
13501350 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);
13531353
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);
13591360
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 ){
13631364 CollD->ScratchVector(i, surface, move_x, vy, move_z, &move_x, &vy, &move_z);
13641365 }
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+ }
13691372 }
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+ }
13701378 }
13711379 }
13721380 }