博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d 简单的日常高仿酷跑游戏
阅读量:6259 次
发布时间:2019-06-22

本文共 2826 字,大约阅读时间需要 9 分钟。

1.第一个直接看看这个游戏看起来视频(GIF我们不能满足游戏展)

跑酷游戏最纠结的是地图。碰撞倒是简单,能够自己写或者使用box2d等物理引擎。跑酷游戏地图的特点就是随机性。可是随机中又有策划特意安排的部分。这样让玩家有小小惊喜。所以我就打算这样实现:用地图编辑器编写个几十个地图,然后洗牌掉,从第一个開始取,直到最后最后一个后。再又一次洗牌,取第一个。这样就能突出天天跑酷游戏的特点。

随机中又有特定安排。

游戏中绘制地图当然不能一次所有完毕,那样太慢了。

手机屏幕横向就那么长,初始化两个地图就够了,当快要穿帮时,赶紧绘制一个新的地图贴在第二个地图后面。第一个地图移到屏幕左边时,能够删掉了。这样一直保持两个地图就够了。跟背景反复移动相似。

2.自己定义简单地图编辑器

决定使用地图编辑器后,一个问题就是使用Tiled Map 还是自己做一个。

Tiled Map让我不喜欢的地方是它每个方块都是一个精灵,这样大块的图片会被切割成小块的图,效率非常低。假设使用自己定义object。又不能实时看地图效果。就尝试自己写一个简单的地图编辑器来供这个游戏使用。

我的需求:能够拖动元素摆到地图上,然后导出一个文件。里面有我自己定义格式的内容,供我游戏中使用。

用什么来做是接下来的问题:

地图编辑器能够用普通的Qt来实现,做出来相似Tiled Map的效果。Tiled Map是开源的,能够參考它实现一个。可是没时间这样搞啊。就用cocos2d来做地图编辑器了。当然想要实现非常复杂的编辑器推荐还是參考Tiled Map

简单地做了一个地图编辑器的Demo,发现比想象中的简单:

就是初始一些小的精灵放在最右边,不可移动。

每次touch他们的时候,生成一个新的精灵。而且这个精灵是能够拖动的。这样就能够随意摆放了。

地图文件数据该用什么格式来存储呢?

大致XML。Json是我考虑的两种。认为Json会好点,将来做Cocos2d JS。能够直接包括进来都不须要解析。当然C++这边还是要解析的。Cocos2d 自带 rapid json,解析也不是问题。就决定使用json了。

数据格式大致是这种:

{    "Bones": [{        "positionX": 1657.18,        "positionY": 345.044    }, {        "positionX": 1522.69,        "positionY": 336.114    }, {        "positionX": 1435.41,        "positionY": 259.934    }],    "TopBlocks": [{        "positionX": 2439.34    }],    "Blocks": [{        "blockType": 2    }, {        "blockType": 0    }, {        "blockType": 2    }}]}

地图编辑器是以下这种

简单一个列表。点击一个地图,就编辑一个文件。由于是跑酷游戏。所以这个地图编辑器比較长,有3000像素左右。当然还能够往右无限移动。

3.简单碰撞

碰撞这里我也是自己写的,没实用物理引擎。也比較easy。

一个小技巧是给主角一个nextPositin的变量。跑酷会不断改变这个值,通过碰撞后,才真正把角色的position值设置为nextPosition。

一张图来说:

for(Square* square : squares){                if(hero->nextRight() >= square->getLeft()){            //右边碰撞            if(hero->right() < square->getLeft()){                if(hero->bottom() < square->getTop() && hero->top() > square->getBottom()){                    hero->fixRightColl(square);//碰撞修复和触发事件                }            }            if(hero->left() <= square->getRight()){			    //以下碰撞               if(hero->bottom() >= square->getTop() && hero->nextBottom() <= square->getTop() && hero->top() > square->getTop()){                    hero->fixTopColl(square);//碰撞修复和触发事件                }				//上面碰撞				else if(hero->top() <= square->getBottom() && hero->nextTop() >= square->getBottom() && hero->bottom() < square->getTop()){                    //碰撞后做的事情                }			}        } }
当然碰撞金币等东西。直接推断两个矩形是否相交即可。

for(Bone* bone : bones){                if(hero->right() >= bone->getLeft()){            if(bone->getRect().intersectsRect(hero->getRect())){                bone->removeFromParent();                bones.eraseObject(bone);                sRunGlobal->boneCount = sRunGlobal->boneCount + 1;                RunSound::playEffect(boneEffectName);                break;            }        }            }

4.对象反复使用

跑酷游戏设计到大量的对象创建,消除。

一定要反复使用对象,搞个简单的缓存池即可了。能够參考这篇文《》

第一个是IPhone 下载地址。第二个是android的。点击跳转链接,或者扫描二维码。

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
调用Android中的软键盘
查看>>
Nutz:Ioc
查看>>
无线时代来临,谁来管理我的无线AP?
查看>>
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)...
查看>>
《从零开始学Swift》学习笔记(Day 49)——扩展声明
查看>>
NeHe OpenGL第二十七课:影子
查看>>
免费有理之文件备份软件
查看>>
JavaSE6基于JSR105的XML签名之理论篇
查看>>
hadoop命令——hdfs
查看>>
cocos2d-x自制工具04:AnimatePacker for Mac/Win32 v2.0 Build1发布!
查看>>
ORA 12592的报错处理及补丁更新
查看>>
修改活动目录服务器的IP地址及域名注意
查看>>
C#发送电子邮件
查看>>
xslt中的for-each排序
查看>>
在SQL Server2005中进行错误捕捉
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
文本编辑器实例
查看>>
EntityFramework之一对一关系(二)
查看>>
我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发(CronTrigger强大功能)...
查看>>
Html2Text
查看>>