49369


コード全体が長いですがEnemy部のの//ここの処理という部分なのですが  
プレイヤーとぶつかったときに消えるまたはエネミーが消えるといった処理を書きたいのですがどすれば当たったのがプレイヤーかどうかを判定すればいいのですか？今回はりませんがエネミーとエネミーが当たった時は何もしないでプレイヤーと当たったときだけプレイやーが消えるといった処理をしたいです、初学者ですのでコードのどの辺に書けばいいかということでも迷っているのでそちらも教えてくれますでしょうか？

player部

[code]

    #include "DxLib.h"
    #include "math.h"
    #include "Player.h"
    #include "keyboard.h"
    /*
    ヘッダー部
    #ifndef ___PLAYER_H
    #define ___PLAYER_H
    void Player_Initialize();
    void Player_Update();
    void Player_Draw();
    void Player_Finalize();
    
    #endif
    */
    static int m_imege;
    static constexpr double m_width = 64;
    static constexpr double m_height = 64;
    static constexpr double view_width = 640 - m_width;
    static constexpr double view_height = 480 - m_height;
    static double m_x;
    static double m_y;
    static constexpr double PI = 3.14159265359;
    static constexpr double Angle = PI / 180;
    static unsigned int i = 0;
    
    void key_input()
    {
        if (Keyboard_Get(KEY_INPUT_UP) > 0)
        {
            m_y -= 2;
        }
        if (Keyboard_Get(KEY_INPUT_DOWN) > 0)
        {
            m_y += 2;
        }
        if (Keyboard_Get(KEY_INPUT_RIGHT) > 0)
        {
            //m_x += 2;
            i += 3;
        }
        if (Keyboard_Get(KEY_INPUT_LEFT) > 0)
        {
            //m_x -= 2;
            i -= 3;
        }
    }
    /*初期化*/
    void Player_Initialize()
    {
        m_x = 640 / 2 - 32;
        m_y = 480 / 2 - 32;
        m_imege = LoadGraph("Block.png");
    
    }
    void iscreen()
    {
        if (m_x > 640 - 64)
        {
            m_x = 640 - 64;
        }
        if (m_x < 0)
        {
            m_x = 0;
        }
        if (m_y < 0)
        {
            m_y = 0;
        }
    
        if (m_y > 480 - 64)
        {
            m_y = 480 - 64;
        }
    
    }
    /*更新*/
    void Player_Update()
    {
        key_input();
        iscreen();
    
        if (i > 360)
        {
            i = 0;
        }
    
        m_x =  (680 / 2 - 32) + 80 * cos( Angle * i);
        m_y =  (480 / 2 - 32) - 80 * sin( Angle * i);
        i++;
    
    }
    /*描画*/
    void Player_Draw()
    {
        DrawGraph(static_cast<int>(m_x),static_cast<int>(m_y),m_imege,TRUE);
    }
    void Player_Finalize()
    {
        DeleteGraph(m_imege);
    }
    
[/code]

Enemy部

[code]

    #include "DxLib.h"
    #include "math.h"
    #include "Enemy.h"
    /*
    ヘッダー部
    #ifndef ___Enemy_H
    #define ___Enemy_H
    void Enemy_Draw();
    void Enemy_Finalize();
    void Enemy_Initialize();
    void Enemy_Update();
    void Enemy_Collision();
    #endif
    */
    
    static int m_imege;
    static constexpr double m_width = 48;
    static constexpr double m_height = 64;
    static constexpr double screen_width = 640;
    static constexpr double screen_height = 480;
    static constexpr double view_width = screen_width - m_width;
    static constexpr double view_height = screen_height - m_height;
    static double m_x;
    static double m_y;
    static constexpr double PI = 3.14159265359;
    static constexpr double Angle = PI / 180;
    static unsigned int i = 0;
    
    void Enemy_Draw()
    {
        DrawGraph(m_x,m_y,m_imege,TRUE);
    }
    
    void Enemy_Finalize()
    {
        DeleteGraph(m_imege);
    }
    
    void Enemy_Collision()
    {
        //ここの処理です。
    }
    void Enemy_Initialize()
    {
        m_x = screen_width / 2 - m_width;
        m_y = screen_height / 4 - m_height;
        m_imege = LoadGraph("Mario.png");
    
    }
    
    void Enemy_Update()
    {
    
    }
    
[/code]

key_board部

[code]

    #pragma once
    #include "DxLib.h"
    #include "Keyboard.h"
    /*
    ヘッダ部
    #ifndef KEYBOARD_H
    #define KEYBOARD_H
    
    void Keyboard_Update();
    int Keyboard_Get(int KeyCode);
    #endif
    
    */
    static int m_Key[256];
    
    void Keyboard_Update()
    {
        char tmpkey[256];
        GetHitKeyStateAll(tmpkey);
        for (int i = 0; i < 256; i++) {
    
            if (tmpkey[i] != 0) 
            {
                m_Key[i]++;
            }
            else 
            {
                m_Key[i] = 0;
            }
    
        }
    }
    
    int Keyboard_Get(int KeyCode)
    {
        return m_Key[KeyCode];
    }
    
[/code]


CC BY-SA 4.0
2018-10-16T14:15:46.900
49358
2019-02-24T18:03:05.720
2018-10-18T12:01:45.980
question
c++
dxライブラリ、当たり判定を作りたい


難しく考えず、円と円の接触判定を自分で実装しちゃうのが早いです。  
１、座標(x, y)、当たり判定用相対座標(offsetX, offsetY)と円の半径(r)を保持しておく  
２、予めplayerList、enemyListといったコレクションを用意しておく  
３、forループを2重にして、全組み合わせで判定

[code]

        for(int pIndex = 0; pIndex < playerListCount; pIndex++) {
            for(int eIndex = 0; eIndex < enemyListCount; eIndex++) {
                if (isCollides(playerList[pIndex], enemyList[eIndex])) {
                    // 接触した時の内容を書く
                }
            }
        }
    ...
    // 円と円の接触判定 : ピタゴラスの定理と円の半径の合計の二乗値の大小関係
    bool isCollides(cGameObject objA, cGameObject objB) {
        int dx = (objA->x + objA->offsetX) - (objB->x + objB->offsetX);
        int dy = (objA->x + objA->offsetY) - (objB->x + objB->offsetY);
        int distanceSquare = dx * dx + dy * dy;
        int radiusSquare = (objA->radius + objB->radius) * (objA->radius + objB->radius);
        return (distanceSquare <= radiusSquare);
    }
    
[/code]

※１ C++は書いたことが無いので、あいまいな記憶で書いてあります。文法は間違っているかもしれません。

※２ 円以外の形を対応したくなると思いますが、  
円以外の判定を実装するのではなく、1つのゲームオブジェクトに円の当たり判定(r, offsetX,
offsetY)を複数持たせることで、簡単にそれらしい判定が実現できます。


CC BY-SA 4.0
2018-10-17T01:53:14.690
49369
2018-10-17T01:53:14.690
25396
49358
answer