189 8069 5689

QT横板格斗小游戏——基于网编的重构-创新互联

QT横板格斗小游戏——基于网编的重构
  • 一、项目概览
    • 二、具体功能设计
      • 2.1 Npc基类
      • 2.2 Boss子类
      • 2.3 Hero类
      • 2.4 Widget类
      • 2.5 GameContral基类
      • 2.6 GameObject子类
      • 2.7 服务器端

创新互联服务项目包括海曙网站建设、海曙网站制作、海曙网页制作以及海曙网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,海曙网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到海曙省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!一、项目概览

前言:本项目所有图片素材均来自网络,如有侵权,请及时联系;由于项目代码量较多,仅展示部分代码,需要源文件私信或评论里留下邮箱,无偿交流。

本项目是基于C++重构的练习项目,具体功能与原项目基本相同,但实现方法更为精简,并且加入了网络编程以实现联机,原项目可参考链接C++横板格斗小游戏。

二、具体功能设计

同样,由于代码量较多,仅在这里展示一下类的设计,由于具体功能设计与上篇文章一致,不再过多赘述。

2.1 Npc基类
#ifndef NPC_H
#define NPC_H

#include#include#include#includeclass GameObject;
class npc : public QObject
{Q_OBJECT
public:
    npc(GameObject *a,int s);
    npc(GameObject *a);
    void hideAll();
    void showNpcReady();
    int getNpcx();
    int getNpcy();
    void setNpcxy(int x,int y);
protected:
    int npcx,npcy;
    QMovie* npcready;
    QLabel* npcreadylab;
signals:
};
#endif // NPC_H

继承自QObject类,用于绘制npc。

2.2 Boss子类
#ifndef BOSS_H
#define BOSS_H
#include "npc.h"

class boss : public npc
{public:
    boss(GameObject *a,int s);
    void hideAll();
    void showNpcReady();
    void showLeft();
    void showRight();
    void showUp();
    void showDown();
    void showYS();
    void showYX();
    void showZS();
    void showZX();
    void showAttack();
private:
    int bosshp = 1000,bossmp = 1000;
    QMovie* bossright;
    QLabel* bossrightlab;
    QMovie* bossleft;
    QLabel* bossleftlab;
    QMovie* bossup;
    QLabel* bossuplab;
    QMovie* bossdown;
    QLabel* bossdownlab;
    QMovie* bossys;
    QLabel* bossyslab;
    QMovie* bossyx;
    QLabel* bossyxlab;
    QMovie* bosszs;
    QLabel* bosszslab;
    QMovie* bosszx;
    QLabel* bosszxlab;
    QMovie* bossattack;
    QLabel* bossattacklab;
};
#endif // BOSS_H

用于绘制BOSS的子类,使用QMovie和QLabel根据设定逻辑播放gif图以表示BOSS。

