Cocos实战篇[3.4]――仿COC的一个小Demo总结

【唠叨】

今天结束了本学期任务最为艰巨的项目实训课程,由于项目组里其他成员基本都已经找到实习了,然后他们都去实习了。只留下我和一个小伙伴在一起搞项目实训的小游戏。经过一个月与小伙伴的配合开发,做了一个勉强可以玩的一个小游戏demo,因为平时其他课程也比较繁重,所以游戏做得非常烂~(>_<)~。

我们本来打算做一款类似COC、海盗奇兵、口袋侏罗纪、城堡争霸的城战类的单机Demo。结果……哎说多了都是泪啊,经验不足,吸取教训了。


【经验教训】

由于时间比较紧张,加上自身也没有大项目开发的经验,所以一开始没有太重视去考虑游戏整体架构的问题,都是写一点算一点,从而在开发到一半,发现很多代码没有做到复用,而是一直复制张贴的。然后后期也没有时间去重构,结果导致代码写得比较凌乱不堪。

【收获】

虽然做的效果没有达到预期,但是还是从项目实训中有非常多的收获的。

1、再一次学习了一遍C++,对C++有了更深入的了解。

2、提前学习了各种文件读取解析的方式:JSON、XML、CSV、Sqlite。(最后我们采用了CSV来存储静态数据,用Sqlite来存储玩家数据)。

3、掌握了游戏开发的一些基本流程。

4、学习和掌握了cocos2d-x游戏引擎,cocos studio界面编辑器。

5、掌握了观察者模式委托模式的运用。

6、学习了游戏的自动寻路的A*算法


【项目Demo】

代码写的比较烂,但是我依然又放到了guthub上,只是为了想要存储我写的每一份代码。

因为放在本地硬盘,需要占存储空间的。~~~~(>_<)~~~~ 。

代码托管:https://github.com/shahdza/Cocos_Ring


【成果演示】

做得挺烂的,大家看了不要喷。。。

素材均来自《城堡争霸》,本游戏只做学习研究,切勿商用,以免侵权。。。

游戏概述:

1、玩家城池:可以移动设施、升级设施、新建设施、管理士兵、管理英雄。

2、关卡战斗:可以派出士兵自动寻路攻击,可以控制英雄移动,攻击指定建筑,释放技能。

3、战略地图通过迷雾遮罩,升级雷达,可以扩大地图的可视范围。

视频链接:http://v.youku.com/v_show/id_XOTM0NzQ3NDQ4.html


【开发环境】

Cocos2d-x 3.4

Cocos Studio 1.6.0 (UI编辑器、动画编辑器)



【一些重要的收获】


1、分辨率适配问题

由于地图比较大,可以通过拖动来显示地图的其他区域部分,所以分辨率的适配比较简单。只要宽度或高度适配即可。


2、地图的移动与缩放

可以参见这篇文章:http://cn.cocos2d-x.org/tutorial/show?id=1479

根据手指触摸的数量,来判断是移动还是缩放。

> 一根手指:移动地图,实现比较简单。

> 两根或多根手指:看做两根手指,缩放地图。需要通过一定的公式来计算,缩放前和缩放后的坐标转换。(具体参见上述文章)。

对于手指滑动后,地图又具有惯性地减速移动:可以根据手指滑动的速度快慢,计算出一个加速度(其实可以通过触摸事件onTouchMoved中Touch的getDelta()函数获得),然后通过在update函数中进行减速计算。

缩放的前后坐标计算,如下图所示:

wKiom1UuVT6zaSwTAADJCSJ7bP4141.jpg

wKiom1UuVT6gVXN9AAERd-PyU80724.jpg


3、玩家城池中,建筑的坐标定位

对于45°坐标,可以参照这篇文章:http://blog.sina.com.cn/s/blog_6807f539010103ce.html

由于城池中采用的是斜45°的2.5D视角,所以需要进行坐标的转换操作。

