点と線の交差判定を使った当たり判定を実装したのですが提示画像の青色で囲ったところつまり天井ブロックとぶつかった時の処理を実装したいです。
条件としてはY軸にジャンプやらしてる時でX軸に移動している時つまり左右に移動しているときに青色で囲ったところに当たるとX軸が先に修正されてしまいぶつかったブロックの端に移動してしまうというバグをを修正したいです。タイトル通り下からブロックを叩いたということを認識できればその時にY軸だけ修正するというコードの実装することがで実現できると思うのですが....
質問1「動いた方向の逆方向に修正するコードはどうすれば実装できるのか手法が知りたい」
/*当たり判定処理 関数*/ void Game::Collision_Update() { /* NOTE プレイヤーの中心と当たり側の座標の中心で判定する。 */ Position *Result = NULL; float offset_x = 0; float offset_y = 0; bool NoCol_x = true; bool NoCol_y = true; /*移動方向によって異なる*/ if(p->speed->x > 0)//右 { offset_x = ( p->CELL + p->speed->x ); }else if (p->speed->x < 0)//左 { float t = (p->CELL) * - 1;//符号を逆にするマイナス offset_x = (t + p->speed->x); // ofs<<offset_x<<std::endl; }else{ offset_x = 0; } //if(action == keyState::Jump) if(p->speed->y < 0)/*ジャンプ*/ { float t = p->CELL * -1; offset_y = t + p->speed->y; ofs<<"offset_y: "<<offset_y<<std::endl; //}else if (action == keyState::Down) }else if (p->speed->y > 0) {/*落下*/ offset_y = ((p->CELL) + p->speed->y); //ofs<<offset_y <<std::endl; } /************************************************当たり判定***********************************************************************/ for (int y = 0; y < m->height; y++) { for (int x = 0;x < m->width; x++) { Mapchip *mp = m->isMapObject(x, y); if (mp != NULL) { 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 / 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 = (int)Result->x - ( (p->CELL - 1) + (p->CELL /2) ); }else if(p->speed->x < 0) { Fix_x_up = (int)Result->x + (p->CELL / 2) + 1; // Fix_x_up = Result->x + 1; } ofs << "pos_up : " << Fix_x_up << std::endl; delete(Result); Result = NULL; } /*地面に居ない時*/ if(p->isGround == false){ r = cross_pos(&Result, now_x_down, future_x_down, Position(mp->get_X() + ((mp->size_width / 2) - 1), mp->get_Y()), Position(mp->get_X() + ((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 = (int)Result->x - ((p->CELL - 1) + (p->CELL / 2)); //Fix_x_down = now_x_down.x; }else if (p->speed->x < 0) { Fix_x_down = (int)Result->x + (p->CELL / 2) + 1; //Fix_x_down = now_x_down.x; } ofs << "pos_down : " << Fix_x_down << std::endl; 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) { ofs << "col" << std::endl; 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 軸 値設定*/ ofs<<"pos: " << p->pos->x<<std::endl; 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; } } } } } } } if(NoCol_x == true) { float xx = p->speed->x; p->pos->x += xx; } if (NoCol_y == true) { float yy = p->speed->y; p->pos->y += yy; } } /****************************************************************************************************************************/
回答3件
あなたの回答
tips
プレビュー