知易Cocos2D-iPhone 游戏开发教程006

知易Cocos2D-iPhone 游戏开发教程006

在前一章中,我们谈到游戏的场景滚动主要包括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和自己的定时器等。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110432.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • windows虚拟显示器SDK开发和提供

    windows虚拟显示器SDK开发和提供背景这周末闲来无事,整理了下虚拟显示器的源码,发现有几个项目都用到了,但是使用的功能不尽相同:(1)最简单的运用仅仅是需要显示器的拔插;(2)稍微复杂一点的是需要设置显示器的分辨率,包括标准的分辨率,如19201080,还包括非标准的分辨率,如1120900;(3)再复杂一点的需要设置显示器名称、刷新频率、获取虚拟显示器屏幕图像信息。再观察我的那几个项目,都重复的导入了源码,每次发现一个…

  • IDEA汉化教程(一分钟即可)「建议收藏」

    IDEA汉化教程(一分钟即可)「建议收藏」Idea汉化教程(简单,一分钟即可)步骤打开idea点击左上角的File,然后点击Settings(如下图)进去后点击Plugins,然后点击Marketplace,然后再搜索框搜索chinese然后搜索出东西,点击下面标注的,点击安装然后下载好后再点击右侧的安装(由于我已经安装了,所以才有中文跟显示以安装)。安装完后重启就可以看到idea被汉化了…

  • 电子科技大学考研真题在哪找_二本电子科技大学排名

    电子科技大学考研真题在哪找_二本电子科技大学排名全局目录说明:电子科技大学计算机专业基础专业的科目代码2003年是429,2005年不详,2006年改为413,2008年改为820。电子科技大学信息与软件工程学院、计算机科学与工程学院、电子科学技术研究院、自动化工程学院均考此科目。2014年电子科技大学820计算机专业基础考研真题电子科技大学20U年攻读硕士学位硏究生入学考试试题考试科目:820计算机专业基础注:所有答秦必须写…

  • HTML+CSS代码橙色导航菜单

    效果预览:http://hovertree.com/code/texiao/ks63r6aq.htm1<!DOCTYPEhtml>2<htmlxmlns="ht

    2021年12月21日
  • 使用POI替换word中的特定字符/文字改进版

    推荐:http://www.cnblogs.com/roucheng/p/3504465.html

    2021年12月26日
  • echarts地图文档_js下载本地文件

    echarts地图文档_js下载本地文件Echarts实现中国地图,含官方地图资源china.js

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号