如切如磋,如磨如琢|

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实现使用工具的功能,因为并不需要绑定某个玩家来实现,工具的效果是全局有效的。

本文作者:北纬31是条纬线哦

本文链接:https://www.cnblogs.com/beiwei31/p/18695141

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   北纬31是条纬线哦  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 If 丁可
If - 丁可
00:00 / 00:00
An audio error has occurred.

I came your danger soul 我靠近你危险的灵魂

Think so you'll say hello 想着你会主动打招呼

Breaking you find to go 忽然你想要转身离去

Break down you might be lone 黯然神伤或许你也会孤独吧

Angel you down thinking 天使如你可否冷静思虑

Think so you freaking down 还以为你会不药而愈

Say hi to send you go 一声问候就让你安心离开

Break down you might be lone 黯然神伤或许你也会孤独吧

And you know you saying to go 你自顾自洒脱的离去

Breaking down I find to go 终于遍体鳞伤的我选择离开

I can't down to soul 怎敢抚慰那深至灵魂的痛

You don't know I love you so 却不知这份爱的深沉

Angel now you think so 我的爱人事到如今你还会这样想吧

Don't freak the danger soul 是我不该诱惑你危险不安的灵魂吧

Breaking I find to go 终于遍体鳞伤的我选择离开

Break down you might be lone 黯然神伤或许你也会孤独吧

And you know you saying to go 你自顾自洒脱的离去

You don't know I love you so 却不知这份爱的深沉

Breaking down you trying to go 伤痕累累你试图不告而别

I can't down to soul 怎敢抚慰那深至灵魂的痛

And you know you trying to go 你自顾自洒脱的离去

You don't know I love you so 却不知这份爱的深沉

Breaking down you trying to go 伤痕累累你试图不告而别

I can't down to soul 怎敢抚慰那深至灵魂的痛