Skip to content

Collider ​

当たり判定関連 / コンタクトリスナー

所属:collisionのAPI解説 · 全モジュール索引

読み方 ​

このページは実ファイルから生成したソース照合用資料です。公開関数の引数・戻り値の型、オーバーロード、列挙値を確認できます。public/protected/privateを区別し、privateメンバーを呼び出し例に使わないでください。コメントは原文であり、古い説明や誤記を含む場合があります。利用条件・訂正は上記のAPI解説と既知の制約を優先してください。

元ファイル:ProjectName/code/Collision/Collider/Collider.ixx。確認基準:08f9fa53。

インターフェースとインライン実装 ​

cpp
export module Collider;

import <memory>;
import <functional>;
import <unordered_map>;

export import MyLib.Math.Vector2;
export import ColliderDef;
export import ColliderFilter;
export import ColliderVisitor;

using namespace math;

/// <summary>
/// 当たり判定関連
/// </summary>
export namespace col2d
{
    constexpr float EPSILON = 1e-6f;    // 浮動小数点誤差許容値

    constexpr Vector2f NORMAL_LEFT = { -1.0f, 0 }; // 左方向の法線
    constexpr Vector2f NORMAL_RIGHT = { 1.0f, 0 }; // 右方向の法線
    constexpr Vector2f NORMAL_TOP = { 0, -1.0f }; // 上方向の法線
    constexpr Vector2f NORMAL_BOTTOM = { 0, 1.0f }; // 下方向の法線

    /// <summary>
    /// コンタクトリスナー
    /// </summary>
    export struct ContactListener
    {
        std::function<bool(const ContactInfo&)> when; // 条件
        std::function<void()> event; // 処理
    };

    /// <summary>
    /// コライダー
    /// </summary>
    export class Collider
    {
    public:
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="def">コライダー定義</param>
        explicit Collider(ColliderDef* def)
            : m_colDef(std::make_unique<ColliderDef>(*def))
            , m_filter()
            , m_velocity{ 0,0 }
        {}

        /// <summary>
        /// デストラクタ
        /// </summary>
        virtual ~Collider();

        /// <summary>
        /// カテゴリーの生成
        /// </summary>
        /// <param name="ownerID">所有者のID</param>
        virtual void GenerateCategory(uint32_t ownerID = 0) = 0;

        /// <summary>
        /// コライダーの定義情報を取得
        /// </summary>
        /// <returns>コライダー定義情報へのポインタ</returns>
        ColliderDef* GetColliderDef() const noexcept
        {
            return m_colDef.get();
        }

        /// <summary>
        /// ビジターの受け入れ
        /// </summary>
        /// /// <param name="visitor">他のコライダービジター</param>
        virtual void Accept(ColliderVisitor& visitor) = 0;

        /// <summary>
        /// 衝突判定
        /// </summary>
        /// <param name="other">他のコライダー</param>
        virtual void CollideWith(Collider& other)
        {
            other.Accept(*m_visitor);
        }

        /// <summary>
        /// コライダーのフィルタ情報を取得
        /// </summary>
        Filter& GetFilter() noexcept
        {
            return m_filter;
        }

        /// <summary>
        /// 移動量の設定
        /// </summary>
        void SetVelocity(const Vector2f& velocity) noexcept
        {
            m_velocity = velocity;
        }

        /// <summary>
        /// 移動量の取得
        /// </summary>
        /// <returns>移動量</returns>
        Vector2f GetVelocity() const noexcept
        {
            return m_velocity;
        }

        /// <summary>
        /// 移動量の追加
        /// </summary>
        virtual void AddVelocity() {};

        /// <summary>
        /// イベントの追加
        /// </summary>
        /// <param name="key">イベントのキー</param>
        /// <param name="event">追加するイベント</param>
        void AddEvent(const uint64_t& key, ContactListener event)
        {
            m_events[key].push_back(std::move(event));
        }

        /// <summary>
        /// イベントの発火
        /// </summary>
        /// <param name="key">イベントのキー</param>
        /// <param name="info">衝突情報</param>
        void TriggerEvent(const uint64_t& key, const ContactInfo& info);

        /// <summary>
        /// イベントの削除
        /// </summary>
        /// <param name="key">イベントのキー</param>
        void DeleteEvent(const uint64_t& key)
        {
            if (m_events.find(key) != m_events.end())
            {
                m_events.erase(key);
            }
        }

    protected:
        /// <summary>
        /// 移動量の追加
        /// </summary>
        /// <param name="velocity">移動量</param>
        virtual void AddVelocity(const Vector2f& velocity) {};

        Filter m_filter; // コライダーのフィルタ情報
        std::unique_ptr<ColliderDef> m_colDef; // コライダー定義情報へのポインタ
        std::unique_ptr<ColliderVisitor> m_visitor; // ビジター
        Vector2f m_velocity; // 速度
        std::unordered_map<uint64_t, std::vector<ContactListener>> m_events; // 接触イベントリスト
    };
}

コード確認基準:08f9fa53 · C++実機検証は別途実施