Qt实现贪吃蛇(五)

2017-11-28 22:42:30  阅读 237 次 评论 0 条

    细心的你一定会发现我们把文章取名叫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);
        }

    }
}

    绘制的思路很简单,就是将二维的数据绘制成平面上的小方格。其中活动区域、蛇以及食物使用不同的颜色而已。


Qt实现贪吃蛇(六)

本文地址:http://fearlazy.com/index.php/post/50.html
版权声明:本文为原创文章,版权归 fearlazy 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?