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 ;
- };
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |