https://github.com/youngjeff/qt/tree/master/snake
这是下载地址,可以下载看看源码,这是在豆子的源码下我做了一些改变.
开始
在qt中,有自己完整的一套机制来完善游戏控制,
其中三个重要的组建:
QGraphicsScene:能够管理元素的非 GUI 容器;
QGraphicsItem:能够被添加到场景的元素;
QGraphicsView:能够观察场景的可视化组件视图。
在场景坐标就是系统窗口(QGraphicsScene)的坐标,它(0,0)作为它的左上角坐标.
视口坐标相当于场景坐标的数学变换,如当一个窗口坐标为(0,0)至(100,100)那么这个窗口就是实实在在的由100*100个像素组成,此时把坐标变换为(-50,50)(即场景坐标(0,0))至(50,-50)(即场景坐标为(100,100))那么这个视口坐标就是以(0,0)为中心了.当放大缩小item时可以改变视口坐标的大小(如放大1倍)视口坐标可以变为(0,0)至(50,50).
项总是在它们自己的局部坐标中。它们的坐标一般是围绕它们的中心点(0,0),并且这个中心也是左右变换的中心。项坐标系统中的简单几何件一般是指项点、项线、项长方形。
我们从食物开始。因为它是最简单的。我们将其作为一个红色的小圆饼,大小要比地图中的一个方格要小,因此我
们可以将其放置在一个方格中。正如上面分析的那样,我们的 Food 类需要继承 QGraphicsItem。按照接口约束,
QGraphicsItem 的子类需要重写至少两个函数:boundingRect() 和 paint()。
5 boundingRect() 返回一个用于包裹住图形元素的矩形,也就是这个图形元素的范围。需要注意的是,这个矩形必> 须能够 完全包含 图形元素。所谓“完全包含”,意思是,在图形元素有动画的时候,这个矩形也必须将整个图形元
素包含进去。如果范围矩形过小。图形会被剪切;如果范围矩形过大,就会影响性能。
##6
##7 paint() 的作用是使用 QPainter 将图形元素绘制出来。
##8 接下来是有关蛇的处理。
##9
##10 蛇要更复杂一些。在我们的游戏中,蛇是由黄色的小方块组成,这是最简单的实现方式了。第一个是蛇的头部,紧
接着是它的身体。对此,我们有两个必须面对的困难:
##11
##12 蛇具有复杂得多的形状。因为蛇的形状随着游戏者的控制而不同,因此,我们必须找出一个能够恰好包含蛇头和所
有身体块的矩形。这也是 boundingRect() 函数所要解决的问题。
##13 蛇会长大(比如吃了食物之后)。因此,我们需要在蛇对象中增加一个用于代表蛇身体长度的 growing 变量:当 growing 为正数时,蛇的身体增加一格;当 growing 为负数时,蛇的身体减少一格。
##14 advance() 函数用于编码移动部分,这个函数会在一秒内调用 30 次(这是我们在 GameController 的定时器中决
定的)。