Qt实现贪吃蛇(五)
细心的你一定会发现我们把文章取名叫Qt实现贪吃蛇,然而到现在为止和Qt没有半毛钱关系。不要着急,接下来就到Qt出手了。事实上前四篇我们把贪吃蛇的游戏逻辑说了一下,这些东西都是不可见的。我们借助Qt把游戏绘制出来。我们把这个绘制的类叫做CGameRender,它继承于QWidget类,然后我们将重写paintEvent,并在该函数中绘制游戏内容。
void CGameRender::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); //抗锯齿 painter.fillRect(rect(),Qt::white); if(NULL != m_pGame) { //绘制游戏活动区域 int nRows = m_pGame->getAreaRows(); int nCols = m_pGame->getAreaCols(); painter.setPen(QPen(Qt::white)); painter.setBrush(QBrush(Qt::green)); qreal perWidth = (qreal)this->width()/nCols; qreal perHeight = (qreal)this->height()/nRows; for(int i = 0; i < nRows; ++i){ for(int j = 0; j < nCols; ++j){ QRectF gridRect(j*perWidth,i*perHeight,perWidth,perHeight); painter.drawRect(gridRect); // painter.drawText(gridRect,Qt::AlignCenter,QString("%1,%2").arg(i).arg(j)); } } //绘制蛇身体 painter.setBrush(QBrush(Qt::red)); std::vector<CSnake::s_body> snake; m_pGame->getSnake()->getSnake(snake); for(int i = 0; i < snake.size(); ++i){ CSnake::s_body body = snake.at(i); QRectF bodyRect(body.by*perWidth,body.bx*perHeight,perWidth,perHeight); painter.drawRect(bodyRect); } //绘制食物 painter.setBrush(QBrush(Qt::yellow)); if(m_pGame->getFoodRow() != -1) { QRectF foodRect(m_pGame->getFoodCol()*perWidth,m_pGame->getFoodRow()*perHeight,perWidth,perHeight); painter.drawRect(foodRect); } } }
绘制的思路很简单,就是将二维的数据绘制成平面上的小方格。其中活动区域、蛇以及食物使用不同的颜色而已。