转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了。只是感觉程序不怎么稳定啊。并且发现自己写的东西让我重写一遍的话我肯定写不出来。还要继续学习啊!

上次的进度

实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了。并且对碰到屏幕边缘的情况进行了检測。之前的代码都是部分代码,今天试试把代码整个贴上去。

这两天的进度

打这么多汉字,自个都看不进去。直接上代码:

/////////////////////实现移动///////////////////////
void HelloWorld::moveTank()
{
//初始化所需数据
origPo = player_1->getPosition(); //先得到主角player_1的初始坐标备用
newPo = ccp(0, 0); //初始化目标坐标,主角移动的新坐标就是它
xPo = newPo; //主角的锚点为(0.5f,0.5f),xPo是真正的检測位置。真正的检測位置应该在坦克外面 if (boolleft==true) //向左移动的话
{
player_1->setRotation(-90); //坦克转向左側
newPo = origPo - ccp(10, 0); //设定坦克移动的目的坐标
newPo.x = newPo.x > 30 ? newPo.x : 30; //越界推断 xPo = newPo + ccp(-30, 0); //设定检測位置
xPo.x = xPo.x < 30 ? 30 : xPo.x; //越界推断
}
else if (boolright==true)
{
player_1->setRotation(90);
newPo = origPo + ccp(10, 0);
newPo.x = newPo.x < MAP_WIDTH - 30 ? newPo.x : MAP_WIDTH - 30; //MAP_WIDTH为定义的宏,地图宽度 xPo = newPo + ccp(22, 0);
xPo.x = xPo.x > MAP_WIDTH - 30 ? MAP_WIDTH - 30 : xPo.x;
}
else if (boolup==true)
{
player_1->setRotation(0);
newPo = origPo + ccp(0, 10);
newPo.y = newPo.y < MAP_HEIGHT - 30 ? newPo.y : MAP_HEIGHT - 30; xPo = newPo + ccp(0, 30);
xPo.y = xPo.y > MAP_HEIGHT - 30 ? MAP_HEIGHT - 30 : xPo.y;
}
else if (booldown==true)
{
player_1->setRotation(180);
newPo = origPo - ccp(0, 10);
newPo.y = newPo.y >30 ? newPo.y : 30; xPo = newPo + ccp(0, -22);
xPo.y = xPo.y < 30 ? 30 : xPo.y;
}
//实现碰撞检測
this->collide("layer_1"); //检測layer_1图层。这层仅仅有砖块
float distancePo = origPo.getDistance(player_1->getPosition()); //计算前后是否移动,得出移动距离
if (!distancePo == 0) //假设移动了,就说明这时候砖块层没有碰撞,并且已经设定了新的position
{
player_1->setPosition(origPo); //把position改回来,不让它移动
collide("layer_2"); //检測layer_2层这层仅仅有铁块
}
}



collide函数实现碰撞检測:

void HelloWorld::collide(CCString stringx)
{
const char *str = ""; //定义一个char用来改变检測的图层
if (stringx.compare("layer_1")==0) //推断是哪个图层
{
str = "layer_1";
}
else if (stringx.compare("layer_2")==0)
{
str = "layer_2";
} CCPoint xPo_1; CCPoint xPo_2; //初始化两个新的检測位置 if (boolleft)
{
xPo_1 = xPo + ccp(0, -25); //向左移动的话分别检測原检測位置上下两个新的位置
xPo_2 = xPo + ccp(0, 25);
}
else if (boolright)
{
xPo_1 = xPo + ccp(0, -25);
xPo_2 = xPo + ccp(0, 25);
}
else if (booldown)
{
xPo_1 = xPo + ccp(-25, 0);
xPo_2 = xPo + ccp(25, 0);
}
else if (boolup)
{
xPo_1 = xPo + ccp(-25, 0);
xPo_2 = xPo + ccp(25, 0);
}
CCTMXLayer* wallLayer = tank_war->layerNamed(str); //得到须要检測的图层 CCPoint m_1 = this->changePositionToMap(xPo_1);
int tag_1 = wallLayer->tileGIDAt(m_1); CCPoint m_2 = this->changePositionToMap(xPo_2);
int tag_2 = wallLayer->tileGIDAt(m_2); CCPoint m = this->changePositionToMap(xPo); //将浮点位置坐标转化为TileMap特有的块坐标系统
int wallTag = wallLayer->tileGIDAt(m); //获得地图块上的ID if (wallTag == 0)
{
if (tag_1 == 0)
{
if (tag_2 == 0) //仅仅有三个检測位置都没有阻挡才干移动
{
player_1->setPosition(newPo);
}
}
return;
}
}

