明思义 发表于 5 天前

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 ;
};
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: RaceGame-Qt游戏项目构建-游戏框架