ねのぷろ! ~げーむ・ぷろぐらみんぐ・ぶろぐ〜

プログラミングやゲームについてだらだら書きます。https://twitter.com/nenowawon

C++ 衝突応答(めり込み防止)

こんばんは。ネノワヲンです。

やったこと

ソースコード

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);
}

今日はもう遅いので、概要に関しては改めて明日書こうと思います。

あとがき

f:id:nenowawon:20181121235128j:plain 情報を調べていたら自分のブログが出てくるという嬉しいのか悲しいのか分からない現象(嬉しい)