自从发布《如何学习iphone游戏开发》到现在,大概有半年时间了。其实在写《如何学习iphone游戏开发》的时候,我就写下豪言,说哪天学好了,再来写一篇《如何学好iphone游戏开发》。但是现在,当我坐下来写这篇文章的时候,心里还是有点忐忑不安的,怕写不好,或者水平不够,写出来的东西达不到预期的效果。但是,管他呢,我手写我口,我把自己这半年来的学习经历和心得体会,以后自己写博客的经历做了一些小结,希望能给后来人带来帮助。同时,我还会在文章的最后,为初学iphone游戏开发的人指明一些方向,为已经入室的朋友提供一个更好的切磋与交流平台。
首先,基础很重要。像c/c++,特别是指针和内存管理部分,如果理解得不够深刻,那么学习起来会很吃力。不过,你可能会问,“搞iphone游戏开发不是用的objective-c么?“。没错,目前用的最多的应该是objective-c,当然用Unity的除外(里面用的c#和js)。但是,其实objc就是在c的基础之上封装了一层面向对象的特性,同时把我们平常熟知的后缀表达式改成中缀表达试了(也就是语法差异)。而且,但凡学习过c/c++的人都知道,内存管理是非常难的,而且bug基本上都是出在内存上面。所以,导致很多人不喜欢c和c++,转而投向c#和java的怀抱了。我在这里,不想再讨论哪种语言好了,这种话题讨论太多了,再讨论下去也没意思。每种语言都有它的优势与特长,有其应用的领域,有支撑它的公司或组织,有维护它的fans。我们程序员要做的就是,针对问题领域的特点,选择合适的编程环境(包括语言、工具、SDK等)。
那么objc要不要做内存管理呢?目前来说,是要的。但是,在mac上面,objc 2.0引入了垃圾回收机制,而且新版本的sdk ios5,引入了ARC(自动引用计数功能),或许在将来,利用ojbc开发iphone上面的应用和游戏也不需要手动再管理内存了。不过这种自动管理机制肯定会带来运行效率的问题,这和一切的gc机制一样。所以,我们暂且观望一下,到底ios5 的ARC机制表现如何吧。
c/c++的基础好的话,学习objc会非常快,至少我是花了2周时间就把objc学习完了。但是,如果要把objc的内存管理,也就是引用计数掌握的话,那还是需要时日的。这里推荐大家看一些书和blogs。假如你的c/c++基础不是很好的话,建立你在学习objc之前先补一点c和c++相关的知识。《c语言和指针》、《the c programming language》、《c++ primer》、《the c++ programming language》《Thinking in c++》《c++程序原理与实践》,《effective c++》,《more effective c++》、《inside c++ object model》等等。你上网搜一下,推荐c++的书太多了,我这里只是列举了一部分比较经典的,当然,如果你把这些书都看完了。根据这些书后面的Reference还可以把其它的优秀c和c++书籍找出来。我看书都是这样的,看完一本好书,然后按照这本书的参考文献去一本一本地看其实的书,然后看完另一本,又去看其参考文献。这样不仅扩大了自己的知识面,而且能够把握所学知识的来龙去脉。理解地越深刻,你写成程序来就会越得心顺手。当然,这里有这么多书,对了那些天天要加班的程序猿来说,真是伤不起啊。但是,这些东西迟早还是要补的,如果你还在读大学,那么更加要注重这方面了。以后工作了,想静下心来学习真不是那么容易。虽然我也还在学校,但是,看看加班的筒子们天天在咆哮”天天加班有木有!“,想想搞IT的还真是伤不起啊!
但是,编程这玩意儿是慢慢积累起来的。就算你看完了这些书,不去实践,也是没什么很大用的。编程能力其实跟你重复的次数也有一定的关系,如果只会纸上谈兵,也不见得能编写出好的程序来。好了,说了这么多,转而来谈objc吧。如果你觉得c/c++基础还不错,推荐你几本不错的objc书籍。《Programming in Objective-C 2.0》、《Learning Objective-C 2.0》、《objective-c基础教程》,还有就是apple的一些技术手册啦(对了,顺便提一下,大家千万不要留言问我要电子书。你只需要打开google,然后输入英文书籍名+pdf,就ok了!)。学习objc一定不能偷懒,一定要把引用计数来管理内存的方法掌握,因为,后面不管是做应用还是做游戏,80%的问题,你都会卡在内存管理上面。各种crash有木有!各种EXC_BAD_ACCESS有木有!各种莫名其妙的程序挂掉有木有!(大家一定要搞清楚Autorelease Pool, Autorelease Pool Stack,Main Loop,Owner ship,这些概念非常重要,如果你现在还不是很明白的话,多看apple 的objective-c memory programming guide。)
然后,等你objc基础打好了(我其实是先做一些iphone的应用来练手的,因为后面做游戏,很多东西还是要用到UIKit和Cocoa Foundation框架),xcode也摸熟悉了(能够掌握用xcode设置断点调试,能够使用Zombie解决内存问题,能够使用instruments来检测内存泄露和内存分配情况,以及cpu使用率情况,能够新建target,搞得清4.0的schema等),这时候,你再去学习iphone游戏开发会容易一些。至少你对于开发环境和开发工具是熟悉了,遇到问题,自己也能够解决,而不是一天到晚去网上提问或者到群里咆哮了。其实很多时候,自己解决一个问题,比问别人轻而易举地得到答案收获要多得多。如果实在是自己非常不熟悉,搞了好久都没解决的问题,这时候你再拿出来。自己也会把问题描述地更清楚一些,而且和别人的讨论中,有时候也能启迪思路,豁然开朗。有些人喜欢说提问没人回答,其实有很多原因,一是你描述问题不清楚,二是别人也不知道答案,三可能是你根本就没有找到问题。所以,希望大家遇到问题,尽量自己想办法解决,这样绝对是有百益而无一害的。(关于工具的使用,我的博客上有几篇Ray写的objective-c的教程,大家可以看看,在objective-c分类里面)(做应用的话,还可以听一听斯坦福大学的iphone开发视频,现在网易公开课里有,大家可以关注下)
接下来,你是不是可以马上学习iphone游戏开发了呢?先别急,还有一些知识你需要补充一下----那就是编码规范和设计模式。编码规范非常重要,每个平台都有自己的编码风格和规范,如果你遵守这些规范的话,你写的代码能够容易被他人阅读和修改,而你阅读别人的代码也会觉得倍感亲切,因为,它们长相很接近。这里我不详细讨论编码规范了,因为google已经写好了,objective-c编码规范、Apple's Cocoa Coding Guidelines、c++编码规范。为什么又是c++?因为后面学习游戏物理引擎,会用到box2d,到时候是objc和c++混合编程,有些东西需要注意一下。然后,我们谈一下设计模式。对于刚开始接触iphone开发的人来说,最好是先学习半个月左右的应用开发,这对你以后的游戏开发有好处。相信做过iphone应用的人都知道MVC,在apple的世界里面,这个模式被广泛地应用,甚至每一个角落都是MVC。其实,MVC不仅仅是一种模式,一种组织代码的方式,更是一种软件设计的思想。后面我会向大家推荐cocos2d,它是一个开源的2d游戏引擎。因为本身引擎级别的程序都包含了很多软件设计和代码组织的技巧在里面,所以,如果我们对设计模式有一些了解的话,接来阅读cocos2d的源代码将会有具大的帮助。对于设计模式,我推荐两本书,一本是GOF的《设计模式,可复用面向对象软件的基础》,还有一本是《cocoa 设计模式》。当然,如果是初识设计模式的话,最好是先看《Head first 设计模式》和《大话设计模式》。(读到这里,有童鞋可能会纳闷了,你一个学生怎么知道这么多?别忘了,我们有google。如果现在还不知道怎么充分利用网络资源的童鞋,请看看我写的《如何查找资料--我的一些心得和体会》吧!)
现在,(叹一口气吧)让我们来谈谈怎么学习cocos2d吧!cocos2d不仅仅是一个游戏图形引擎,它里面还集成了声音引擎和物理引擎,而且有活跃的社区和丰富的资料。最重要的是,它是开源的,免费的。cocos2d怎么学习呢?之前,大家一般是推荐看知易写的系列教程,我也是这么干的。所以,我在《如何学习iphone游戏开发》里面也是这么建议大家的。知易的教程是永恒的经典,虽然所使用的api比较旧,所演示的例子也比较陈旧,造成很多初学者在实践的过程中,各种函数找不到,各种困惑。所以,我觉得,还是从Ray的教程入手会相对来说容易一些。Ray写的都是英文的,不过,我已经把他的大部分教程翻译成中文了。
现在,我想重新整理一下学习cocos2d iphone游戏开发的过程。
从(译)如何使用cocos2d来做一个简单的iphone游戏教程(第一部分)这篇文章开始,顺藤摸瓜,把这个系列的教程3个部分都看完。然后找到cocos2d-iphone下载的程序里面的一个测试例子TomTheTurret,它位于CocoDension/TestAndDemos目录下面。这个例子是Ray对这个系列教程的完善。
接下来,我觉得可以看看知易写的例子了,把坦克大战的游戏学会。知易的博客地址是:
- 知易Cocos2D-iPhone 游戏开发教程001 (341)
- 知易Cocos2D-iPhone 游戏开发教程002 (94)
- 知易Cocos2D-iPhone 游戏开发教程003 (71)
- 知易Cocos2D-iPhone 游戏开发教程004 (73)
- 知易Cocos2D-iPhone 游戏开发教程005 (65)
- 知易Cocos2D-iPhone 游戏开发教程006 (66)
- 知易Cocos2D-iPhone 游戏开发教程007 (102)
大家记住,如果你使用的是最新版本的cocos2d,那么知易的教程里面可能很多类名和函数名都改了,大家不要怕,其实只是一些很小的改动。比如CCColorLayer改成CCLayerColor,把CCXXXXTransition改成CCTransitionXXXX,把CCXXXXAction改成CCActionXXX,同时把CCSpriteSheet改成了CCSpriteBatchNode等,像这样一些改动。其实只是一些微小的重构,方便大家更好地使用cocos2d引擎。这里,我顺便提一下,有很多人写代码的时候,对于一些变量名和类名的命名很不放在心上。想怎么命名就怎么弄,特别是发现在命名不好之后,还舍不得改。因为,代码引用原来不好的类名太多了,一一改过来很麻烦。但是,其实Xcode是提供refactor功能的。
接下来,大家可以看看
(译)如何在cocos2d里面使用动画和spritesheet
(译)cocos2d精灵教程:第一部分
(译)cocos2d菜单教程:第一部分
(译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分
这里写第一部分,说明是个系列教程,大家可以顺着教程最后的导航一路看过去。相信学习完这些东西以后,你对于sprite,menu,layer,scene,spritesheet,spriteBatchNode,tiledMap应该有一些认识和理解了。
然后,大家可以继续在我的博客上面学习,还有许多其它的教程。建立大家从初级游戏教程看起,然后再是中高级的,然后再看游戏物理分类的教程。
同时,这时候,大家应该去看一些书了。这里推荐2本书,之前也推荐过的《Learn iPhone and iPad Cocos2D Game Development》和《Leaning Cocos2d》。
如果大家把我的博客上面的翻译教程都看完了,同时,上面提到的两本书也看完了的话。当然,重要的是理解了,还要动手实践!!!不要为了数量而乱来,欲速则不达!接下来,最好是拿一些项目来练练手。如果是为公司工作的人,那最好了,直接用公司的项目就可以练手。如果是个人学习,建议从已有的系列教程入手,因为很多图片和声音素材已经有了,你可以在此基础上,再扩展,实现更多更cool的功能。如果你愿意跟我分享你的成果的话,我可以把你的成果写成教程,这样就会有更多的人能从中获益啦。
那么接下来,何去何从呢?我觉得有以下2条路可供选择:
1.继续深入学习cocos2d框架,认真研读cocos2d源代码,体会作者的代码设计与实现思路。然后学习opengles,尝试自己扩展cocos2d框架,在cocos2d的基础上定制出符合自己公司的框架出来。学习opengles,我也推荐几本书《Learning iOS Game Programming》,《Oreilly.iPhone.3D.Programming.May.2010》,《OpenGL ES 2.0 Programming Guide》 。
2.尝试一下cocos2d-x。这是由国人主导的一个开源项目,采用c++,能够跨ios,android,乐phone,win32,linux等多个平台。同时,目前cocos2d-x还提供了lua接口绑定。为什么要选择cocos2d-x?现在ios上面竞争激烈,如果你的游戏能在多个平台上运行,相信吸金来源多个几也会有好处吧?
当然,如果大家想在游戏开发和学习这条路上走得更远的话,建议深入学习数学和物理、计算机图形学、人工智能、数据结构与算法等。我看过一个牛人的博客,说做游戏,最后就只剩下数学和物理了。而我自己在开发的过程中,也感觉数学非常之重要。
(好长啊,快点结束吧!)今后请大家一定要关注Ray的博客,关注http://www.learn-cocos2d.com/这个网站,此网站的作者正在制作一个新的游戏开发包Kobold2D。他把目前与cocos2d相关的资源全部整合进kobold2d里面去了,现在还在preview阶段,相信发布以后会给开发人员带来不少便利。顺便提一下,此作者的网站里面有非常多的资源,上面导航链接里有,右边链接里也有,大家快去围观吧!当然,其实还有一个很重要的学习地方,那就是cocos2d官网:http://www.cocos2d-iphone.org,还有论坛,不要因为是E文的就不去了,看E文才是王道!还有,我差点忘了,一定要学会用git!
还有,为了避免版权问题,Ray有说过只允许别人翻译他写的5篇教程,虽然我写了免责声明,但是,还是有顾虑。所以,以后我会对Ray的教程会做一些“微创新“,用cocos2d-x重新实现一遍。因为现在cocos2d-x的资料实在是太少了。这样,如果大家想看objc版的,直接上Ray的网站上看就可以了,想看c++版的,就看我的吧。
最后,几个朋友商量了一下,专门建立了一个论坛:泰然教程,以此为起点,为大家提供一个更好的学习交流平台。下面是论坛创始人的声明:
泰然论坛团队由一群有共同目标的iOS开发爱好者组成。我们发现国内的技术论坛都或多或少的缺少一些资源,尤其在做一些3D项目的和游戏的时候,尤其OpenGL ES的资源很是稀缺,所以萌生了一个念头:在泰然工作室手上的几个项目完成后,成立一个自己的论坛,为和我们有共同理想的开发者提供平台。今年9月,最后一个项目完成后,我们决定实现这个诺言。 论坛建立之初,我们定的方向主要是OpenGL ES,因为我们的项目经验,可以写一些相关的教程,让大家起步不像我们当年那样艰难。后来,我们把这个想法告诉了子龙山人,发现大家想法都很一致,经过一段时间的相互了解后,我们决定联手创造出一个全新的泰然论坛。 今后,利用之前项目中积累的经验以及测试设备,泰然论坛会给大家带来OpenGL ES教程,CocosD-iPnone和Cocos2D-x教程(后期还会不断扩展);不同于以前博客的是,我们会大力发展原创教程,也包括跨平台的Cocos2D-x教程。 首先,我们强调泰然论坛将是一个免费的开放性论坛,我们不会采取商业运作。 其次,论坛会有一些广告位,我们计划将广告位开放给大家,如果大家有新的app,以后可以联系我们,我们会免费为你的app安排泰然论坛的广告,以帮助大家度过app最初的艰难过程。 最后,如果大家有好的建议或者意见,请告诉我们,这将让我们共同成长。联系邮箱:iven@ityran.com