2.3 Hero类
#ifndef HERO_H
#define HERO_H
#include#include#include#include#include#includeclass GameObject;
class hero :public QObject
{Q_OBJECT
public:
    hero(GameObject* a);
    ~hero();
    void hideAll();
    void hideBar();
    void showHeroReady();
    void showLeft();
    void showRight();
    void showUp();
    void showDown();
    void showYS();
    void showYX();
    void showZS();
    void showZX();
    void showguanghuan();
    void showLeftAttack();
    void showRightAttack();
    void showSkill1();
    void showjian(int a);
    void showHerohp();
    void showHeromp();
    int getHerox();
    int getHeroy();
    void setHeroxy(int x,int y);
    int getHerohp();
    int getHeromp();
    void setHerohp(int hp);
    void setHeromp(int mp);
    void setHeroAttribute(int hp,int mp);
    bool getHright();
    bool getHleft();
    bool getHup();
    bool getHdown();
    void setHright(bool k);
    void setHleft(bool k);
    void setHup(bool k);
    void setHdown(bool k);
    bool getHfacer();
    bool getHfacel();
    void setHfacer(bool k);
    void setHfacel(bool k);
    bool getheroskill1();
    bool getheroskillall();
    bool getheroskilljian();
    void setheroskilljian(bool k);
    void setheroskill1(bool k);
    void setheroskillall(bool k);
private:
    int herox,heroy,herohp = 1000,heromp = 1000;
    bool hright = false,hleft = false,hup = false,hdown = false,hfacer = true,hfacel = false,heroskill1 = false,heroskilljian = false,heroskillall = false;
    QMovie* heroready;
    QLabel* heroreadylab;
    QMovie* heroleft;
    QLabel* heroleftlab;
    QMovie* heroright;
    QLabel* herorightlab;
    QMovie* heroup;
    QLabel* herouplab;
    QMovie* herodown;
    QLabel* herodownlab;
    QMovie* heroys;
    QLabel* heroyslab;
    QMovie* heroyx;
    QLabel* heroyxlab;
    QMovie* herozs;
    QLabel* herozslab;
    QMovie* herozx;
    QLabel* herozxlab;
    QMovie* heroguanghuan;
    QLabel* heroguanghuanlab;
    QMovie* rightattack;
    QLabel* rightattacklab;
    QMovie* leftattack;
    QLabel* leftattacklab;
    QMovie* jian1;
    QLabel* jian1lab;
    QMovie* jian2;
    QLabel* jian2lab;
    QMovie* skill1;
    QLabel* skill1lab;
    QProgressBar *herohpbar;
    QProgressBar *herompbar;
public slots:
};

#endif // HERO_H
//This ain’t for the weak links or the faint of heart
//The foes coming up ahead are bound to make a mark

用于绘制玩家,同样使用QMovie和QLabel绘制玩家的各种行动状态。

2.4 Widget类
#ifndef WIDGET_H
#define WIDGET_H
#include#include#include//标签
#include#include#include#include#include#include#include#include#includeclass Widget : public QWidget
{Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void bgmove();
    void run();
    void hideall();
    void showall();
    QTcpSocket* getsocket();
    int otherx = 0;
    int othery = 0;
    int othermapindex = 0;
    bool otherlink = false;
    bool otherleft = false;
    bool otherright = false;
    bool otherup = false;
    bool otherdown = false;
    void mouseMoveEvent(QMouseEvent *event);
private:
    QMovie* login;
    QLabel* loginlab;
    QLabel *lab1, *lab2;
    QLineEdit *editID, *editPwd;
    QPushButton *btn1,*btn2;
    QTcpSocket *socket;
public slots:
    void cancelSlot();
    void connectedSlot();
    void disconnectedSlot();
    void readData();
    void loginrequest();
};
#endif // WIDGET_H

用于绘制登录界面,接收并保存其他客户端玩家的坐标和状态信息。

2.5 GameContral基类
#ifndef GAMECONTRAL_H
#define GAMECONTRAL_H
#include//视图
#include//场景
#include//图形元素
#include#include "widget.h"
#include#include#include#include#include#include#include#include#include#includeclass hero;
// gamecontral基类  设置定时器  淡入淡出特效 放大缩小特效 视频、图片路径加载
class GameContral : public QGraphicsView
{Q_OBJECT
public:
    GameContral(Widget* a);
    ~GameContral();
    void fadeIn(QGraphicsPixmapItem *a);
    void fadeOut(QGraphicsPixmapItem *a);
    Widget* b; //用于保存主窗口的地址
protected:
    QGraphicsOpacityEffect *opacity;
    QPropertyAnimation *opacityAnimation;
    QPushButton *startgamebtn,*endgamebtn,*returnstartbtn,*returnbtn,*exitbtn;
    QGraphicsScene mscence;
    QMediaPlayer *player;
    QVideoWidget *videoWidget;
    QMediaPlayer *pause;
    QVideoWidget *pauseWidget;
    QMovie* teleport;
    QLabel* teleportlab;
    QMovie* teleportinmaintown;
    QLabel* teleportinmaintownlab;
    QGraphicsPixmapItem background[5];
    QTimer *centertime;
    QTimer *centertime1;
    QTimer *btntime;
    QTimer *herokeytime;
    QTimer *heromovetime;
    QTimer *heromovetimeinother;
public slots:
    void centerxyin(); //窗口放大
    void centerxy(); //窗口缩小
};

