前言 |
还记得那是2015年的6月的一场雨后(一场雨,把我困在这里……),老姐拿来了她在QQ空间里看到的一个有趣的游戏:见缝插针。(当时还没入移动开发这行,还是一个刚读大学的愣头青,不知道这是iOS平台上率先推出一款风靡全球的经典休闲游戏:aa)这个网页版的用户体验就没有移动端的感觉好了,不过这都是后来才知道的。诶,这游戏乍一看下不会觉得太难,然后你可能会很快地通过了前面几个很简单的关卡(我最初接触到的只有15关),然后你在8、9关左右可能就会第一次失败,然后很蛋疼的发现游戏又从第1关开始了。一两次还好,要是你好不容易克服“艰难险阻”来到了12、13关,再给你整这么一出,内心的阴影面积可想而知,摔手机的心情都有了!
在“入坑”之后,面对这些东西就不会只是纯粹地欣赏和玩乐了,而是总会下意识地思考这个效果可以兑现为怎样的一段代码。然后借由这个思考结果不断在开发工具里捣鼓摸索着,终于有一日灵光一闪,实验样品出来了。随即又因按捺不住内心的冲动,想要通过某种渠道写点什么东西来分享这么一个实践过程,于是就有了这么一篇文章:iOS平台上aa(见缝插针)游戏的简易实现。
知己知彼,百战不殆 |
玩过aa的朋友都知道,它的游戏逻辑是这样的:每一关你都有不同数量的“针”,中心的圆盘上初始状态可能就会有“针”已经插入就绪,不过这是为增加游戏难度而设计的。你的任务就是将你所在关卡中所持有的所有“针”插入到中心转动的圆盘上去(插入点是相对固定的),前提是不能与其他“针”相互接触,否则游戏宣告失败。为了不让你很快通关,后面的关卡理所当然难度会越来越大,比如圆盘转速增加、初始就绪“针”数和持有针数增加、顺逆时针变速转动(最坑的就是这一点,我在这上面载了不少跟头!),这里之所以叫做简易实现主要是因为Demo只是简单实现了游戏逻辑,没有设置多重关卡,取而代之的是所谓的无尽模式。
因为开始实践这个游戏时,我已经快要期末考试了,所以需要着手准备考试和实习的事情,没有太多的精力去设计游戏的美化和后继的关卡。当然,如果后面有机会的话,应该会有Demo2.0版本。
关于这个游戏的实现,我最开始的想法就是当你点击屏幕时,扩展中心圆盘(CAShapeLayer实例)的path属性,以达到最终“针”插在圆盘上的效果。对于“针”的动态移动过程, 就可以创建一个过渡的“针”视图来等效代替。那么核心的问题就来了:我在扩展图层的路径时,怎么确定绘制的起始点和终点呢?因为在中心圆盘的旋转过程中,其上的个点也会随之一起做仿射变换。如果你在图层旋转时还是以圆盘静止时硬编码取到的起点和终点来确认绘制“针”的话,那么新绘制的“针”就会和之前“插上”的“针”重合在一起,导致的结果就是:无论你怎么“插针”,圆盘上看到的就只有一根“针”,虽然实际上它是很多“针”重叠在一起而表现出来的结果。
那么首要问题就是如何得到当前“针”的绘制起点和终点?
实践是检验真理的唯一标准 |
值得庆幸的是中心转轴是圆形的(故称之为圆盘),而且也只能是在圆形的情况下才能设计出aa这样的游