09 qt画图与贪吃蛇游戏的实现

来源:互联网 发布:ce教程找怪物数组基址 编辑:程序博客网 时间:2024/04/29 03:48

前面我们用QLabel对象来显示图像,QLabel对象本身也是一个窗口, 意味着窗口对着需要刷新时,共需要刷新两个窗口(其中一个是QLabel对象). 这样效率不高。 窗口对象其实也是画出来的,如在窗口对象在画出来时,也把图像直接画出来的,这样可以少画出一个子窗口对象.这样可以提高效率。

重新实现QWidget的虚函数. 此虚函数会在窗口重画时触发, 注意不是直接调用的.
virtual void paintEvent(QPaintEvent *event)

我们可以在这个函数里写上要画的什么东西的代码.
通常通过调用QPainter类对象来画.
QPainter对象一般都是在paintEvent函数里创建对象,并指定的操作对象.
QPainter提供了以下函数成员,用于画图.
drawPoint(), drawPoints(), drawLine(), drawRect(), drawRoundedRect(), drawEllipse(), drawArc(), drawPie(), drawChord(), drawPolyline(), drawPolygon(), drawConvexPolygon() and drawCubicBezier().

而且,可以设置QPainter的画笔(画出来的线条是怎样的,粗细,顔色,风格等)
void setPen(const QPen &pen)
void setPen(const QColor &color)
void setPen(Qt::PenStyle style)
// 具体的风格可以在帮助文档里查看

还可以设置QPainter的画刷(即画出来的图像内部是填充什么颜色,图像, 风格等)
void setBrush(const QBrush &brush)
void setBrush(Qt::BrushStyle style)

当需要画出字符时,还可以设置QPainter的字体。
void setFont(const QFont &font)

////////////////////////////////////////////////////////////
贪吃蛇的游戏实现:
1. 需要定时移动蛇, 可用定时器QTimer. 定时器对象超时会发出timeout信号, 需要把这个信号连接到时间处理的槽函数。并调用窗口对象的repaint成员触发paintEvent.
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000)

  1. 蛇就在窗口里的paintEvent里画出来的(可以改造前面的看图程序, 实现数码相册的功能).

  2. 捕扣用户的按键事件。 重写窗口对象的keyPresseEvent虚函数

  3. 蛇每次吃到食物时,节点变多一节, 蛇节点数是不固定。用QList来存放每个节点的数据. 每个节点都 有x, y坐标, 用QPoint类对象存放.

完整工程,下载地址:
http://download.csdn.net/detail/jklinux/9840246 (已修正)

3 0
原创粉丝点击