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;
}

相关推荐

  1. C++ QT设计模式中介模式

    2024-06-07 18:54:02       34 阅读
  2. 设计模式——中介模式

    2024-06-07 18:54:02       56 阅读
  3. 设计模式-中介模式

    2024-06-07 18:54:02       56 阅读
  4. 设计模式中介模式

    2024-06-07 18:54:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 18:54:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 18:54:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 18:54:02       87 阅读
  4. Python语言-面向对象

    2024-06-07 18:54:02       96 阅读

热门阅读

  1. 在Linux环境中通过Docker运行swift

    2024-06-07 18:54:02       32 阅读
  2. 记录使用pytorch训练crnn

    2024-06-07 18:54:02       26 阅读
  3. Docker 教程-介绍-2

    2024-06-07 18:54:02       28 阅读
  4. elementary OS 8的新消息

    2024-06-07 18:54:02       33 阅读
  5. Spark任务调度

    2024-06-07 18:54:02       29 阅读
  6. SparkStreaming编程-DStream创建

    2024-06-07 18:54:02       26 阅读
  7. 【AIGC调研系列】chatTTS与GPT-SoVITS的对比优劣势

    2024-06-07 18:54:02       26 阅读
  8. Advantages of high pressure cleaners

    2024-06-07 18:54:02       30 阅读
  9. 六个搜索算法及其python实现

    2024-06-07 18:54:02       32 阅读