cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

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

上次的进度

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

这两天的进度

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

/////////////////////实现移动///////////////////////
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用来检測是否发生了这样的状况。

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

时间: 2024-11-15 09:27:09

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

在Cocos2d-X3.0中使用瓦片地图中的对象层

在Cocos2d-X中使用瓦片地图是非常常见的,例如在跑酷和塔防游戏中通常会用到瓦片地图,在前面的博客中我也介绍了瓦片地图的使用,这篇博客主要介绍在Cocos2d-X3.0中使用瓦片地图中的对象层,因为3.0和2.0中调用瓦片地图的对象层的方式有所不同 对于瓦片地图的使用可以参考我的博客 瓦片地图编辑器的使用:http://blog.csdn.net/u010105970/article/details/41118191 在Cocos2d-X中使用瓦片地图<一>:http://blog.csd

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

小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来.近期自己还在学习做小游戏,跟着前辈做了<忍者打怪物>的小游戏,又学习了瓦片游戏<吃西瓜>,打算自个做个坦克大战,刚刚起步,希望自己尽力的完毕那.开个帖子记录一下. 前段时间的进度:     下载了各种素材文件,用TileMap制作地图,这里出现了错误,眼下发现"砖块"和"铁块"必须放在不同的图层以下才干执行 否则就会出错,tmx格式的地图不能全然显示

Cocos2d-x之瓦片地图 Tiled

Cocos2d-x之瓦片地图 Tiled 首先使用 瓦片地图编辑器(Tiled) 制作一个瓦片地图,并将其放入工程的Resources目录下 功能实现: 将地图显示在窗体中 将精灵添加到地图定义的对象层中的一个对象上 移动精灵,使其可以和碰撞图层上的精灵发生碰撞 碰撞后碰撞图层上的精灵消失,label字体改变 代码部分: HelloWorldScene.h 1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3 4

Cocos2d-x使用瓦片地图

图所示的复杂地图可以使用瓦片地图技术,瓦片地图是用一些小图片(瓦片)拼接而成,这样可以大大地减少内存消耗.如图所示的瓦片地图,只需要如图所示的三个瓦片就可以了. 瓦片地图 地图中的瓦片 瓦片地图的分类瓦片地图可以有三种分类:直角地图.斜角地图和六边形地图.1.直角地图直角地图,如图所示是使用方形瓦片构建,看上去是垂直向下观察的鸟瞰图,构成瓦片地图的瓦片不一定是正方形,也可以是长方形瓦片. 2.斜角地图斜角地图,如图所示是使用菱形瓦片构建.斜角地图是将视角旋转到45度,斜角地图能够使我们的大脑错误

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

刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.csdn.net/b1boy/article/details/14645277 说说大概的过程: 下载ndk插件,ndk包,cdt插件.最開始我依照书上的下载了cocos2d-x 2.0.1,希望跟书上统一起来,这样以后学习的时候能够參考书上的也不会遇到太多问题.下好了之后就遇到了问题,我的电脑上仅仅有

【雷电】源代码分析(一)-- 进入游戏開始界面

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24941949 源代码下载:http://download.csdn.net/detail/oyangyufu/7289283 进入游戏開始界面效果图: 源代码分析: StartMenu场景--进入游戏開始界面 初始化场景,包含初始Android按键,加入背景图片.加入logo图片.创建游戏菜单開始/设置/关于并加入其响应事件. 初始化飞船漂移动画,背景音乐 程序分析: bool St

站点搭建从零開始(七) WordPress站点的完好

1.WordPress站点前后端经常使用语言简单介绍和执行过程 通常一个站点的整个构建过程中须要大量的技术支持,尤其是用到非常多种计算机语言.站点的构建主要分后端和前端两部分,后端代码在server上执行.而前端程序源代码则通过网络传输到用户的浏览器,由浏览器执行.WordPress站点的页面属于动态页面,也就是说页面是程序动态生成的,不同的人.不同一时候刻訪问同一个网址相应的页面,看到的内容是不一样的.和动态页面相对的是静态页面,静态页面的扩展名通常是html.不须要后端语言动态的生成网页.

【Cocos游戏实战】功夫小子第三课之过渡场景和開始菜单的实现

本节课的视频教程地址是:第三课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也能够领取五天的会员时间哦(即使是购买年会员眼下也不过年费260),成为极客学院学习会员能够无限制的下载和观看全部的学院站点的视频,谢谢您的支持! 经过前面两节课的学习.我们已经知道我们要做的是一个什么样的游戏项目.而且对游戏的基本特点和当中的重难点有了一个主要的认识,而且完毕了项目环境的基本搭建.以及项目基础类等工作. 从这节

cocos2d-x学习日志(18) --程序是怎样開始执行与结束?

问题的由来 怎么样使用 Cocos2d-x 高速开发游戏.方法非常easy,你能够看看其自带的例程,或者从网上搜索教程,执行起第一个HelloWorld,然后在 HelloWorld 里面写相关逻辑代码.加入我们的层.精灵等 ~ 我们并不一定须要知道 Cocos2d-x 是怎样执行或者在各种平台之上执行,也不用知道 Cocos2d-x 的游戏是怎样执行起来的.它又是怎样渲染界面的 ~~~ 两个入口 程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了还有一层的封装,封