- 浏览: 665474 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
在前一章中,我们谈到游戏的场景滚动主要包括3种类型:纵向、横向、纵横向。无论何种画面滚动方式,都需要实现主角在地图中的游历。在游历的过程中需要判断:
1) 是否遇到障碍物。
2) 是否被敌方炮弹击中。
以上两种判断都涉及到游戏中一个十分重要的概念:碰撞探测(Collision detection)。本章将在前一章的基础之上,讲解主教精灵如何在地图中漫游,如何实现碰撞探测,如何通过火炮击中敌人。并且给出简单的敌方AI模拟。总之,完成本章学习之后,读者已经可以开始编写类似于“坦克大战”等基本简单游戏了。
下图就是我们示例ZYG007的游戏画面:
游戏的架构
游戏的编程模型
在正式详述示例之前,我们首先就游戏的整体编程模型进行一个简单的概述。每一个游戏都是所谓的现实模拟系统:按照预先规定的频率,将虚拟世界的状态不断的输出到目标屏幕上(每秒多少帧本质上就是每秒重画画面多少次),实现虚拟世界的模拟展示。用户的输入、内部定时器触发的各种程序逻辑通过修改内存变量进而修改虚拟世界的状态实现虚拟世界的运动、场景变化。如下图:
如上图所示,图像引擎按照每秒30次的频率不断将内存数据所描绘的虚拟世界画到iPhone的屏幕上,这就是所谓的30帧/秒。
通常情况下由以下3类独立的程序逻辑组成了游戏程序的主要编程模型。他们的共同点就是在不断修改内存数据:
1)用户输入:玩家通过“触摸”iPhone屏幕,向游戏中的主角对象下达各种指令:向上、下、左、右移动,开炮等。这些指令直接导致游戏中的主角精灵发生状态改变。
2)AI引擎指令:由机器控制的敌方精灵、环境精灵、网络游戏中来自服务器的指令、网络游戏中敌对玩家控制敌对精灵的指令等。这些指令都是针对非玩家控制精灵的状态改变指令。
3)各类定时逻辑。前两类指令直接修改游戏精灵的状态,各种定时检查逻辑则根据各种精灵的相互位置信息判断可能触发的精灵或者环境状态改变:
i. 炮弹击中地方坦克,导致地方坦克爆炸后消失,或者是炮弹击中砖墙,导致砖墙被击碎消失,道路可以通过。再有的就是游戏提示信息更新。
ii. 定期统计一下还有剩余多少敌人,玩家还剩余多少条“命”。
iii. 物理引擎:按照受力分析来显示精灵对象之间的互相作用效果。
iv. Cocos2D-iPhone内置的各种动作,画面变更效果。
以上为游戏的主要内部架构,是我们理解游戏编程的基础。这与我们通常的面向功能的软件编程有很大的区别。与此对应的是游戏程序的调试很难按照通常的单步执行来找Bug的,通常要通过对游戏的运行日志分析来发现问题。
Cocos2d-iphone的编程模型
Cocos2d-iPhone游戏引擎也是基于上述理念设计的,我们在此就这个图像引擎做一个整体性的概述。
1) 内存数据。
CocosNode是最基础的数据单元,通过AddChild函数实现的互相联系起来的CocosNode派生类的实例组成了整个游戏的整体内存数据集合。还记得教程2中的下图么?
每一个场景就代表了当前画面虚拟的游戏世界,不同的场景通过Director对象切换完成整个游戏的各个关卡变化。每一个场景中的所有内容都是由精灵对象都是CocosNode的派生类的实例。
2) 更新引擎。
我们进一步细化之前的那个图:
那个按照预定频率不断更新画面的引擎就是Director对象,Director对象实现该引擎功能包括以下两个核心内容:
a) 如何调用mainLoop函数
从0.8.2开始,cocos2d-iphone开始支持4种形式的Director工作模式,这4重模式的核心不同点就是如何调用mainLoop函数:
l CCDirectorTypeNSTimer:通过Cocoa的NSTimer来定时调用mainLoop。因此保持了与UIKit的友好兼容性,但执行效率最慢。每秒帧数上限可设置。
l CCDirectorTypeMainLoop:这是一个通过While循环来不断调用执行mainLoop的方法,无法与UIKit整合,执行效率很高,每秒帧数上限不可以设置。
l CCDirectorTypeThreadMainLoop:与CCDirectorTypeMainLoop处理和特点都很类似,但让mainLoop运行在主线程中。
l CCDirectorTypeDisplayLink:利用iPhoneOS 3.1新特性,提供高于NSTimer的执行效率,保持与UIKit的兼容性。
无论以上那种工作模式,mainLoop被按照一定的间隔不断被调用这一基本模式是不变的。CCDirectorTypeNSTimer为默认工作模式,考虑到手持设备的电池问题,在游戏对实时性要求不是很高的情况下,建议大家维持使用默认方式,本章示例就是采用的默认方式。
Cocos2d-iPhone在0.8.2之前仅提供CCDirectorTypeNSTimer和CCDirectorTypeMainLoop方式。
b) mainLoop函数执行内容分析
mainLoop函数主要做了以下两件事:
l 触发定时逻辑
关键的调用语句:[[CCScheduler sharedScheduler] tick: dt];
对Cocos2d-iPhone源代码的分下表明,凡是通过类似以下语句来实现动作效果的定时处理逻辑,这里是整个机制的调用点:
[self schedule:@selector(KeepDoing) interval: 1/30];
Cocos2d-iPhone内置的各类动作的执行者 ActionManager就是使用该机制实现动画的。
l 展示当前场景
关键的调用语句:[runningScene_ visit];
该函数将导致,所有的CocosNode派生类实例对象的draw函数将按照父子层级关系被逐一调用,这样就实现了全部游戏画面的展示。
3) 玩家指令
就是我们在第5章中讲的“触摸”事件处理机制。
4) 定时器
都是通过每一个CocosNode的schedule方法来实现的,而该方法内置的单例sharedScheduler就是前面讲的[[Scheduler sharedScheduler] tick: dt]的调用对象。至此,我们可以看出无论读者在Cocos2d中设置多少定时回调逻辑,其实并没有增加系统整体开销。所有的定时调用逻辑,无论是系统的Action还是游戏开发的逻辑最终都是在统一的调用中实现的:Scheduler 类的tick方法。
通过以上分析,我希望读者对Cocos2d-iPhone游戏引擎的编程架构有一个清晰地整体性了解:
1) Cocos2d-iPhone提供不同的更新实现机制:NSTimer和While循环。
2) mainLoop函数确保:
a) 状态更新在屏幕绘制之前被执行。
b) 各种定时器被线序调用。
因此,读取内存数据绘制画面与更新内存数据程序之间,各种不同的基于定时器(schedule)的更新内存数据的程序之间都是线性被调用执行的,不存在内存冲突。而且在每一个定时逻辑的具体处理时间点上,完全可以按照大家都是静止的来处理,也就是说不存在同时变化的任何内存对象。对于内存对象状态的修改都是线续排队执行的。
3) 我们可以放心的使用Cocos2d-iPhone提供的各种动作和效果,他们完全可以与我们的特定逻辑程序友好共处,因为大家的共同基础都是一样的。不要直接使用NSTimer和自己的定时器等。
...
如果您对本文感兴趣,可以到这里下载完整PDF。示例源代码下载。
1) 是否遇到障碍物。
2) 是否被敌方炮弹击中。
以上两种判断都涉及到游戏中一个十分重要的概念:碰撞探测(Collision detection)。本章将在前一章的基础之上,讲解主教精灵如何在地图中漫游,如何实现碰撞探测,如何通过火炮击中敌人。并且给出简单的敌方AI模拟。总之,完成本章学习之后,读者已经可以开始编写类似于“坦克大战”等基本简单游戏了。
下图就是我们示例ZYG007的游戏画面:
游戏的架构
游戏的编程模型
在正式详述示例之前,我们首先就游戏的整体编程模型进行一个简单的概述。每一个游戏都是所谓的现实模拟系统:按照预先规定的频率,将虚拟世界的状态不断的输出到目标屏幕上(每秒多少帧本质上就是每秒重画画面多少次),实现虚拟世界的模拟展示。用户的输入、内部定时器触发的各种程序逻辑通过修改内存变量进而修改虚拟世界的状态实现虚拟世界的运动、场景变化。如下图:
如上图所示,图像引擎按照每秒30次的频率不断将内存数据所描绘的虚拟世界画到iPhone的屏幕上,这就是所谓的30帧/秒。
通常情况下由以下3类独立的程序逻辑组成了游戏程序的主要编程模型。他们的共同点就是在不断修改内存数据:
1)用户输入:玩家通过“触摸”iPhone屏幕,向游戏中的主角对象下达各种指令:向上、下、左、右移动,开炮等。这些指令直接导致游戏中的主角精灵发生状态改变。
2)AI引擎指令:由机器控制的敌方精灵、环境精灵、网络游戏中来自服务器的指令、网络游戏中敌对玩家控制敌对精灵的指令等。这些指令都是针对非玩家控制精灵的状态改变指令。
3)各类定时逻辑。前两类指令直接修改游戏精灵的状态,各种定时检查逻辑则根据各种精灵的相互位置信息判断可能触发的精灵或者环境状态改变:
i. 炮弹击中地方坦克,导致地方坦克爆炸后消失,或者是炮弹击中砖墙,导致砖墙被击碎消失,道路可以通过。再有的就是游戏提示信息更新。
ii. 定期统计一下还有剩余多少敌人,玩家还剩余多少条“命”。
iii. 物理引擎:按照受力分析来显示精灵对象之间的互相作用效果。
iv. Cocos2D-iPhone内置的各种动作,画面变更效果。
以上为游戏的主要内部架构,是我们理解游戏编程的基础。这与我们通常的面向功能的软件编程有很大的区别。与此对应的是游戏程序的调试很难按照通常的单步执行来找Bug的,通常要通过对游戏的运行日志分析来发现问题。
Cocos2d-iphone的编程模型
Cocos2d-iPhone游戏引擎也是基于上述理念设计的,我们在此就这个图像引擎做一个整体性的概述。
1) 内存数据。
CocosNode是最基础的数据单元,通过AddChild函数实现的互相联系起来的CocosNode派生类的实例组成了整个游戏的整体内存数据集合。还记得教程2中的下图么?
每一个场景就代表了当前画面虚拟的游戏世界,不同的场景通过Director对象切换完成整个游戏的各个关卡变化。每一个场景中的所有内容都是由精灵对象都是CocosNode的派生类的实例。
2) 更新引擎。
我们进一步细化之前的那个图:
那个按照预定频率不断更新画面的引擎就是Director对象,Director对象实现该引擎功能包括以下两个核心内容:
a) 如何调用mainLoop函数
从0.8.2开始,cocos2d-iphone开始支持4种形式的Director工作模式,这4重模式的核心不同点就是如何调用mainLoop函数:
l CCDirectorTypeNSTimer:通过Cocoa的NSTimer来定时调用mainLoop。因此保持了与UIKit的友好兼容性,但执行效率最慢。每秒帧数上限可设置。
l CCDirectorTypeMainLoop:这是一个通过While循环来不断调用执行mainLoop的方法,无法与UIKit整合,执行效率很高,每秒帧数上限不可以设置。
l CCDirectorTypeThreadMainLoop:与CCDirectorTypeMainLoop处理和特点都很类似,但让mainLoop运行在主线程中。
l CCDirectorTypeDisplayLink:利用iPhoneOS 3.1新特性,提供高于NSTimer的执行效率,保持与UIKit的兼容性。
无论以上那种工作模式,mainLoop被按照一定的间隔不断被调用这一基本模式是不变的。CCDirectorTypeNSTimer为默认工作模式,考虑到手持设备的电池问题,在游戏对实时性要求不是很高的情况下,建议大家维持使用默认方式,本章示例就是采用的默认方式。
Cocos2d-iPhone在0.8.2之前仅提供CCDirectorTypeNSTimer和CCDirectorTypeMainLoop方式。
b) mainLoop函数执行内容分析
mainLoop函数主要做了以下两件事:
l 触发定时逻辑
关键的调用语句:[[CCScheduler sharedScheduler] tick: dt];
对Cocos2d-iPhone源代码的分下表明,凡是通过类似以下语句来实现动作效果的定时处理逻辑,这里是整个机制的调用点:
[self schedule:@selector(KeepDoing) interval: 1/30];
Cocos2d-iPhone内置的各类动作的执行者 ActionManager就是使用该机制实现动画的。
l 展示当前场景
关键的调用语句:[runningScene_ visit];
该函数将导致,所有的CocosNode派生类实例对象的draw函数将按照父子层级关系被逐一调用,这样就实现了全部游戏画面的展示。
3) 玩家指令
就是我们在第5章中讲的“触摸”事件处理机制。
4) 定时器
都是通过每一个CocosNode的schedule方法来实现的,而该方法内置的单例sharedScheduler就是前面讲的[[Scheduler sharedScheduler] tick: dt]的调用对象。至此,我们可以看出无论读者在Cocos2d中设置多少定时回调逻辑,其实并没有增加系统整体开销。所有的定时调用逻辑,无论是系统的Action还是游戏开发的逻辑最终都是在统一的调用中实现的:Scheduler 类的tick方法。
通过以上分析,我希望读者对Cocos2d-iPhone游戏引擎的编程架构有一个清晰地整体性了解:
1) Cocos2d-iPhone提供不同的更新实现机制:NSTimer和While循环。
2) mainLoop函数确保:
a) 状态更新在屏幕绘制之前被执行。
b) 各种定时器被线序调用。
因此,读取内存数据绘制画面与更新内存数据程序之间,各种不同的基于定时器(schedule)的更新内存数据的程序之间都是线性被调用执行的,不存在内存冲突。而且在每一个定时逻辑的具体处理时间点上,完全可以按照大家都是静止的来处理,也就是说不存在同时变化的任何内存对象。对于内存对象状态的修改都是线续排队执行的。
3) 我们可以放心的使用Cocos2d-iPhone提供的各种动作和效果,他们完全可以与我们的特定逻辑程序友好共处,因为大家的共同基础都是一样的。不要直接使用NSTimer和自己的定时器等。
...
如果您对本文感兴趣,可以到这里下载完整PDF。示例源代码下载。
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1665sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2067今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 593在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1191原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 700从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 548IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 661好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 652在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 735从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 9610、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 8341、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1310关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1161Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 1040iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1251前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 756由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
xcode 4 制作静态库详解
2013-12-20 18:27 567最近在做Apple的IOS开发,有开发静态库的需求,本身IOS ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3134作者:shede333 主页:htt ... -
封装自己的控件库:iPhone静态库的应用
2013-12-20 17:03 600由于iPhone 控件的极度匮乏和自定义组件在重用上的限制,在 ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 883From:http://note.sdo.com/u/xiao ...
相关推荐
这个“知易Cocos2D-iPhone开发教程源代码”提供了一套详细的教程,旨在帮助移动开发新手快速入门游戏开发。通过学习这些源代码,开发者可以深入了解Cocos2D-iPhone的工作原理,掌握其核心概念,并逐步提升编程技能。...
《知易Cocos2D-iPhone 游戏开发教程001》是一个针对初学者的教育资源,旨在帮助用户掌握Cocos2D-iPhone框架进行游戏开发的基础知识。Cocos2D-iPhone是一款广泛使用的开源游戏引擎,尤其适用于iOS平台上的2D游戏开发...
《知易Cocos2D-iPhone 游戏开发教程003》是一个专注于教导开发者如何使用Cocos2D-iPhone框架进行游戏开发的教学资源。Cocos2D-iPhone是Cocos2D的一个分支,专为iOS平台设计,它提供了一个高效、易用的2D游戏开发环境...
在本教程“知易Cocos2D-iPhone 游戏开发教程005”中,我们将深入探讨Cocos2D-iPhone这一强大的游戏开发框架,它为iOS平台上的2D游戏开发提供了丰富的功能和易用性。Cocos2D-iPhone是基于Cocos2D的一个版本,特别针对...
知易Cocos2D-iPhone游戏开发教程:深入解析核心概念与关键技术 在知易Cocos2D-iPhone游戏开发教程002中,我们深入探讨了Cocos2D-iPhone这一流行的游戏开发框架的核心概念与关键技术。本教程旨在帮助初学者及有一定...
《知易Cocos2D-iPhone 游戏开发教程004》是一个专注于教导开发者如何使用Cocos2D-iPhone框架进行游戏制作的教学资源。Cocos2D-iPhone是Cocos2D的一个分支,专为iOS平台设计,它提供了一个高效、易用的2D游戏开发环境...
《知易Cocos2D-iPhone 游戏开发教程007》是一个专注于教导开发者如何使用Cocos2D-iPhone框架进行游戏开发的教学资源。Cocos2D-iPhone是Cocos2D家族的一个分支,专为iOS平台设计,提供了一个高效、易用的2D游戏开发...
《知易Cocos2D-iPhone 游戏开发教程》是一本专为初学者设计的教程,旨在帮助开发者快速掌握使用Cocos2D-iPhone框架进行iPhone游戏开发的技术。Cocos2D-iPhone是一个强大的2D游戏引擎,适用于iOS平台,它提供了丰富的...
《知易Cocos2D-iPhone开发教程》是一份针对初学者的基础且经典的PDF教程,旨在帮助读者快速掌握Cocos2D-iPhone游戏引擎的使用。Cocos2D-iPhone是Cocos2D的一个分支,专门针对iOS平台,用于创建2D游戏、图形界面以及...
《知易Cocos2D-iPhone 游戏开发教程》是一个专为iOS平台上的游戏开发者设计的资源包,旨在帮助初学者和有一定基础的开发者掌握Cocos2D-iPhone框架,进行高效的游戏开发。Cocos2D-iPhone是Cocos2D家族的一员,是一个...
《知易Cocos2D-iPhone 游戏开发教程002》是一个专注于教导开发者如何使用Cocos2D-iPhone框架进行iOS游戏开发的教学资源。Cocos2D-iPhone是Cocos2D的一个分支,专为苹果的iOS平台设计,它提供了一套强大的2D游戏开发...
【标题】"知易Cocos2D-iPhone开发教程-08",这是一份针对Cocos2D-iPhone框架的教程,旨在帮助开发者深入理解并掌握如何在iOS平台上使用Cocos2D进行游戏或应用的开发。"08"表示这是系列教程中的第八部分,意味着它...
《知易Cocos2D-iPhone开发教程》是一套针对初学者的全面教程,涵盖了从基础到进阶的Cocos2D-iPhone游戏开发知识。Cocos2D是一款广泛使用的2D游戏引擎,尤其在iOS平台上深受开发者喜爱。本教程分为8个部分,旨在帮助...
《知易Cocos2D-iPhone开发教程及源代码》是一份专为初学者设计的教程,旨在帮助读者快速入门iPhone游戏开发,特别是在使用Cocos2D-iPhone框架时。Cocos2D-iPhone是Cocos2D的一个分支,特别针对iOS平台进行优化,它是...
《知易cocos2d-iphone完整教程》是一份针对iPhone平台上2D游戏开发的详尽教程,特别适合初学者入门。本教程基于cocos2d-iphone框架,该框架是cocos2d的一个分支,专为iOS设备设计,旨在简化2D游戏和图形应用程序的...
【知易Cocos2D-iPhone游戏开发教程详解】 Cocos2D-iPhone是一个开源的游戏开发框架,专门用于创建iOS平台上的2D游戏、演示和其他图形互动应用。它基于C++,并提供了Objective-C的接口,让开发者可以利用苹果的Swift...