先上个效果图吧
改个颜色,瞬间帅气了有木有。
实现思路:
自定义一个View,在游戏开始的时候,开启一个定时器,不停地去刷新界面(即调用View的invalidate或者postInvalidate)。在onDraw中去绘制蛇身、食物,并且要判断蛇是否吃到了苹果,是否死亡(碰到边界或者咬到自己)。
其中
· 蛇身可以看做的一些连续的点的集合,用一个List<PointF>来维护。
·食物可以看做是一个点,用一个PointF来维护。
·由于蛇可以拐弯,而且可以连续地拐,所以还需要一个List<PointF>来维护拐点。
绘制过程:
食物的是一个点。可以直接用canvas.drawCircle()来绘制。
难点在于蛇身的绘制,用的是canvas.drawPath()来绘制一系列点的联结,其中path是这样定位的:蛇尾->拐点1->拐点2->拐点3->....->蛇头。这里面的拐点又涉及到一个失效的问题,当蛇身中所有的点都经过了这个拐点的时候,它就失效了。就要从拐点的List中移除它。如果不让它失效的话,会造成绘制混乱,这里不细说。
两个判断:
·是否吃到食物:这个比较容易,只要判断蛇头和食物是否是同一个点即可。但是有一点需要注意,就是在判断过程中不能刷新界面,因为刷新过程中的蛇头是不停移动的。如果不停止刷新,可能会有碰到食物但是吃不到的现象。吃到食物后,蛇身要增加一个点。这里我是加在了尾部。
·是否死亡:
碰到边界死亡:循环蛇身看是否有超出边界的点即可。
咬到自己死亡:看蛇头是否与蛇身中其他点重合即可。
废话两句
我得承认我有个特别不好的毛病,就是做事只做一半。也许就是我成不了大器的原因哈哈。游戏是花了十几个小时完成的,但是还有很多需要完善的地方。比如说:有的时候会不明原因地死掉,有的时候拐点没有失效导致蛇身绘制混乱。因为都是一些随机的情况,真的非常难测试(自己给自己找借口)。我还默默地决定不随便上传源码了哈。