我在做一个贪吃蛇,其中蛇
部分我用了QGraphicsItem,然后游戏在一个网格中进行,每个小格子是20X20大小,然后蛇由若干个20X20的格子组成
class Hunter:public QGraphicsItem
{
int long_snake; //蛇的长度,默认为5(个格子)
QList<QPointF> blody_snake;
.
.
};
这里我设想用一个QList<QPointF>来存放每个格子的坐标,每次蛇移动的时候在容器前段加入一个QPointf,然后
删除末尾的元素
构造函数里有
- long_snake = 5;
- for(int i = 0 ; i < long_snake ; i++)
- {
- QPointF points(i*20,0); //初始的蛇为水平方向上的5个格子
- blody_snake.append(points);
- }
paint()函数很简单,就一句
- painter->fillPath(shape(),Qt::green);
为了获得QPainterPath,我重写了shape()函数
- QPainterPath Hunter::shape()const
- {
- QPainterPath paths;
- for (auto A : blody_snake) //c++11 for范围循环
- paths.addRect(A.x(),A.y(),20,20);
- return paths;
- }
到这里(似乎/应该)一切正常,然后在父对象里为了让蛇移动,每隔1秒就会调用一次advance()函数
- void Hunter::advance(int i) //这里用i代表方向
- { //1上,2下,3左 ,4右
- if(i == 2)
- {
- QPointF heads = *(blody_snake.begin());
- qreal y = heads.y() - 20;
- heads.setY(y); //设置新蛇头坐标
- blody_snake.push_front(heads);//添加蛇头
- blody_snake.pop_back(); //删掉蛇尾
- }
- }
这是其中蛇向下移动的代码,然后
编译完成后
程序初始是这样的
但蛇开始运动的时候。。。
我想我不是把QList<QPointF>末尾用函数删了么。。怎么脱了个尾巴出来。。。
然后我程序又式了几次,时好时坏。。
求真相。。