C++ 衝突応答(めり込み防止)
こんばんは。ネノワヲンです。
やったこと
めり込み直ったーーーーーーーーーー!!!!!!!!!! pic.twitter.com/ZDfKKLIu29
— ネノワヲン@ネノぶろ! (@nenowawon) 2018年11月21日
ソースコード
void Player::LateUpdate(float deltaTime) { vector<RectangleCollider*> colliderList; // コライダーのリストを取得 for (auto collider : DirectXRenderer::instance->m_ColliderList) { //テスト用オブジェクトにぶつかった場合 if (collider->m_pGameObject->m_tag != Tag::TEST) { continue; } // 衝突判定をする if (!m_pCollider->CheckCollider(collider)) { continue; } // 判定するコライダーを格納する colliderList.emplace_back(collider); } XMFLOAT3 movePos = XMFLOAT3(0.0f, 0.0f, 0.0f); for (auto collider : colliderList) { // 衝突物の座標 XMFLOAT3 checkColliderPos = collider->m_pGameObject->m_pTransform->m_pos; // 自分の頂点ごとのワールド座標 RectangleVertex myRect = m_pCollider->GetRect(*m_pTransform); RectangleVertex collisionRect = collider->GetRect(*collider->m_pGameObject->m_pTransform); Transform transformTemp = *m_pTransform; bool isPositisionBackY = false; bool isPositisionBackX = false; // Y軸座標の移動があった場合 if (m_CurrentMoveTemp.y > 0.0f || m_CurrentMoveTemp.y < 0.0f) { // Y軸座標を戻す transformTemp.m_pos.y -= m_CurrentMoveTemp.y; // 衝突判定をする if (!m_pCollider->CheckColliderTransform(collider, transformTemp)) { float moveYTemp = 0.0f; isPositisionBackY = true; OutputDebugString(_T("縦に戻す\n")); } } transformTemp = *m_pTransform; // X軸座標の移動があった場合 if (m_CurrentMoveTemp.x > 0.0f || m_CurrentMoveTemp.x < 0.0f) { // X軸座標を戻す transformTemp.m_pos.x -= m_CurrentMoveTemp.x; // 衝突判定をする if (!m_pCollider->CheckColliderTransform(collider, transformTemp)) { float moveXTemp = 0.0f; isPositisionBackX = true; OutputDebugString(_T("横に戻す\n")); } // if } // if if (isPositisionBackX&&isPositisionBackY) { // 衝突したコライダーが他にある場合 if (colliderList.size() > 0) { continue; } } // x座標を元に戻す if (isPositisionBackX) { movePos.x = -m_CurrentMoveTemp.x; } // y座標を元に戻す if (isPositisionBackY) { movePos.y = -m_CurrentMoveTemp.y; } } // for // 移動する Move(movePos); }
今日はもう遅いので、概要に関しては改めて明日書こうと思います。
あとがき
情報を調べていたら自分のブログが出てくるという嬉しいのか悲しいのか分からない現象(嬉しい)