先将城池地图进行瓦片分割,分成一块一块区域。如下所示,其实可以看到地图是一个个小方块组成的。

wKioL1UuWEGTaNIIAAaR-b3RR_A526.jpg



4、关于建筑的触摸移动

当建筑需要移动它的位置的时候,需要屏蔽地图层的移动和缩放,不然你回发现你的建筑和地图都在移动!!!

做法是:触摸到建筑,进行移动时,其实cocos已经有了触摸吞噬的函数

listener->setSwallowTouches(true);即可。

当然还有一种比较好的做法是:定义一个专门处理触摸事件的触摸层,来管理场景中所有元素的触摸事件,并按照触摸的优先级进行排序,然后再按照优先级进行分发触摸响应事件(因为一般触摸只会有一个事件作出响应,也就是说每次的触摸只会有一个元素执行了触摸事件)。


5、关于设施升级、时间点触发某事件等一系列的响应事件

在设施进行升级、或者当到大某一时间点时,可能需要触发一些任务响应事件。可以通过委托模式来处理,即在做某一事件时,给该事件委托一个函数(可以通过函数指针来实现)。然后当某一事件完成后,调用该委托函数(可以不指定为某一特定的函数,而是通过函数指针的形式来调用)。

另一种做法是:通过观察者模式,即一个事件对某一消息进行订阅,然后另一个事件在执行完后,发布该消息,然后第一个事件就接受到了消息,执行相应的处理函数。

例如:士兵攻击建筑时,士兵执行完攻击动作,然后建筑需要作出“扣血”这一事件。就可以通过委托函数来完成,即实现不知道需要执行哪个建筑的“扣血”事件。而是通过函数指针来调用对应士兵所攻击的那个建筑的“扣血”事件处理函数。

至于观察者模式可参见:http://www.jb51.cc/article/p-yilvpdsf-wx.html


6、对于游戏中时间控制的问题

因为是一个城战类的游戏,所以设施的升级是需要一定的时间的,比如升级需要10分钟。还有采矿场每分钟可以生产10个金币等等,都是需要用到“时间”。

做法是:拿设施的升级操作举例,在点击对设施进行升级时,可以记录一个升级时的“时间戳”,并存储到数据库的该设施的一个字段中,然后再游戏进行的过程中,只要不断获取当前时间的“时间戳”,然后减去之前记录的点击升级时的“时间戳”。差值即为从升级到目前过去了多少时间,然后就可以做一些列的操作了。

关于如何获取时间戳,参见:

//获取时间戳
intGlobalManager::getTimeStamp()
{
timevaltm;
gettimeofday(&tm,NULL);
returntm.tv_sec;//返回当前时间对应的时间戳,单位:秒
}


7、战斗界面的AI(自动寻路、自动攻击)

也可以参见:http://cn.cocos2d-x.org/tutorial/show?id=1638

我的做法比较简单,使用状态机:移动、攻击、闲置、已阵亡然后每隔0.5秒执行一次状态转换的操作。

首先将地图分成一块一块,然后用二维bool矩阵来标记障碍物,然后控制士兵、英雄的移动。

> 对于士兵:设置定时器,每隔0.5秒执行一次动作。若士兵还未锁定攻击目标,则遍历设施,找到最近的设施作为目标。若士兵锁定了攻击目标,则可以通过A*算法检测上下左右、左上、右上、左下、右下八个方向的瓦片格子中,是空地,并且里目标建筑最近的,就将士兵往那个格子移动(至于距离:可以通过h函数来估计,我采用的是估计函数:曼哈顿距离,即x坐标之差的绝对值 + y坐标之差的绝对值),这样士兵可以自动绕过障碍物。若目标设施在士兵的可攻击范围内,则对设施进行攻击。

