質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

関数のオーバーロードでこの使い方は正しいかどうか知りたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 575
退会済みユーザー

退会済みユーザー

提示コードですがIntersecct();関数ですが引数がMapChipではなくenmey型も欲しいので関数のオーバーロードを行うと思うのですがこれは正しい実装なのでしょうか?下記の二重for文のように使う予定です。for文に対する関数のオーバーロードが正しいのか知りたいです。

//交差判定
void Bullet::Intersect(MapChip& m)
//void Bullet::Intersect(BoxCollision& col)
{
    //std::shared_ptr<BoxCollision> col = m.mCol;
    BoxCollision* col = &m.mCol;


    if (isMapHit == false && isEnemyHit == false) 
    {
        if ((col->getMax().x > box.getMin().x && box.getMax().x > col->getMin().x) && (col->getMax().y > box.getMin().y && box.getMax().y > col->getMin().y))
        {
            printf("true \n");

            //サイズを取得
            //相手
            glm::vec2 colSize = col->getMax() - col->getMin();
            colSize.x = colSize.x / 2;
            colSize.y = colSize.y / 2;

            //自分
            glm::vec2 boxSize = box.getMax() - box.getMin();
            boxSize.x = boxSize.x / 2;
            boxSize.y = boxSize.y / 2;

            float colCenterX = (col->getMin().x + colSize.x);
            float colCenterY = (col->getMin().y + colSize.y);
            float boxCenterX = (box.getMin().x + boxSize.x);
            float boxCenterY = (box.getMin().y + boxSize.y);


            float deltaX = boxCenterX - colCenterX; //正ならboxが右にいる
            float deltaY = boxCenterY - colCenterY; //正ならboxが上にいる
            float adjust = 0.0;

            if (fabs(deltaX) < fabs(deltaY))
            {
                //    printf(", Y adjust \n");
                if (deltaY > 0)
                {
                    adjust = col->getMax().y - box.getMin().y + 0.001f; // +する
                }
                else
                {
                    adjust = -(box.getMax().y - col->getMin().y + 0.001f); // -する
                }

                glm::vec2 minY = box.getMin();
                glm::vec2 maxY = box.getMax();
                minY.y += adjust;
                maxY.y += adjust;

                box.setMin(minY);
                box.setMax(maxY);


                //box.getMin().y += adjust;
                //box.getMax().y += adjust;
            }
            else
            {
                //    printf(", X adjust \n");
                if (deltaX > 0)
                {
                    adjust = col->getMax().x - box.getMin().x + 0.001f; // +する

                }
                else
                {
                    adjust = -(box.getMax().x - col->getMin().x + 0.001f); // -する
                }



                glm::vec2 minX = box.getMin();
                glm::vec2 maxX = box.getMax();
                minX.x += adjust;
                maxX.x += adjust;

                box.setMin(minX);
                box.setMax(maxX);

            }




            //当たり判定
            if (col->getTag() == Tag::Block)
            {
                printf("Block\n");
                position.x = box.getMin().x + (size.x / 2);
                position.y = box.getMin().y + (size.y / 2);
                isMapHit = true;
            }
            else if (col->getTag() == Tag::Brick)
            {
                printf("Block\n");
                position.x = box.getMin().x + (size.x / 2);
                position.y = box.getMin().y + (size.y / 2);
                isMapHit = true;

            }
        }
    }

}
//プレイヤーのバレットとの当たり判定
void Stage::ColPlayer_Bullet(std::shared_ptr<Player> player)
{
    for (std::vector<Bullet>::iterator itr = player->getBullet()->begin(); itr != player->getBullet()->end(); itr++)
    {
        for (std::vector<MapChip>::iterator map = mStage->begin(); map != mStage->end(); map++)
        {
            itr->Intersect(*map);
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2021/03/25 02:18

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

0

オーバーロードの使い方(考え方)としては問題無いと思います。実装の正しさまではわかりません。「enemy型に即した実装をする」としか言いようがないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る