RaceGame-Qt游戏项目构建-游戏框架
RaceGame-Qt游戏项目构建-游戏框架
游戏企划
使用 Qt 图形化界面开发一款名为 RaceGame 的竖屏小游戏,游戏玩法是4方玩家(方块)在带有墙体的地图中以一定速度、一定方向前进,碰到墙体会反弹,最终玩家按照到达目的地的先后顺序排名。
游戏过程中,玩家可以通过界面上的 Button
按钮进行释放技能,不同的技能会对不同的玩家进行状态改变,以此增加游戏的自由度和可玩性。
游戏展示
宏定义
游戏使用RaceGame
的命名空间,后续的代码省略不标注。以下是一些全局宏定义,单独放在头文件 GlobalMacros.h
中。
namespace RaceGame { #define MapWidth 45 // 地图宽度 #define MapHeight 73 // 地图高度 #define PLAYER_DFT_SPEED 4 // 玩家默认移速 #define PLAYER_MAX_SPEED 6 // 玩家最大移速 #define PLAYER_MIN_SPEED 1 // 玩家最小移速 #define MOVE_FLASH 26 // 运动帧率 #define MAX_MAP_NUM 4 // 最大地图数量 #define MAX_PLR_NUM 4 // 最大玩家数量 #define PRE_LAUNCH_SEC 10 // 获取道具之后 PRE_LAUNCH_SEC 秒后自动释放 }
Player相关类
Player
相关类在放在 player.h
头文件中,对应的源文件是 player.cpp
。
一、 class Player
核心类:玩家,代表在游戏界面运动的玩家,也就是小方块。
class Player : public QObject { Q_OBJECT Q_PROPERTY(QPointF position READ getPosition WRITE setPosition NOTIFY positionChange FINAL) public: Player(int id, int speed, QPoint pos, QPointF vec); private: int playerId; int speed; QPointF position; QPointF moveVector; signals: void positionChange(); public: QMetaObject::Connection playerMoveConnection; void setPosition(QPointF pos); int getPlayerId() {return this->playerId;} QPointF getPosition() {return this->position; } void setMoveVector(QPointF vec); QPointF getMoveVector() {return this->moveVector;} void setSpeed(int s); int getSpeed() {return this->speed; } void moveStep(); void reachEndPoint(); };
具有私有属性(成员变量)玩家号,速度,位置,以及运动方向等。
公有成员函数:获取或设置对象的私有属性的方法;获取道具方法,可以从游戏的 7 种工具中随机获得一个道具;使用道具方法:使用获取的道具,通过 QTimer * preLaunchTimer
计时器类型控制使用时限,10秒内使用道具,否则自动释放道具。停止使用道具方法:当使用道具,道具具有特定时长,当特定时长结束后,玩家会停止使用道具,并根据情况是否恢复道具对玩家的效果。
二、 class playersManager
抽象类,使用单例模式的玩家管理类,通过这个类暴露的接口创建玩家对象createPlayer(int memberNum = 1)
、销毁玩家对象destoryPlayer()
,并管理玩家的轮流计数trunNextPlayer()
。
// singleton class playersManager : public QObject { Q_OBJECT Q_PROPERTY(int PlayerTurn READ getplayerTurn NOTIFY trueNextSignal FINAL) Q_PROPERTY(QList<int> reachPlayerId READ getReachPlayerId NOTIFY reachPlayerIdChanged FINAL) private: static std::shared_ptr<playersManager> playerMgr; playersManager(); public: int PlayerTurn; int nemberNum; int trunNextPlayer(); void destoryPlayer(); void createPlayer(int memberNum = 1); void playerReach(int id); void allPlayerReach(); int getplayerTurn(); QList<int> reachPlayerId; QList<int> getReachPlayerId() {return this->reachPlayerId;} QList<std::shared_ptr<Player>> PlayerList; static std::shared_ptr<playersManager> getInstance(); signals: void trueNextSignal(); void reachPlayerIdChanged(); void allPlayerReachSgn(); public slots: };
三、 class playersMove
抽象类,玩家移动管理器,用于计时玩家的移动。由于不需要创建多个管理器对象,这个类也使用单例模式设计。
// singleton class playersMove : public QObject { Q_OBJECT private: static std::shared_ptr<playersMove> moveMgr; QTimer * playerMoveTimer; playersMove(); public: static std::shared_ptr<playersMove> getInstance(); void startTimer(); void stopTimer(); void move(std::shared_ptr<Player>& player); void stop(std::shared_ptr<Player>& player); };
playerMoveTimer
是一个 QTimer*
类型的私有变量,用于对玩家的移动计时。 定义了一个宏 #define MOVE_FLASH 26
,playerMoveTimer
每 MOVE_FLASH
毫秒发送一次信号,调用相应槽函数,使玩家移动一步(一次)。玩家移动一次的方法是 Player
类中的:void moveStep();
四、 class Triangle
用静态常量类型存放一些特殊向量。
// 特殊向量 class Triangle { public: static const QPointF right_vec ; static const QPointF left_vec ; static const QPointF up_vec ; static const QPointF down_vec ; static const QPointF up_right ; static const QPointF up_left ; static const QPointF down_right; static const QPointF down_left ; };
本文作者:北纬31是条纬线哦
本文链接:https://www.cnblogs.com/beiwei31/p/18663018
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步