#endif // 1_H

gamecontral基类 用于设置定时器 淡入淡出特效 放大缩小特效 视频、图片路径加载

2.6 GameObject子类
#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H
#include "GameContral.h"

class hero;
class npc;
class boss;
//游戏对象子类 控制游戏运行逻辑
class GameObject : public GameContral
{Q_OBJECT
public:
    GameObject(Widget *a);
    ~GameObject();
    void startGame();//开始游戏
    void mainTown();
    void nightMarket();
    void WarfareField();
    void heroActionCheck();
    void heroLocationCheck();
    void heroLocationCheckInOther();  //hero位置检测
    void heroSkillCheck();
    void bossActionCheck(); //boss行为检测
    void bossLocationCheckInOther(); //boss位置检测
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);
private:
    hero *ps;
    hero *other;
    npc *pn;
    boss *pb;
    int bossrandom = 0;
    int mapindex = 0;
    QListherokeylist;
    QListherokeyreleaselist;
    QTimer *otherherotime;
    QTimer *heroskilltime;
    QTimer *sendxytime;
    QTimer *bossrandomtime;
    QTimer *bossactiontime;
    QTimer *bosssuperskilltime;
    QTimer *bossmovetimeinother;
public slots:
    void gotostart(); //返回菜单
    void re(); //退出
    void gotomaintown(); //前往主城镇
    void herokeycheck();
    void returnthis();
    void returnstart();
};

#endif // GAME_H

游戏对象子类,控制游戏运行逻辑,使用大量定时器并重写按键按下抬起虚函数以实现具体的行为控制。

2.7 服务器端
#ifndef DATASQL_H
#define DATASQL_H
#include#include#include#includeclass DataSql
{public:
    ~DataSql();
    static QListallheroxylist;
    static int clientindex;
    static DataSql* getDataSql();//获取到唯一的对象
    int checkLogin(QString id,QString password);
private:
    DataSql();
    static DataSql *pIntentce;// 保存创建好的唯一的对象的地址
    QSqlDatabase database;//数据库指针
};

#endif // DATASQL_H

数据库单例类,用作登录

#ifndef SERVERFIX_H
#define SERVERFIX_H
#include "threadfix.h"

class ServerFix : public QTcpServer
{struct Dlt
    {ThreadFix * thread_dlt;
        Dlt * next;
    };
    Dlt * dlt_ = 0;
public:
    ServerFix(QObject * parent = Q_NULLPTR) : QTcpServer(parent){}
    ~ServerFix();
protected:
    void incomingConnection(qintptr socketDescriptor);
};

#endif // SERVERFIX_H

重写的QTcpSocket类,重写虚函数incomingConnection,在其中创建线程用于多线程通信。

#ifndef THREADFIX_H
#define THREADFIX_H

#include#include#include#include#include#include#include#includeclass ThreadFix : public QThread
{public:
    ThreadFix(qintptr s) : QThread()
    {socketDescriptor = s;
    }
    void run(); //重写QThread虚函数 run()
    ~ThreadFix();
private:
    int herox = 0;
    int heroy = 0;
    int mapindex = 0;
    QByteArray  arry;
    QTcpSocket * socket;
    qintptr socketDescriptor;
//signals:
//    void sendxy(QTcpSocket * socket);
};


#endif // THREADFIX_H

重写的QThread类,重写run虚函数以进行具体的信息收发处理。

#ifndef WIDGET_H
#define WIDGET_H

#include#include#include#include#include#include#include#include#include#include "serverfix.h"

class Widget : public QWidget
{Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    QByteArray  arry;
    QTimer *sendtime;
    ServerFix *server;
};
#endif // WIDGET_H

Widget类,用于监听客户端。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:QT横板格斗小游戏——基于网编的重构-创新互联
当前URL:http://cdxtjz.cn/article/dcegpj.html

其他资讯