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

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

C++ 物理挙動もどき①

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

やったこと

今日は、プレイヤーの落下やめり込み防止などをしました。

中身

void Player::LateUpdate(float deltaTime)
{
    float fallSpeed = 0.01f;
    // 落下させる
    MoveY(-fallSpeed);

    // コライダーのリストを取得
    for (auto collider : DirectXRenderer::instance->m_ColliderList) {

        //テスト用オブジェクトにぶつかった場合
        if (collider->m_pGameObject->m_tag != Tag::TEST) { continue; }

        // 衝突判定をする
        if (!m_pCollider->CheckCollider(collider)) { continue; }

        // 衝突物の座標
        XMFLOAT3 checkColliderPos = collider->m_pGameObject->m_transform->m_pos;

        RectangleVertex myRect = m_pCollider->GetRect();

        RectangleVertex collisionRect = collider->GetRect();

        const float beforeMagine = 0.001f;

        XMFLOAT3 movePos = XMFLOAT3(0.0f, 0.0f, 0.0f);

        // 自分が上側の場合かつ自分が下側に移動した場合
        if (m_transform->m_pos.y > checkColliderPos.y && m_CurrentMoveTemp.y < 0.0f) {
            float moveYTemp = abs(collisionRect.top - myRect.bottom) + beforeMagine;
            if (moveYTemp > movePos.y) {
                // 上に移動する
                movePos.y = moveYTemp;
            }
        }
        // 自分が下側の場合かつ自分が上側に移動した場合
        else if (m_transform->m_pos.y < checkColliderPos.y && m_CurrentMoveTemp.y > 0.0f)
        {
            float moveYTemp = -abs(collisionRect.bottom - myRect.top) - beforeMagine;
            if (moveYTemp < movePos.y) {
                // 下に移動する
                movePos.y = moveYTemp;
            }
        }

        // 自分が右側の場合かつ自分が左側に移動した場合
        if (m_transform->m_pos.x > checkColliderPos.x && m_CurrentMoveTemp.x < 0.0f) {
            float moveXTemp = abs(collisionRect.right - myRect.left) + beforeMagine;
            if (moveXTemp > movePos.x) {
                // 移動量を更新する
                movePos.x = moveXTemp;
            }
            
        }
        // 自分が左側の場合かつ自分が右側に移動した場合
        else if (m_transform->m_pos.x < checkColliderPos.x && m_CurrentMoveTemp.x > 0.0f)
        {
            float moveXTemp = -abs(collisionRect.left - myRect.right) - beforeMagine;
            if (moveXTemp < movePos.x) {
                // 移動量を更新する
                movePos.x = moveXTemp;
            }
        }
        // 移動する
        Move(movePos);
    }
}

概要

f:id:nenowawon:20181117221135j:plain

課題

今回の実装の問題点は、X軸とY軸を同時に動かすとバグるところですね。。。 原因は分かったのですが、どうやって直そうか悩んでいます。。。

あとがき

ユニティちゃんはかわいい。