• C++设计模式-中介者模式,游戏对象之间的碰撞检测


    运行在VS2022,x86,Debug下。

    31. 中介者模式

    在这里插入图片描述

    • 中介者模式允许对象之间通过一个中介者对象进行交互,而不是直接相互引用。可以减少对象之间的直接耦合,同时集中化管理复杂的交互。
    • 应用:如在游戏开发中,可以使用中介者模式来管理游戏对象之间的碰撞检测。这意味着当一个游戏对象需要检测与其他对象的碰撞时,它不需要直接与其他所有游戏对象进行交互,而是通过中介者来进行交互。
    • 实现
      • 同事接口,定义中介者对象,用来调用中介者的接口。
      • 具体同事类。
      • 中介者接口,定义让同事类操作的接口。
      • 具体中介者,定义所有同事类对象,负责同事类对象之间的交互。
    • 代码如下。
    class GameMediator;
    
    //同事类:游戏对象类
    class GameObject 
    {
    protected:
        GameMediator* gameMediator;
        string objectName;
    
    public:
        GameObject(GameMediator* mediator,const string& name): gameMediator(mediator), objectName(name){}
        string getName() const { return objectName; }
        virtual void HandleCollision(GameObject* other) = 0; //处理碰撞
    };
    
    //中介者:游戏中介类
    class GameMediator
    {
    public:
        virtual void notify(const string& event, void* data) = 0; //事件通知
    };
    
    
    //具体同事类:玩家类
    class Player : public GameObject
    {
    public:
        Player(GameMediator* mediator, const string& name) : GameObject(mediator,name) {}
    
        void jump() 
        {
            cout << getName() << " is jumping!" << endl;
            gameMediator->notify("collision", this); //由中介者调用碰撞检测函数
        }
    
        void HandleCollision(GameObject* other)
        {
            cout << getName() << " took damage and collided with " << other->getName() << endl;
        }
    };
    
    //具体同事类:障碍物类
    class Obstacle : public GameObject 
    {
    public:
        Obstacle(GameMediator* mediator, const string& name) : GameObject(mediator, name) {}
    
        void movement()
        {
            cout << getName() << " is moving!" << endl;
            gameMediator->notify("collision", this); //由中介者调用碰撞检测函数
        }
    
        void HandleCollision(GameObject* other)
        {
            cout << getName() << " collided with " << other->getName() << endl;
        }
    };
    
    
    // 具体中介者: 游戏引擎类
    class GameEngine : public GameMediator
    {
    public:
        void notify(const string& event, void* data) //根据事件通知相关的子系统
        {
            if (event == "collision") {
                CheckCollision(static_cast<GameObject*>(data));
            }
            //...
        }
    
        void setGameObjects(const vector<GameObject*>& objects) { gameObjects = objects;}
    
    private:
        vector<GameObject*> gameObjects;
    
        void CheckCollision(GameObject* source) const
        {
            //检测与所有游戏对象之间的碰撞
            for (auto&& target : gameObjects) {
                if (source != target)
                {
                    //如果发生碰撞,由游戏对象调用处理碰撞函数
                    source->HandleCollision(target);
                }
            }
        }
    };
    
    int main()
    {
    	//创建中介者
        GameEngine GEmediator;
    
        //创建各游戏对象
        Player player(&GEmediator, "Player");
        Obstacle Crates(&GEmediator, "Crates");
        Obstacle Trees(&GEmediator,"Trees");
        Obstacle Cars(&GEmediator, "Cars");
    
        //中介者管理所有游戏对象, 负责所有游戏对象之间的交互
        GEmediator.setGameObjects({ &player, &Crates, &Trees, &Cars });
    
        //游戏对象移动
        player.jump();
        Cars.movement();
    
        return 0;
    }
    
  • 相关阅读:
    C#学习笔记(1)
    [MySql]初识数据库与常见基本操作
    第五章:ES6高级(下)
    LeetCode952三部曲之一:解题思路和初级解法(137ms,超39%)
    Spring IOC源码研究笔记(2)——ApplicationContext系列
    CocosCreator3.8研究笔记(十二)CocosCreator 字体资源理解
    ResNet分类器量化
    二、一起来学习Java 开发环境配置
    基于springboot的计算机类考研交流平台(源码+论文)
    PHP 程序员转 Go 语言的经历分享
  • 原文地址:https://blog.csdn.net/qq_42692132/article/details/139423185