RaceGame-Qt游戏项目构建-玩家道具

RaceGame-Qt游戏项目构建-玩家道具

玩家道具概述

游戏的道具分为两种,一种命名为“工具Tools”,,工具具有永久作用 且仅作用于使用工具的玩家自身。另一种命名为“魔法Magics”,魔法具有暂时作用,且作用于释放者指定的玩家。两种道具具有不同的实现方式(例如魔法需要具备“备忘录”功能记录玩家原始状态并恢复),本篇是工具Tools的设计概述。

一、 class Tools

道具基类,代表玩家使用的道具。

class Tools : public QObject {
    Q_OBJECT
public:
    Tools(QString toolname, int usr_id);
    virtual ~Tools();

    QString toolname;
    int usrId;
    virtual void launchTool() = 0;
};

道具构造的时候需要传入参数,道具的名字,使用者的ID。

道具具有一个多态函数void launchTool(),代表释放道具,用于在派生类中改写实现方法。

二、 工具派生类

构造工具类的时候需要传递一个用户Id的参数。

代表具体的工具。工具的效果在派生类中实现,每个工具都有 void launchTool() 方法重写基类的虚函数。

// 监狱
// 在自己周围放置墙。
class prisonTool : public Tools {
public:
    prisonTool(int usr_id);
    ~prisonTool();
private:
public:
    void launchTool() override;
};
// 滑行
// 永久提高自己速度 1 点。(最高提高3 点)
class slideTool : public Tools {
public:
    slideTool(int usr_id);
    ~slideTool();
private:
public:
    void launchTool() override;
};
// 冰霜
// 永久降低自己速度 1 点。(最多降低 3 点)
class resistanceTool : public Tools {
public:
    resistanceTool(int usr_id);
    ~resistanceTool();
private:
public:
    void launchTool() override;
};
// 变换
// 随机改变运动方向(45 90 135 180 225 270 315)
class transformTool : public Tools {
public:
    transformTool(int usr_id);
    ~transformTool();
private:
public:
    void launchTool() override;
};
// 破坏
// 直接撞碎一堵墙,但此次会反弹(不一定对自己有利)。
class destoryTool : public Tools {
public:
    destoryTool(int usr_id);
    ~destoryTool();
private:
public:
    void launchTool() override;
};

三、 class ToolsManager

抽象类,工具管理器。

class ToolsManager {
private:
    static std::shared_ptr<Tools> m_tool;
public:
    ToolsManager();
    void GetTool(int usr_id);
    void UseTool();
    QString toolName() {return m_tool->toolname; }
};

提供了两个主要接口,获取工具和使用工具。

四、 class ToolRandomGenerator

用于生成随机数,例如获取工具的时候需要依据概率随机给玩家发放工具,int generateToolid(), “变换”工具需要给玩家随机设置一个运动向量 int generateVector() ,但是这个向量不能太靠近坐标轴,避免玩家反复在一条直线附近运动。这些都由这个类来实现。

// 生成工具的随机数
// singleton
class ToolRandomGenerator {
private:
    static ToolRandomGenerator * randmGenerator;
    ToolRandomGenerator();
    int randomNum;
public:
    static ToolRandomGenerator * getInstance();
    int generateToolid();
    int generateVector();
};

迭代结果

在之前版本中,游戏中的工具与游戏玩家紧耦合,不利于扩展工具功能,并且玩家使用工具也存在复杂的耦合关系,需要在玩家类中实现调用工具接口。

利用设计模式原则,现在将工具类与玩家类拆开实现松耦合,仅通过传递玩家id实现使用工具的功能,因为并不需要绑定某个玩家来实现,工具的效果是全局有效的。

posted @ 2025-01-30 13:47  北纬31是条纬线哦  阅读(48)  评论(0)    收藏  举报