悲伤的现实
离期末第一场考试之剩下32天了,而oop的期中project还有24天截止。此刻,我们刚刚写完了人生中第一个c++程序,分数类的运算符重载。继承和多态还没学。尽管如此,也是时候作为全裸勇者勇敢地去挑战大魔王了。
目标
通过研究贪吃蛇小游戏的源码,学会用Qt进行游戏开发,并且完成期中Pro报告中挖下的2D Rougelike类小游戏第一关的大坑,并且写下博客给新鲜的学妹学弟留下可以借鉴的学习经验。
资料
Qt5贪吃蛇小游戏源代码下载处
来自Rimond_Jing的Qt5基本安装教程
来自 齐亮,非常棒的一个参考资料
高能预警
因为目前c++也没学好,Qt也刚开始学,所以本篇博客只适合和我一样什么都不会的人。而且很有可能错误连篇,期待有人能指正。
目前在一遍分析一遍写博客,所以会对内容进行不断地修正
以及非常啰嗦(和废话)
总体分析
注:纯新手一上来就看总体分析极有可能不懂,看看就好,不懂就跳过去看完全文回来再看。
界面转换
在本例子中,采取建立不同的界面类(mainWidget,开始界面,和GameWidget,游戏界面),通过接收事件(event,本例是按下按钮),利用信号和槽,来进行界面切换。
main函数分析
感觉并不需要分析:)
#include "mainWidget.h"
//自己写的主窗口的头文件
#include <QApplication>
//一个基础的类,所有工程(pro文件)都要include。
//有时候include这个文件会报错,可能是因为是Qt4的代码的原因
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mainWidget w;
w.show();
return a.exec();
}
主窗口分析:mainWidget
头文件分析
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include "GameWidget.h"
#include <QWidget>
#include <QIcon>
#include <QPalette>
#include <QBrush>
#include <QPixmap>
#include <QPushButton>
#include <QMessageBox>
#include <QLabel>
#include <QFont>
class mainWidget : public QWidget//继承了QWidget类
{
Q_OBJECT
//只要有槽和信号机制,就要写Q_OBJECT
public:
mainWidget(QWidget *parent = 0);
~mainWidget();
//void resizeEvent(QResizeEvent *);
private:
QPushButton *startbtn;//一个按钮,用鼠标点击后会开始游戏
QPushButton *exitbtn;//一个按钮,用鼠标点击后会退出
GameWidget *g;
QLabel *label;
signals://信号,mainWidget不会发出信号
public slots://可以接收所有信号的公共槽
void exitSlot();//用来接收退出信号的槽
void startSlot();//用来接收开始信号的槽
};
#endif // MAINWIDGET_H
.cpp文件分析
注释的都是可以在自己的程序中使用的函数
#include "mainWidget.h"
mainWidget::mainWidget(QWidget *parent): QWidget(parent)
{
this->resize(480,270);//resize函数,用来设置mainWidget这个窗口的大小
this->setMaximumSize(480,270);
this->setWindowIcon(QIcon(":/new/prefix1/img/icon.png"));//设置ICON
this->setWindowTitle("贪吃蛇");
QPalette palette;
palette.setBrush(QPalette::Background,QBrush(QPixmap(":/new/prefix1/img/back.jpg"