下面是对推箱子游戏代码的注释解析:
InitMap::InitMap(QWidget *parent) : QWidget(parent)
{
connect(this, SIGNAL(finished()), this, SLOT(NextLevel()));
setFocusPolicy(Qt::StrongFocus);
Init();
}
- 初始化函数
InitMap的构造函数,继承自QWidget类。 - 通过connect函数将当前对象与finished信号和NextLevel槽函数连接起来。
- 设置焦点策略为Qt::StrongFocus。
- 调用Init()函数进行初始化。
void InitMap::Init(){
movie = new QMovie(":/new/prefix1/img/man3.gif");
NumOfPos = 0;
level = 1;
int x0 = 0;
int y0 = 0;
int s = 60;
// 创建并设置标签控件数组
for(int x = 0; x < MAX_X; x++)
for(int y = 0; y < MAX_Y; y++){
QLabel *label = new QLabel(this);
x0 = x*s;
y0 = y*s;
label->setGeometry(x0, y0, s, s);
labels[x][y] = label;
}
InitSence();
emit finished();
}
- 初始化地图的辅助函数
Init(),在构造函数中调用。 - 加载人物动画图片文件”man3.gif”到QMovie对象movie中。
- 初始化NumOfPos为零,level为1.
- 定义变量x0、y0和s,并赋予初始值60。
- 使用双层循环创建标签控件数组,并设置位置和大小。
- 调用InitSence()函数初始化场景。
- 发送finished信号。
void InitMap::InitSence(){
for(int x = 0; x < MAX_X; x++)
for(int y = 0; y < MAX_Y; y++){
labelMatrix[x][y] = NOTHING;
labelMatrix2[x][y] = NOTHING;
labels[x][y]->clear();
}
NumOfPos = 0;
}
- 初始化场景的辅助函数
InitSence(),用于清除并初始化地图矩阵和标签数组。 - 使用双层循环遍历地图矩阵和标签数组,将其元素都设置为NOTHING。
- 清除标签数组中的内容。
- 将NumOfPos重置为零。
void InitMap::displayMap(){
for(int x = 0; x < MAX_X; x++)
for(int y = 0; y < MAX_Y; y++){
if(labelMatrix2[x][y] == POS){
pixmap.load(":/new/prefix1/img/pos2.jpg");
labels[x][y]->setPixmap(pixmap);
labels[x][y]->setScaledContents(true);
labels[x][y]->setVisible(true);
}
switch (labelMatrix[x][y]){
case WALL:
pixmap.load(":/new/prefix1/img/wall2.png");
labels[x][y]->setPixmap(pixmap);
labels[x][y]->setScaledContents(true);
labels[x][y]->setVisible(true);
break;
case BOX:
pixmap.load(":/new/prefix1/img/box2.png");
labels[x][y]->setPixmap(pixmap);
labels[x][y]->setScaledContents(true);
labels[x][y]->setVisible(true);
break;
case MAN:
labels[x][y]->setMovie(movie);
labels[x][y]->setScaledContents(true);
movie->start();
labels[x][y]->setVisible(true);
break;
case NOTHING:
if(labelMatrix2[x][y] != POS){
pixmap.load(":/new/prefix1/img/nothing.png");
labels[x][y]->setPixmap(pixmap);
labels[x][y]->setScaledContents(true);
//labels[x][y]->setVisible(false);
}
break;
default:
break;
}
if(labelMatrix2[x][y] == POS && labelMatrix[x][y] == BOX)
{
pixmap.load(":/new/prefix1/img/posAndBox2.png");
labels[x][y]->setPixmap(pixmap);
labels[x][y]->setScaledContents(true);
labels[x][y]->setVisible(true);
}
}
}
- 显示地图的函数
displayMap(),用于根据地图矩阵和标签数组的内容,显示对应的图像。 - 使用双层循环遍历地图矩阵和标签数组。
- 如果labelMatrix2中对应位置为POS,则加载图片文件”pos2.jpg”到QPixmap对象pixmap中,并设置标签控件labels的图片和可见性。
- 根据labelMatrix中的元素进行不同的处理:
- 如果是WALL,加载图片文件”wall2.png”到pixmap中,并设置标签控件labels的图片和可见性。
- 如果是BOX,加载图片文件”box2.png”到pixmap中,并设置标签控件labels的图片和可见性。
- 如果是MAN,将QMovie对象movie设置为标签控件labels的动画,并启动动画播放,设置标签控件labels的可见性。
- 如果是NOTHING,且labelMatrix2中对应位置不为POS,则加载图片文件”nothing.png”到pixmap中,并设置标签控件labels的图片和可见性。
- 如果labelMatrix2和labelMatrix中对应位置都为POS和BOX,则加载图片文件”posAndBox2.png”到pixmap中,并设置标签控件labels的图片和可见性。
内容由零声教学AI助手提供,问题来源于学员提问