我为什么要尝试每隔一定时间,检测士兵的八个方向,离目标最近,然后移动过去呢?是因为如果士兵锁定了目标后,然后执行完整的A*算法,计算出完整的移动路径,这样的操作是非常耗时的。对于很多个士兵同时执行完整的A*算法进行寻路,可能就会出现卡顿的现象。而我的做法正好避免了这样的问题,将A*算法的每一步操作都均摊到每个0.5秒的时间。

> 对于英雄:通过触摸来控制移动,和攻击某一目标。触摸地图某一位置,英雄移动的操作与士兵的自动寻路和自动攻击思路类似。

> 对于可攻击型建筑:设施定时器,每个0.5秒执行一次。遍历我方士兵、英雄。若有士兵在建筑的可攻击范围内,则攻击我方。


8、头文件的管理

由于类和类之间不是独立存在的,必然会有头文件的相互引用问题,所以我就额外将所有的类的头文件都放到一个public.h文件中,那么其他类只要引用"public.h"头文件即可,而不需要考虑需要引用哪些哪些头文件。

wKiom1UuZBHhmQQzAAHTU9MDijs760.jpg

wKioL1UuZWTTC5uMAAIZROlsClo435.jpg

然后在 public.h文件开头加上文件预编译指令:这样就可以保证头文件不会被多次编译。

#ifndef__Public_H__
#define__Public_H__

#endif


9、全局变量的管理

也是当独放到一个头文件中进行管理的:包含了图片资源的路径、一些全局变量、数据文件的路径等。

wKioL1UuZezAwGT2AALEUE42dU0006.jpg

wKiom1UuZJug3jSdAASN7zAMEcE983.jpg


10、CocosStudio的使用

本游戏用的时Cocos Studio 1.6.0版本。其实这个版本是已经非常强大了,不仅可以做界面UI,而已可以制作角色动画。

使用方法:到官网学习。


11、数据的管理

写了一个专门管理游戏数据的单例类DataManager。用于数据的加载、获取、更新等操作。

对于表现层和控制层有哪些数据修改的请求操作,都通过DataManager进行管理,然后再重新绘制游戏的UI。

wKioL1UuZw_wWdYVAALIo_YgQeQ850.jpg


12、一些全局的辅助函数的管理

也是用了一个GlobalManager单例类来进行管理。提供游戏中的相关的辅助函数。

如:获取最大最小值、地图坐标与瓦片坐标的转换、判断一个点是否落在多边形内、获取时间戳、整形数据和字符串数据的转换、场景的切换管理等功能。

wKioL1UuZ5bASndqAANMgh_AhnA323.jpg



【遇到的问题】


1、瓦片坐标与地图坐标的转换

计算相应的转换公式。


2、两头文件相互引用

需要在类之前,对另一个类做类的声明。


3、野指针问题

当两个建筑都锁定同一个士兵后,第一个建筑执行完攻击动画,然后让该士兵作出扣血事件,正好士兵血没了,就要从图层中移除。可是呢?第二个建筑也锁定了该目标啊,执行玩攻击动画后,调用该士兵的扣血事件,出现了异常。因为该士兵已被释放。。。

解决方案:

(1)一直保留士兵,阵亡后,不从图层中移除,而是将士兵隐藏。

(2)延迟士兵的移除操作。由于建筑是每个0.5秒寻找一次目标,然后对其进行攻击。那么我们只要在士兵阵亡后,用一个变量isDeath来标记士兵是否阵亡,然后建筑在遍历士兵时,跳过isDeath=true的士兵,那么建筑在下一个0.5秒就不会再指向该士兵。那么士兵只要在阵亡后,标记isDeath=true,然后延迟1秒钟后,调用remove()函数从图层中移除,就不会出现野指针异常的问题。

(3)同样也可以通过观察者模式,建筑对士兵的阵亡消息进行订阅,然后当士兵阵亡后,发布阵亡消息。建筑在接收到阵亡消息后,将锁定的目标target指针置为空NULL,即可。


4、中文乱码问题

使用UTF-8即可。


5、游戏AI问题

学习了A*算法。


6、还有其他一些小问题,已忘………………

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

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是