点と線の交差判定を使って当たり判定のコードです。このコードは地面に居る時は正方形の下側のX軸判定を無効かすることによって左右に動いた時地面の一番端に補正されないようにしています。
困っているのは空中でp->isGround == false の時に壁とぶつかった時にどっちの軸に補正するかどうかの処理のアルゴリズムの実装に困っています。
提示画像Aの時にY軸が上昇中かまたは下降中でXが左右に動いているときX軸だけ修正したい。
提示画像のBの時 Y軸が修正中でXが移動しているかしていないときにY軸だけ修正したい
提示画像Cの時にX軸が移動してるかしないときでもy軸だけ修正したい。
この三つのアルゴリズムを実装したいです。一つずつは作れますが条件分岐するときにA,B,Cもすべて同じ方向を向く時がるため方向を使った修正は無理だと考えお手上げです。
/*地面に着いているときの処理*/ if(p->isGround == true){ float Fix_x_up = -1; float Fix_x_down = -1; float Fix_y_left = -1; float Fix_y_right = -1; /* X 軸 */ Position now_x_up(p->pos->x + ((p->CELL / 2) - 1), p->pos->y); Position future_x_up((p->pos->x + ((p->CELL / 2) - 1)) + offset_x, p->pos->y); Position now_x_down(p->pos->x + ((p->CELL / 2) - 1), (p->pos->y + (p->CELL - 1))); Position future_x_down((p->pos->x + ((p->CELL / 2) - 1)) + offset_x, (p->pos->y + (p->CELL - 1))); DrawFormatString(400, 400, GetColor(255, 255, 255), "Collisition",true); int r = cross_pos(&Result, now_x_up, future_x_up, Position((mp->get_X() + mp->size_width) + ( (mp->size_width / 2) - 1), mp->get_Y() + mp->size_height), Position((mp->get_X() + mp->size_width) + ((mp->size_width / 2) - 1), (mp->get_Y() + mp->size_height ) - 1 )); if( r != 0) { NoCol_x = false; DrawFormatString(400, 400, GetColor(255, 255, 255), "now_x_up", true); if(p->speed->x > 0){ Fix_x_up = Result->x - ( (p->CELL - 1) + (p->CELL /2) ); }else if(p->speed->x < 0) { Fix_x_up = Result->x + (p->CELL / 2) + 1; } delete(Result); Result = NULL; } /* r = cross_pos(&Result, now_x_down, future_x_down,Position((mp->get_X() + mp->size_width) + ((mp->size_width / 2) - 1), mp->get_Y() + mp->size_height), Position((mp->get_X() + mp->size_width) + ((mp->size_width / 2) - 1), (mp->get_Y() + mp->size_height) - 1)); if (r != 0) { NoCol_x = false; DrawFormatString(400, 500, GetColor(255, 255, 255), "now_x_down", true); if (p->speed->x > 0) { Fix_x_down = Result->x - ((p->CELL - 1) + (p->CELL / 2)); //Fix_x_down = now_x_down.x; }else if (p->speed->x < 0) { Fix_x_down = Result->x + (p->CELL / 2) + 1; //Fix_x_down = now_x_down.x; } delete(Result); Result = NULL; } /* /*X 補正*/ if (Fix_x_up != -1 || Fix_x_down != -1) { if (p->speed->x > 0)/*右*/ { if (Fix_x_up == -1) { p->pos->x = Fix_x_down; } else if(Fix_x_down == -1) { p->pos->x = Fix_x_up; } else { if (Fix_x_up < Fix_x_down) { p->pos->x = Fix_x_up; } else { p->pos->x = Fix_x_down; } } } else if (p->speed->x < 0)/*左*/ { if (Fix_x_up == -1) { p->pos->x = Fix_x_down; } else if (Fix_x_down == -1) { p->pos->x = Fix_x_up; } else { if (Fix_x_up < Fix_x_down) { p->pos->x = Fix_x_down; } else { p->pos->x = Fix_x_up; } } } } /*********************************************** Y軸 *************************************************************************************/ /* Y 軸 値設定*/ Position now_y_left(p->pos->x, p->pos->y + ((p->CELL / 2) - 1)); Position future_y_left(p->pos->x, (p->pos->y + (p->CELL / 2) - 1) + offset_y); Position now_y_right(p->pos->x + (p->CELL - 1), p->pos->y + ((p->CELL / 2) - 1)); Position future_y_right(p->pos->x + (p->CELL - 1), (p->pos->y + (p->CELL / 2) - 1) + offset_y); ofs << "left: " <<future_y_left.y << std::endl; ofs << "right: " <<future_y_right.y << std::endl; r = cross_pos(&Result,now_y_left,future_y_left, Position(mp->get_X(), mp->get_Y() + (mp->size_height / 2) - 1), Position(mp->get_X() + ((mp->size_width) - 1), mp->get_Y() + (mp->size_height / 2) - 1)); if(r != 0) { NoCol_y = false; DrawFormatString(350, 600, GetColor(255, 255, 255), "now_y_left", true); // ofs<<"y_col left"<<std::endl; /*落下*/ if (p->speed->y > 0) { Fix_y_left = (Result->y - ((p->CELL) + ((p->CELL / 2)) - 1)); //ofs << Fix_y_left->y << std::endl; // p->speed->y = 0; /* 補正座標がおかしくなってる書き間違てた。 */ p->isGround = true; p->isJump = false; } /*ジャンプ*/ else if (p->speed->y < 0) { //p->speed->y = 0; Fix_y_left = (Result->y + (p->CELL / 2) + 1); ofs<<Fix_y_left<<std::endl; } delete(Result); Result = NULL; } r = cross_pos(&Result, now_y_right, future_y_right, Position(mp->get_X(), mp->get_Y() + (mp->size_height / 2) - 1), Position(mp->get_X() + (mp->size_width - 1), mp->get_Y() + (mp->size_height / 2) - 1)); if (r != 0) { // ofs << "y_col right" << std::endl; NoCol_y = false; DrawFormatString(350, 300, GetColor(255, 255, 255), "now_y_right", true); /*ジャンプ*/ if(p->speed->y < 0) { Fix_y_right = (Result->y + (p->CELL / 2) + 1); ofs << Fix_y_right << std::endl; // p->speed->y = 0; /*落下*/ }else if (p->speed->y > 0) { // p->speed->y = 0; Fix_y_right = (Result->y - ((p->CELL) + ((p->CELL / 2)) - 1)); p->isGround = true; p->isJump = false; // ofs << Fix_y_right->y << std::endl; } } /* Y 補正 */ if(Fix_y_left != -1 || Fix_y_right != -1) { /*落下*/ if(p->speed->y > 0){ p->speed->y = 0; ofs<<"GGG"<<std::endl; if(Fix_y_left == -1) { p->pos->y = Fix_y_right; }else if(Fix_y_right == -1) { p->pos->y = Fix_y_left; }else{ if(Fix_y_left < Fix_y_right) { p->pos->y = Fix_y_left; }else{ p->pos->y = Fix_y_right; } } /*ジャンプ */ }else if (p->speed->y < 0) { p->speed->y = 0; if (Fix_y_left == -1) { p->pos->y = Fix_y_right; } else if (Fix_y_right == -1) { p->pos->y = Fix_y_left; } else { if (Fix_y_left < Fix_y_right) { p->pos->y = Fix_y_right; } else { p->pos->y = Fix_y_left; } } } } }else if(p->isGround == false )/*空中で上からぶつかった時*/ { /* NOTE */ }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/21 02:51
退会済みユーザー
2020/02/21 03:02 編集
2020/02/21 03:06
2020/02/21 03:18
退会済みユーザー
2020/02/22 03:24
2020/02/24 02:19