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 26playerMoveTimerMOVE_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 中国大陆许可协议进行许可。

posted @   北纬31是条纬线哦  阅读(57)  评论(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 怎敢抚慰那深至灵魂的痛