zoukankan      html  css  js  c++  java
  • 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用来检測是否发生了这样的状况。


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

  • 相关阅读:
    【BZOJ5137】Standing Out from the Herd(后缀自动机)
    【BZOJ1564】【NOI2009】二叉查找树(动态规划)
    仙人掌&圆方树学习笔记
    【CF487E】Tourists(圆方树)
    【BZOJ2125】最短路(仙人掌,圆方树)
    【BZOJ4818】序列计数(动态规划,生成函数)
    【BZOJ1023】仙人掌图(仙人掌,动态规划)
    【BZOJ4316】小C的独立集(仙人掌,动态规划)
    【BZOJ4316】小C的独立集(动态规划)
    【BZOJ3240】【NOI2013】矩阵游戏(数论)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5129108.html
Copyright © 2011-2022 走看看