typeGame QDialog
1-1 字母 / 磚塊 繪制
paintEvent() ---- update()
QPainter 類
資源清單: 26個字母 磚塊 背景
數據處理:
struct _STCH
QString szPath
QPoint cPos
QSize 磚塊大小
QPoint 桌上角第壹塊磚的位置
const int max_ch = 5
最多5個字母同時出現
1.繪制磚頭 40*40
800/40 = 20 col
640/40 = 16 row
13 14 15
2.處理數據********
3.隨機出現字母
字母圖片和位置
4.捕獲用戶按鍵
KeyPressEvent
5.計分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
首先建壹個文件叫typeGame 選擇 基類 QDialog
名字設為dialog
1.dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
// 聲明它是壹個外部變量
extern int gScore;
void Dialog::on_startBtn_clicked()
{
initImgList(); // 1.初始化圖片路徑
initPosList(); // 2.初始化圖片位置
// initWallList(); // 3.初始化磚頭列表
checkCrash(); // 4.檢查字母是否撞倒磚頭
// 3.定義控制字母下移的定時器
QTimer *pDownTimer = new QTimer;
connect(pDownTimer,SIGNAL(timeout()),
this,SLOT(updateMap()));
pDownTimer->start(1000);
// 4.定義產生字母的定時器
QTimer *pCharTimer = new QTimer;
connect(pCharTimer,SIGNAL(timeout()),
this,SLOT(createChar()));
pCharTimer->start(3000);
// 5.定義壹個刷新顯示分數的定時器
QTimer *pScoreTimer = new QTimer;
connect(pScoreTimer,SIGNAL(timeout()),
this,SLOT(updateScore()));
pScoreTimer->start(500);
// 6.定義壹個刷新計時的定時器
QTimer *pTimeTimer = new QTimer;
connect(pTimeTimer,SIGNAL(timeout()),
this,SLOT(updateTime()));
pTimeTimer->start(1000);
}
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog),
m_iTime(60)
{
ui->setupUi(this);
initWallList();
checkCrash();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent * event)
{
QPainter p(this);
// 1.繪制背景
p.drawPixmap(0,0,800,640,QPixmap(":image/back.jpg"));
// 2.繪制磚頭
for(int i = 0; i < m_WallList.size(); ++i)
{
int x = m_WallList.at(i).x();
int y = m_WallList.at(i).y();
p.drawPixmap(x,y,40,40,QPixmap(":image/wall.jpg"));
}
// 3.繪制隨機產生的字母
for(int i = 0; i < m_CharList.size(); ++ i)
{
int x = m_CharList.at(i).x;
int y = m_CharList.at(i).y;
int iIndex = m_CharList.at(i).iIndex;
p.drawPixmap(x,y,40,40,QPixmap(m_ImgList.at(iIndex)));
}
}
// 按鍵事件
void Dialog::keyPressEvent(QKeyEvent * event)
{
m_key = event->key();
m_key += 32;
for(int i = 0; i < m_CharList.size(); ++ i)
if( m_key == m_CharList.at(i).value)
{
m_CharList.removeAt(i);
gScore += 10;
break;
}
update();
return ;
}
// 更新地圖
void Dialog::updateMap()
{
// 1.改變字母的位置
for(int i = 0; i < m_CharList.size(); ++ i)
m_CharList[i].y += 40;
// 2.檢查字母是否撞倒磚頭
checkCrash();
// 3.重繪地圖
update();
return ;
}
// 產生字母
void Dialog::createChar()
{
if( m_CharList.size() > 4)
return ;
STCHAR stChar;
stChar.iIndex = rand()%m_ImgList.size();
stChar.x = m_PosList.at(stChar.iIndex%20).x();
stChar.y = m_PosList.at(stChar.iIndex%20).y();
stChar.value = stChar.iIndex + 'a';
m_CharList.append(stChar);
return ;
}
// 1.初始化圖片路徑
void Dialog::initImgList()
{
for(char i = 'a'; i<='z'; ++i)
{
QString szPath = QString(":image/%1.jpg").arg(i);
m_ImgList.append(szPath);
}
return ;
}
// 2.初始化圖片位置
void Dialog::initPosList()
{
for(int iCol = 0; iCol < 20; ++iCol)
m_PosList.append(QPoint(iCol*40,0));
return ;
}
// 3.初始化磚頭列表
void Dialog::initWallList()
{
for(int iRow = 13; iRow < 16; ++ iRow)
for(int iCol = 0; iCol < 20; ++iCol)
m_WallList.append(QPoint(iCol*40,iRow*40));
return ;
}
// 4.檢查字母是否撞倒磚頭
void Dialog::checkCrash()
{
for(int i = 0; i < m_CharList.size(); ++i)
for(int j = 0; j < m_WallList.size(); ++j)
{
int x1 = m_CharList.at(i).x;
int y1 = m_CharList.at(i).y;
int x2 = m_WallList.at(j).x();
int y2 = m_WallList.at(j).y();
if ( x1 == x2 && y1 == y2)
{
m_CharList.removeAt(i);
m_WallList.removeAt(j);
gScore -=5;
return ;
}
}
}
// 5.定義壹個刷新顯示分數
void Dialog::updateScore()
{
ui->scoreLcd->display(gScore);
return ;
}
// 5.定義壹個刷新顯示時間
void Dialog::updateTime()
{
ui->timeLcd->display(m_iTime--);
if( m_iTime < 0 )
close();
return ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
2.dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
// 字符信息結構體
typedef struct _STCHAR
{
int iIndex; // 字母索引值
int x; // 字母X坐標
int y; // 字母Y坐標
int value; // 字母值
}STCHAR;
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void initImgList(); // 1.初始化圖片路徑
void initPosList(); // 2.初始化圖片位置
void initWallList(); // 3.初始化磚頭列表
void checkCrash(); // 4.檢查字母是否撞倒磚頭
protected:
void paintEvent(QPaintEvent * event); // 繪圖事件
void keyPressEvent(QKeyEvent * event); // 按鍵事件
public slots:
void updateMap(); // 更新地圖
void createChar(); // 創建字符
void updateScore(); // 更新分數
void updateTime(); // 更新時間
private slots:
void on_startBtn_clicked();
private:
Ui::Dialog *ui;
QList<QString> m_ImgList; // 字母圖片路徑
QList<QPoint> m_PosList; // 字母初始位置
QList<STCHAR> m_CharList; // 字符鏈表
QList<QPoint> m_WallList; // 磚頭列表
int m_key; // 用戶輸入Key
int m_iTime; // 計時時間
int gScore = 0;
};
#endif // DIALOG_H
---------------------
作者:王木木界
來源:CSDN
原文:/sinat_24880087/article/details/52433687
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!