首页 > > > IOS开发入门介绍.pdf

IOS开发入门介绍.pdf

IOS开发入门介绍.pdf

上传者: ddfqqy 2014-04-08 评分1 评论0 下载75 收藏12 阅读量339 暂无简介 简介 举报

简介:本文档为《IOS开发入门介绍pdf》,可适用于手机软件领域,主题内容包含第一章iPhone开发环境设置Iftheaxisdullanditsedgeunsharpened,morestrengthisneeded铁器钝了符等。

第一章iPhone开发环境设置Iftheaxisdullanditsedgeunsharpened,morestrengthisneeded铁器钝了若不将刃磨快就必多费气力。《旧约•传道书》前言本书的目的是让初学者能够系统的学习iPhone开发的基础知识,让你在学习iPhone软件开发的过程中少走弯路,掌握技术精要,使你能够快速的步入iPhone开发的殿堂,同时也为有经验的开发者提供实用的编程技巧,思路和参考实例,这些宝贵的实例是在进行iPhone开发时需要的第一手素材,是你在实际开发iPhone软件时遇到问题时最珍贵的资源,有效使用这些资源能让你快速解决问题,实现软件需要的功能,节约你大量的宝贵时间。面对一种新技术我们是先学习ObjectiveC还是先熟悉iPhoneSDK用户界面编程还是跟着一些样本代码直接临摹练习?初学者刚刚接触iPhone软件开发的时候往往会有这样的疑惑如何入手从哪里开始?本书从实践出发,由浅入深逐步讲解iPhone软件开发的必要知识要点读者在阅读的同时,也可以编译相关例子代码加深理解也可以将这些例子代码应用到实际的软件开发当中,所以笔者在选材和介绍时尽量做到既不太复杂,又能够满足项目开发的实际需要。安装雪豹操作系统要进行iPhone开发拥有Mac操作系统是最起码的条件然而对许多人而言安装苹果雪豹系统看起来是件很麻烦的事情所以为了帮助初学者快速建立开发环境笔者就以自己的开发环境为例来讲解如何快速建立iPhone开发环境。笔者使用的苹果操作系统是MacOSX版本见下图,笔者的机器CPU和内存参数如下:Intel(R)Core(TM)DuoCPUEGHzGB内存笔者的机器主板配置:华硕(ASUS)PGCMXGBL使用Wine安装SourceInsightSourceInsight是笔者使用过的最优秀的代码阅读和编辑工具,软件包含代码编辑器和代码浏览器内置对CCC#和Java程序的分析功能以及其他语言。你可以添加各种语言语法分析文件CLF(CustomLanguageFile),如ARM,PPC,PIC汇编,verilog语言,Perl,PHP,Python,Ruby,以及Lua,TCL,SQL等各种语言,使用SourceInsight来阅读和分析大型软件源代码可以帮助你快速了解软件模块之间的关系,类之间的继承,函数之间的调用关系等源代码内在关系,是代码分析和编程的优秀工具软件,许多成功的大型商业软件都是使用SourceInsight编辑开发出来的,打开Applications=>Utilities=>打开Terminal,执行如下命令:$mvSiSetupexe~winedrivec$cd~winedrivec$wineSiSetupexe即可启动SourceInsight的安装,接着和Windows安装过程一样,输入序列号直到安装结束,安装完成以后就可以使用SourceInsight强大的代码阅读能力来分析大型软件原代码了,以下是SourceInsight在MacOSX上运行时的工程截图:第二章ObjectiveC编程基础Awisemanwhobuilthishouseontherock,afoolishmanwhobuilthishouseonsand一个聪明人把房子盖在磐石上。无知的人把房子盖在沙土上。《新约•马太福音》ObjectiveC接口编程接口编程之protocolProtocolsprotocol是ObjectiveC中普遍存在的接口定义方式,即在一个类中通过protocol定义接口,在另外的类中实现该接口,这种接口定义方式也称为"delegation"模式,protocol声明了可以被其它任何类实现的方法,协议仅仅是定义一个接口由其它的类去负责实现。"delegation"模式的使用分为三个步骤,分别是接口声明,接口回调和接口实现,我们来看个具体的例子,第一步:接口声明,该接口只有一个方法processSuccessful()声明:ClassWithProtocolh#import<FoundationFoundationh>protocolProcessDataDelegate<NSObject>required(void)processSuccessful:(BOOL)successend定义一个包装类ClassWithProtocol包含该接口:interfaceClassWithProtocol:NSObject{id<ProcessDataDelegate>delegate}接口变量delegate作为类ClassWithProtocol的属性:property(retain)iddelegate同时定义一个任务,在任务完成时回调接口:(void)startSomeProcessend第二步:接口回调,客户在ClassWithProtocol类时会设置delegate属性,所以这里就可以使用该delegate回调客户,代码示范:ClassWithProtocolm#import"ClassWithProtocolh"implementationClassWithProtocolsynthesizedelegate(void)processComplete{回调接口,processSuccessful()由使用者负责具体实现selfdelegateprocessSuccessful:YES}通过定时器,模拟在任务完成时调用接口回调函数(void)startSomeProcess{NSTimerscheduledTimerWithTimeInterval:target:selfselector:selector(processComplete)userInfo:nilrepeats:YES}end第三步:接口实现,编写一个测试类TestAppDelegate实现ProcessDataDelegate接口,代码如下:testappAppDelegateh#import<UIKitUIKith>#import"ClassWithProtocolh"classtestAppObjectinterfaceTestAppDelegate:NSObject<UIApplicationDelegate,ProcessDataDelegate>{UIWindow*windowClassWithProtocol*protocolTest}property(nonatomic,retain)UIWindow*windowend实现接口方法,我们在这里只是简单的输出一条打印语句:(void)processSuccessful:(BOOL)success{NSLog("Processcompleted")}在这里TestAppDelegate类实现接口以后,在ClassWithProtocol类的processComplete()中回调接口方法时就会执行这里的打印语句,完整代码请参考本书附带的protocolExamplezip实例。重要提示:使用protocol模式时,需要注意的是,如果你的对象是另一个对象的delegate,那么在你的对象release之前要将另一个对象的delegate属性设置成nil,否则另一个对象在不知道delegate已经不可用的情况下仍然可能发送消息给其delegate,就可能产生典型的“魔鬼引用”,示范代码:ClassWithProtocol*anotherTestAppDelegate*testanotherdelegate=testdosomework…anotherdelegate=niltestrelease本节的完整Xcode工程代码,请参考本书附带的Protocolzip实例。练习:编程实现"delegation"模式,定义接口模拟简单的加法运算。第三章:iPhoneSDK开发基础Theheartofthediscerningacquiresknowledgetheearsofthewiseseekitout聪明人的心得知识智慧人的耳求知识。《旧约•箴言》UIView层次管理在iOS开发中通过设置UIView的叠放层次,以及其backgroundColor属性等,就可以组合各种UIView来创建各种用户界面,UIView在这里就好像图片处理程序中的层(Layer)对象一样,你可以将一个层显示在最前面,也可以将前面的层推送到背后,或者交换不同层的内容,将一个UIView显示在最前面只需要调用其父视图的bringSubviewToFront()方法,将一个UIView层推送到背后只需要调用其父视图的sendSubviewToBack()方法即可,如下图显示的程序界面:点击"ShowNextPicture"按钮,则程序动态显示不同的图片,实现代码如下:(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{OverridepointforcustomizationafterapplicationlaunchUIView*mainview=UIViewallocinitWithFrame:UIScreenmainScreenboundsmainviewbackgroundColor=UIColorclearColorimageViews=NSMutableArrayallocinitWithCapacity:for(inti=i<i){NSString*name=NSStringstringWithFormat:"appleipadbackgrounddjpg",iUIImage*image=UIImageimageNamed:nameUIImageView*imageView=UIImageViewallocinitWithImage:imageimageViewframe=UIScreenmainScreenboundsimageViewsaddObject:imageViewmainviewaddSubview:imageViewimageViewrelease}windowaddSubview:mainviewmainviewreleasebutton=UIButtonbuttonWithType:UIButtonTypeRoundedRectbuttonsetTitle:"ShowNextPicture"forState:UIControlStateNormalbuttonaddTarget:selfaction:selector(showNext:)forControlEvents:UIControlEventTouchUpInsidebuttonframe=CGRectMake(,,,)buttonautoresizingMask=UIViewAutoresizingFlexibleTopMarginwindowaddSubview:buttonwindowmakeKeyAndVisiblereturnYES}程序首先从文件里面读出文件组成UIImageView数组,并将生成的UIImageView对象加入一个图片容器mainview,mainview是一个背景透明的UIView,这样当容器里面显示不同的UIImageView的时候,用户可以透过容器看见图片,按钮的消息响应函数:(void)showNext:(id)sender{UIImageView*view=nilfor(viewinimageViews){if(viewisInFront){viewsentToBackbreak}}}showNext()函数遍历UIImageView数组,找出当前显示在最前面的图片,找到以后通过sentToBack()函数将其推送到背后,这样其下面的图片就显示出来,sentToBack()函数通过UIView的扩展类实现,其定义如下:第四章:iPhoneSDK高级编程Whenthehayisremovedandnewgrowthappears干草割去嫩草生发。――《旧约•箴言》自定义用户界面控件制作ComboBox控件和UIPikerView设计iOS没有和桌面软件类似的ComboBox界面控件,本节结合UITextField,UIPickerView,以及UIToolbar来实现一个定制的ComboBox控件,控件外观如下图所示,该控件在用户点击文本框旁边的下拉箭头时弹出UIPikerView,在用户滚动UIPikerView时,用户选择的项目将自动填入文本框,用户选择好选项以后,点击蓝色"Done"按钮,即可关闭UIPikerView,下面就介绍如何实现该控件。首先通过子类化UITextField的来实现下拉箭头,同时实现UIPickerView的接口协议,UIPickerViewDataSource和UIPickerViewDelegate,这样子类化的UITextField就可以响应UIPickerView发送的消息,子类的接口定义:interfaceUIComboBox:UITextField<UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>{}重载父类的didMoveToSuperview()消息,加载箭头图片组成UIImageView,然后将UIImageView设置在文本框的最右边,这样就实现了带下拉箭头的文本框:第五章:iPhone企业应用实例分析Byother'sfaults,wisemencorrecttheirown他山之石可以攻玉。――《旧约•箴言》系统介绍这是一个通过手机进行企业工作流和文档管理的项目要求基于Web技术多层架构业务层使用WebService提供服务客户端需要支持iPhoneAndroidBlackberry和WindowsMobile平台,系统框架如下图:系统需求和主要用例项目名称:WebDocMobile系统需求:第六章:iPad软件开发基础Morestrengthisneededbutskillwillbringsuccess得智慧指教便有益处。――《旧约•传道书》Google地图编程iOS虽然提供了MapKitframework这个framework来支持地图程序的开发,但是在实际的项目开发中,开发地图程序往往具有一定的挑战性,本节通过一个“路线测量"程序作为iOS地图软件开发中典型的实例来介绍有关iOS开发的必要编程知识,让读者在iOS地图项目中可以应用这些知识来解决实际项目中的开发问题,“路线测量"启动以后,界面显示出一个Google地图,用户通过点击地图下方的"AddAnnotation"按钮,即可在地图上面添加标注,标注需要一个一个按需要测量的路线顺序添加,在添加标注的时候,主要是注意在路线拐点的地方添加,当需要测量的路线都标注好以后,就可以点击"CreateRoutes"按钮生成路线相对应的曲线,程序按照用户添加的标注路径来生成蓝色曲线,如下图所示:在生成蓝色的路线以后,点击"CalculateDistance"就可以让程序计算出路线有多长的距离,如上图显示的是米程序主要通过MapWebView类实现和GoogleJavascriptAPI的交互,如获取和设置地图中心点位置,放大和缩小地图,移动地图等都是通过这个类和GoogleAPI进行通信MapWebView类的定义:MapWebViewh#import<UIKitUIKith>第七章:iPad商业软件实例分析Allstreamsflowintothesea,yettheseaisneverfull江河都往海里流海却不满。――《旧约•传道书》在大图界面,用户点图片下方的小图片时,则可以查看不同的效果图,点击最右边的小图则可以播放相应的视频,视频截图:用户点击Info小图标时,系统显示当前项目对应的产品信息。第八章:iOS游戏开发基础Wisdomisbetterthanweaponsofwar智慧胜过打仗的兵器。《旧约•传道书》粒子系统粒子系统(ParticleSystem)在iOS游戏开发中占有特殊的重要作用,当要模拟爆炸、烟雾、火焰、闪电等特效时都需要使用粒子系统,粒子系统的算法是比较复杂的课题,需要控制粒子的运动、重力、摩阻、旋转、渐隐、缩放等接下来笔者介绍两个具体的粒子系统实例。轨道卫星这里介绍一个如何制作卫星飞行时尾部喷火的效果,如下图所示:程序使用Chipmunk模拟恒星和卫星飞行,程序启动以后模拟卫星发射,在太空飞行,然后找到距离卫星最近的恒星以后,绕恒星飞行以上图片就是卫星绕恒星飞行的画面,程序没有使用Chipmunk自带的重力模拟而是使用自定义的重力效应函数来模拟恒星的重力。cocosd包含了PointParticleSystem和QuadParticleSystem两个类,使我们可以方便地使用或者实现粒子系统,程序直接使用cocosd库的PointParticleSystem类来实现火焰效果。程序通过定义一个PointParticleSystem的子类SatParticle来设置粒子系统的速度角度等初始化参数:SatParticleh#import"PointParticleSystemh"#import"QuadParticleSystemh"interfaceSatParticle:PointParticleSystem{}end第九章:iOS商业游戏实例分析CanpapyrusgrowtallwherethereisnomarshCanreedsthrivewithoutwater蒲草没有泥岂能发长。芦荻没有水岂能生发。――《旧约•约伯记》概述通过前一章的学习,读者已经对iOS游戏开发有了初步的了解,本章将介绍几个具有代表性质的iOS商业游戏实例,通过对商业游戏实例的学习,让读者了解真实的游戏项目的系统架构,引擎设计,了解声音,视频,图片处理等相关的编程技术要点,以便借鉴和综合应用这些知识到实际的游戏项目开发中,本章提供的游戏都具有极高的商业价值,每个游戏都包含完整的源代码,读者完全可以在这些游戏的基础上创建不同类型的iOS新游戏。闪回(FlashBack)FlashBack是一款融合RPG和FPS的优秀科幻游戏,最早由法国游戏开发商Delphine公司于年发行,从那时起,该游戏就风靡了欧美,其它厂商也纷纷将其移植到了各种流行的游戏平台,游戏以其异常流畅的动画和连贯的动作而赢得用户的喜爱,你扮演的角色是康拉德比哈特先生(ConradBHart),哈特先生试图恢复他失去的记忆而拯救游戏设置的反叛乌托邦世界,在游戏中你将遇到曲折的情节,阴谋外星人,一切你在一个科幻游戏中所期待看到的事情,游戏和神秘岛(Myst)类似,FlashBack可以是一个相当短的游戏,如果你确实非常清楚去哪儿需要使用什么物件,如何干掉敌人。游戏使用经典的REminiscence游戏引擎实现,该引擎也可以在PSP,PalmOS,WinCE等平台运行,引擎和ObjectiveC的接口主要在iPhoneStubh和iPhoneStubmm两个文件中实现,另外游戏实现了一个游戏手柄和其它一些新的iOS用户界面如系统设置等。系统启动后在EmulationViewController类的loadView()初始化方法中创建全局的Game对象,并在runEmulator()中启动游戏主循环,而Game对象则在C代码端的gameh文件中定义。EmulationViewControllerm(void)loadView{systemStub=staticcast<iPhoneStub*>(SystemStubcreate())engine=newGame(systemStub,dataPath,documentsPath,ver)inputController=InputControllerViewallocinitWithFrame:CGRectZeroselfinputControllerTheJoyStick=systemStub>TheJoyStickviewaddSubview:selfinputController}通过本节实例,我们看到一种移植老游戏到iOS平台的途径,就是基于iOS模拟器来实现ObjectC和C,C代码的接口,在ObjectC层面开发新的用户输入协议和界面,而程序功能仍然由老游戏的C,C代码提供,网络上存在许多这样成熟的模拟器可以帮助我们重复利用老游戏代码,减少开发和测试工作量,这也是进行商业iOS游戏开发的一种主要开发方法。本节相关的完整原代码文件请参考本书附带的FlashBackzip工程。法术的释放(GhostCastle)GhostCastle是一款精美的RPG游戏,这款游戏没有使用cocosd游戏开发库,而是直接使用OpenGLES库实现自定义的游戏引擎。游戏的故事是你扮演一个年轻的骑士爵士Lamorak先生喜欢冒险同时也追逐名利想证明在当地乡村的森林附近被长期废弃的城堡中不存在有鬼这样的事情。当Lamorak先生到达铺满青苔的城堡时,他开始感到不安,仿佛有千双眼睛注视着他,当他从骏马上跳下后他的马,最信赖的的伙伴,立刻转身迅即快奔回城留下我们勇敢的爵士Lamorak先生独自一人。伴随着凄厉的冷风对他推搡爵士Lamorak被吹入城堡巨大的木制門里生锈的铰链伴随着吱吱响的声音让人感觉恐怖,慢慢地爵士Lamorak面前一片黑暗,他什么也看不见但可以听到风的呻吟和城堡中滴水的声音,突然一个冷风横扫而过他身后的大門突然紧闭爵士Lamorak感到一阵恐慌,他转身跑到門口拼命想把大門打开但它怎么也打不开了,他被困在了黑暗中。站在黑暗中想知道到底为什么他决定来拜访这个地方爵士Lamorak透过黑暗听到一个邪恶的声音:“只有那些知道如何撤销法术的人可以离开这个地方否则你将和我们在这里永远!”爵士紧张得发抖爵士先生现在站在一个黑暗的城堡绝对不知道如何释放法术在那里可以找到或者邪恶的声音属于谁。但是有一件事情可以肯定他并不孤单。游戏界面:GhostCastle中的TileMap管理TileMap是GhostCastle游戏的核心技术,虽然该技术已经存在了将近年历史,但仍然有在游戏开发中使用它的理由,使用TileMap可以非常简单地将小块图片绘制成大地图,如下图所示就是游戏在tiled地图编辑器中的情形:TileMap通过二维数组将小块图片组织起来绘制屏幕区域,每个Tile都包含一些重要信息,比如:•该Tile绘制的图片ID•该Tile是否为屏障•该Tile是否可以给精灵造成伤害在tiled地图编辑器中将地图编辑好以后,通常会保存为XML格式的tmx文件,在你的游戏中需要解析这个XML文件来重建你的地图,tmx文件包含几个重要的元素:Map元素<mapversion=""orientation="orthogonal"width=""height=""tilewidth=""tileheight="">该元素为tmx文件的顶层元素,包含地图的宽度,高度,Tile的高度宽度等设置,你也可以设置任意多的其它相关属性,比如设置玩家的开始位置,通过Map>MapProperties即可添加:<propertyname="PlayerStartx"value=""><propertyname="PlayerStarty"value=""><properties>Tileset元素Map元素可以包含一个或者多个tileset元素,但是通常的做法是包含一个即可,以下是一个tileset元素在tmx文件中的示例:cocosd中的TileMap管理cocosd提供了很好的TileMap管理类,使用cocosd提供的包装类,你只需要使用很少的代码即可实现TileMap管理,以下是一个原始的包含草坪和雪树的TileMap图片:程序实现地图界面,同时将一棵雪树作为精灵(Sprite)移动到前面:cocosd的TileMap管理示范实例相关的完整原代码文件请参考本书附带的isotilemapzip工程。TileMap在D游戏开发中仍然有着重要意义,使用功能强劲的地图编辑器如Tiled可以帮助你减少大量的地图设计时间,使用属性和objectgroups可以创建数据驱动的游戏,通过修改地图即可快速实现游戏的修改,这样使你的游戏具有强大而灵活的可定制性。通过本节实例,我们看到不采用cocosd库而采用其它的引擎同样可以开发出各种商业iOS游戏,如果你不想使用cocosd库,也可以使用这里提供的游戏引擎来实现你的游戏,而且定制引擎如添加额外的功能的工作量相对于cocosd库来说还要少很多。游戏的完整Xcode工程原代码文件请参考本书附带的GhostCastlezip工程。甜蜜的梦(SweetDreams)"为什么在你做梦的时候,玩具会从一个地方移动到另一个地方"SweetDreams是一款玩起来非常轻松的休闲游戏,游戏使用cocosd开发库进行开发,游戏充分利用iPhone创新的用户界面控制方式,通过倾斜手机移动角色,控制速度和方向,点击屏幕进行跳跃,摇动手机摆动绳索,梦幻般的音乐听起来让人心情愉快,解决难题后即可获得有奖金,以下是游戏的界面:游戏使用"ModelViewControl"模式构建系统框架,并使用BoxD作为物理引擎,引擎则作为模式中的"Model"部分将游戏中的精灵(Sprite)进行对象建模,引擎包括间距连接(DistanceJoint)和旋转连接(RevoluteJoint)将物体连结在一起接受物理作用,每个精灵都对应BoxD的一个刚体(bBody)对象,这样在精灵类对应的视图(View)和控制器(Control)中就可以非常方便地使用BoxD提供的功能。游戏物理建模类图:BaseModelObject的类定义:BaseModelObjecth#import"IModelObjecth"interfaceBaseModelObject:NSObject<IModelObject>{bBody*physicalBodyfloatzfloatwidthfloatheightfloatlinearDampingfloatangularDampingfloatdensityfloatfrictionfloatrestitutionboolhasMassboolisInWaterboolfixedRotation}(id)initInWorld:(bWorld*)mWorldwithRect:(CGRect)mLocationendBaseModelObject类包含物理模型基类的宽度,高度,密度,阻尼,摩擦,还原等属性,游戏中的云朵,花,精灵,房屋等都属于该模型对象,通过这样的物理建模,游戏就可以非常方便地使用BoxD提供的功能来进行精灵的位置更新和"碰撞检测"。加速度传感器(Accelerometer)iOS提供了一个UIAccelerometer类来获取加速度数据,这个类属于Singleton类型,全局唯一,该类从传感器硬件读取数据,如上图所示,总共可以检测六个方向上的加速度,X,Y,Z的取值都在~之间,你只要设置UIAccelerometer对象的delegete为你的对象(比如UIApplication),你的对象就可以在回调接口中收到加速度数据更新通知:UIAccelerometer*accelerometerselfaccelerometer=UIAccelerometersharedAccelerometerselfaccelerometerupdateInterval=selfaccelerometerdelegate=self(void)accelerometer:(UIAccelerometer*)accelerometerdidAccelerate:(UIAcceleration*)acceleration{labelXtext=NSStringstringWithFormat:"X:f",accelerationxlabelYtext=NSStringstringWithFormat:"Y:f",accelerationylabelZtext=NSStringstringWithFormat:"Z:f",accelerationzselfprogressXprogress=ABS(accelerationx)selfprogressYprogress=ABS(accelerationy)selfprogressZprogress=ABS(accelerationz)}游戏在BaseGameLayer类中通过一个NSMutableArray类型的变量inputHandlers来管理Accelerometer控制,并在其didAccelerate()函数中遍历这个数组来将加速度数据通知数组中的各个CharacterController对象,这样各个精灵都能产生加速度作用:BaseGameLayermm(void)accelerometer:(UIAccelerometer*)accelerometerdidAccelerate:(UIAcceleration*)acceleration{for(id<IInputHandler>inputHandlerininputHandlers){inputHandleraccelerometer:accelerometerdidAccelerate:acceleration}}在游戏的场景类中将CharacterController对象加入该数组:CowScenemm(void)spawnChar{selfunschedule:selector(spawnChar)CharacterController*character=CowControllerallocinitCharacter:self:CGRectMake(,,,)autoreleaseselfaddChild:characterz:CHARACTERATLASZselfaddInputHandler:characterspawnExitcloseExit}在CharacterController类的didAccelerate()方法中具体处理加速度数据:CharacterControllermm(void)accelerometer:(UIAccelerometer*)accelerometerdidAccelerate:(UIAcceleration*)acceleration}这里通过勾股定理计算平方根来得到倾斜度,通过将accelerationy和阈值进行比较获得用户移动的方向,即计算精灵应该向左还是向右移动,或者应该保持位置不变,这里移动阈值的定义为加速度最大值的四分之一:#defineMOVEMENTACCELERATIONTHRESHOLDf通过本节实例,我们看到如何采用BoxD物理引擎进行对象建模,如何结合BoxD物理引擎和cocosd库进行真实的商业iOS游戏开发,使用BoxD和cocosd库,将极大地提高游戏开发的效率,cocosd库和BoxD的成熟性可以帮助你编写少量的代码即可实现游戏的各种功能,并且具有强大的灵活性和可扩展性。本节相关的完整原代码文件请参考本书附带的SweetDreamszip工程。毁灭之战(RavagedByWar)RavagedbyWar一款TD防御类游戏,人类的生存受到威胁,你需要建立一系列的防御塔阻止敌人的进攻,敌人有不同的类型,有爬虫类,有飞行类以及各种古怪的类型,游戏有不同的等级和地图可供选择,游戏界面呈现重金属风格,这是一个非常令人上瘾的游戏因为敌人非常的狡猾,会想方设法突破你的防线,你必须快速而有策略地构建你的防线,设计圈套,然后围歼敌人,让敌人认为薄弱的防线其实是陷阱,你在火车上,汽车上,或者午休时间都可能玩它。游戏主界面战争场面A*算法A*算法经常用来计算上述游戏地图中的最短路径问题,该算法也是使用最为广泛的一种算法,算法在搜索过程中设置OPEN和CLOSED两张表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点,并采用启发式评估(HeuristicEstimate)公式将许多明显为坏的路径进行排除,进而快速技术出一条满意的路径,公式如下:F(n)=G(n)H(n)G(n):从起点到目前节点的距离H(n):预测目前节点到目标节点的距离(此为A*算法的主要评价公式)F(n):目前节点的评价分数A*算法描述:第一步:将起始节点A放入OPEN表中。第二步:循环执行本步骤:a)查找OPEN表中代价最小的节点作为"当前节点"(通过评价函数计算)b)将"当前节点"添加进CLOSED表,同时从OPEN表中删除A*算法的伪程序如下:毁灭之战中使用A*算法来计算突破玩家防线的最短路径,算法主要在AStarm文件的shortestPathFromA()函数中实现:AStarm(NSArray*)shortestPathFromA:(CGPoint)aToB:(CGPoint)bOnGrid:(Grid*)gridWithCreepAttribute:(NSInteger)creepAttribute{AStarNode*startNode=AStarNodeAStarNodeWithPositionOnGrid:aAndGoal:bNSMutableArray*closed=NSMutableArrayallocinitautoreleaseNSMutableArray*open=NSMutableArrayallocinitautoreleasereturnnil}在Creepm文件中根据精灵(Creep)当前的位置调用shortestPathFromA()函数来更新其的路径,这样就实现了游戏主要的AI:Creepm(NSArray*)updatePath{GridCell*gc=GameStatesharedGameStatemapmapGridgridCellForPositionOnGrid:selfgridPositionif(!gcisAccessibleWithCreepAttribute:selfattributes){selfgridPosition=selflastGridPosition}selfpathremoveAllObjectsselfpath=AStarshortestPathFromA:selfgridPositionToB:selfexitOnGrid:GameStatesharedGameStatemapmapGridWithCreepAttribute:selfattributesselfcurrentPathIndex=selfperformSelector:selector(moveToNextPoint)withObject:nilafterDelay:selfstopAllActionsreturnselfpath}通过本节实例,我们看到如何在游戏中实现AI,如何使用A*算法实现最短路径计算,游戏中的AI通常是结合使用最佳路径算法和状态机实现游戏精灵的"智能反应",A*算法是游戏最短路径计算中最基本的一个算法,许多大型游戏采用了三层A*算法来实现游戏精灵的路径选择,采用好的AI算法将使你的iOS商业游戏具有更强的娱乐性,同时也更具有竞争性。本节相关的完整原代码文件请参考本书附带的RavagedByWarzip工程。吹吹鱼(PuffPuff)吹吹鱼是一款非常好玩的竞技类游戏,游戏让你游历蓝色的海底世界,你需要掌握游戏技巧,精确进行浮力控制,躲避鲨鱼和珊瑚礁,游戏中你扮演一只鱼为了生存,必须避免和有害物体相撞,如珊瑚礁,海底泄漏的石油,还有鲨鱼,如果相撞你就会减少能量,在游戏屏幕的顶部有能量显示标志,如果你的能量水平达到危险的黑色,就意味着死亡的到来,在快速运动中,如果遇到粉红色的海胆,如果你吃掉它就能够增加能量。游戏界面游戏使用cocosd作为系统框架,并使用Chipmunk作为物理引擎,在GameLayer类的init()方法中初始化Chipmunk引擎,设置碰撞回调函数:GameScenemm(id)init{cpInitChipmunk()cpBody*staticBody=cpBodyNew(INFINITY,INFINITY)space=cpSpaceNew()cpSpaceResizeStaticHash(space,f,)cpSpaceResizeActiveHash(space,,)space>gravity=ccp(,)space>damping=space>iterations=space>elasticIterations=}…通过本节实例,我们看到如何采用Chipmunk物理引擎实现游戏精灵在高速运动中的"碰撞检测",因为Chipmunk引擎回调函数的灵活性,更主要是其有比BoxD更快的速度,所有游戏没有使用BoxD而是使用Chipmunk作为游戏的物理引擎,另外游戏使用cocosd库作为游戏系统框架充分利用库提供的功能可以使系统代码具有更好的模块化组织,更少的代码也使游戏具有更好的扩展性和维护性,结合使用Chipmunk物理引擎和cocosd库可以快速实现你的商业iOS游戏开发,极大地提高游戏开发的效率,使你的创意能在短时间实现,并使你的游戏产品能够以极短的时间上市销售,为你创造利润。本节相关的完整Xcode工程原代码文件请参考本书附带的PuffPuffzip工程。本章总结本章通过具体的iOS商业游戏实例分析,介绍不同类型的iOS商业游戏的核心技术,每个游戏都具有iOS商业游戏的典型性和代表性,读者通过这些实例分析iOS商业游戏的内部构造,系统架构,关键技术,特别是通过对游戏原代码的分析,掌握相关的游戏思路,设计,移植和相关编程知识,以便将这些知识应用到具体的iOS商业游戏项目开发当中。

精彩专题

热门资料

IPprotocolupdate.pdf

破解网页不能复制的方法.txt

网站运营手册.doc

移动通信原理+吴伟陵+牛凯.pdf

编辑推荐

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料换一换

资料评价:

/ 34
所需积分:0 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!