须要把浮点型的检測位置坐标转换为TileMap特有的地图块坐标系统,转换坐标的函数:

CCPoint HelloWorld::changePositionToMap(CCPoint po)
{
CCPoint mapPosition;
mapPosition.x = (int)(po.x / 30);
mapPosition.y = (int)((MAP_HEIGHT - po.y) / 30);
return mapPosition;
}

说明:因为前面设定的移动距离为10,就会出现这样的情况。检測点xPo没有砖块。能够向前移动。而砖块在左側却与坦克出现碰撞。这时候就会出现部分的穿墙现象。所以须要设定两个新的检測点xPo_1与xPo_2用来检測是否发生了这样的状况。

今天就先这样吧。接下来要实现坦克开炮。加上敌人,開始界面等等,还有好多没实现的,一步一步来!歇息歇息。去跑步,洗澡,睡觉...哦。祝老爸父亲节快乐...

cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)的更多相关文章

  1. cocos2d-x 旅程開始--(实现单击与长按)

    小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来.近期自己还在学习做小游戏,跟着前辈做了<忍者打怪物>的小游戏,又学习了瓦片游戏<吃西瓜& ...

  2. 忍者无敌-实例解说Cocos2d-x瓦片地图

    实例比較简单,如图所看到的,地图上有一个忍者精灵,玩家点击他周围的上.下.左.右,他能够向这个方向行走. 当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包含了:树.山.河流等. 忍者实例地图 ...

  3. Cocos2d-x使用瓦片地图

    图所示的复杂地图可以使用瓦片地图技术,瓦片地图是用一些小图片(瓦片)拼接而成,这样可以大大地减少内存消耗.如图所示的瓦片地图,只需要如图所示的三个瓦片就可以了. 瓦片地图 地图中的瓦片 瓦片地图的分类 ...

  4. [SpriteKit] 制作瓦片地图小游戏

    概述 SpriteKit制作瓦片地图游戏,深入了解2D游戏制作过程 详细 代码下载:http://www.demodashi.com/demo/10703.html 说实话这个2D游戏实战的入门看的我 ...

  5. 关于Cocos2d-x的瓦片地图

    1.cocos2d-x的瓦片地图是用Tiled地图编辑器做的,这个软件开源,免费,一般都是用它制作瓦片地图. 2.瓦片地图是由块层和对象组成的,块层的作用是显示和一些重叠的时候覆盖角色的作用,而对象是 ...

  6. 【高德地图API】从零開始学高德JS API(五)路线规划——驾车|公交|步行

    先来看两个问题:路线规划与导航有什么差别?步行导航与驾车导航有什么差别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自己定义路线规划功能,这是别家没有 ...

  7. 【高德地图API】从零開始学高德JS API(二)地图控件与插件——測距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    不管是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发人员使用.降低开发人员工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,相似谷歌 ...

  8. 開始折腾cocos2d-x,使用批处理来创建项目

    開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...

  9. 送给刚刚開始学cocos2d-x引擎 移植Android的同学

    刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.cs ...

随机推荐

  1. Android学习笔记(九)——更复杂的进度对话框

    显示操作进度的对话框 1.使用上一篇创建的同一项目.在activity_main.xml文件里加入一个Button: <Button android:id="@+id/btn_dial ...

  2. Entity - 使用EF框架进行增删改查 - 模型先行

    模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...

  3. jquery ajax局部加载方法介绍

    [导读] 在jquery中实现ajax加载的方法有很多种,不像以前的js的ajax只有那一种,下面我们介绍jquery ajax实现局部加载方法总结,有需要了解的朋友可参考.例 代码如下复制代码 $ ...

  4. 博弈论之Nim

    博弈论(一):Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算. Nim游戏是博 ...

  5. 爬虫总结_java

    基于webmagic的爬虫项目经验小结 大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很 ...

  6. Block Internet connection

    https://www.board4allcz.eu/showthread.php?t=625547

  7. Windows环境下访问NFS(33篇Storage的文章)

    Windows环境下访问NFS 使用Solaris时,如果想在两台Solaris之间共享数据,那么你想到的最省事.最方便的方法肯定是nfs.但是现在的学生们的桌面,估计99%以上都是Windows,W ...

  8. SVN权限解析规则详解(转)

    首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先抛开alias和groups不谈,将重点放在路径的权限配置上. 一. 权限格式 svn权限的基本 ...

  9. 同步linux服务器的时间

    1:看系统时间的时候发现有点儿误差,大概在2分钟左右. 于是想自动同步系统的时间. 2:找到ntpdate命令,没有就安装.debian(apt-get install ntpdate) 3:获取时间 ...

  10. Matlab图像处理系列1———线性变换和直方图均衡

    注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操 ...