Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测

图:

程序代码:

头文件声明函数及变量

	void registerWithTouchDispatcher(void);
	bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
	void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
	void setViewpointCenter(CCPoint position)  ;
	void setSpritePoint(CCPoint position) ;
	CCPoint tileCoordForPosition(CCPoint position);

	 CCSprite *sprite1;
	 CCTMXTiledMap *map;

在init()方法创建tiled地图,获取对象坐标

	map = CCTMXTiledMap::create("map1.tmx");
	this->addChild(map);
	CCTMXObjectGroup *object = map->objectGroupNamed("object1");
	CCDictionary *sprite_object = object->objectNamed("sprite1");

并加载精灵

	float x = ((CCString*)sprite_object->objectForKey("x"))->floatValue();
	float y = ((CCString*)sprite_object->objectForKey("y"))->floatValue();
	CCLOG("sprite postion x: %f, %f", x, y);
	sprite1 = CCSprite::create("yezhu.png");
	sprite1->setPosition(ccp(x, y));
	this->addChild(sprite1);

	setTouchEnabled(true);	//开启触摸事件

然后重载触摸事件

void HelloWorld::registerWithTouchDispatcher()
{
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0, true);
}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
	   return true;
}

处理触摸坐标与精灵坐标位置变量, 让精灵跟随触摸点移动

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCPoint touchlocation = convertTouchToNodeSpace(pTouch);
	CCPoint touchsprite =  sprite1->getPosition();
	CCPoint mpoint;

	CCLOG("touchlocationX:%f, Y:%f  touchspriteX:%f, Y:%f", touchlocation.x, touchlocation.y, touchsprite.x , touchsprite.y);
	//点击坐标x轴减去精灵x轴 绝对值大于 点击坐标在精灵x轴减去精灵x轴
	if (fabs(touchlocation.x-touchsprite.x) > fabs(touchlocation.y-touchsprite.y))
	{
		//点击的坐标x轴大于精灵x轴 在精灵的右侧
		if (touchlocation.x > touchsprite.x)
		{
			mpoint = ccp(touchsprite.x+32, touchsprite.y); //精灵x轴递增移动
		}
		else//点击的坐标x轴小于精灵x轴 在精灵的左侧
		{
			mpoint = ccp(touchsprite.x-32, touchsprite.y);	//精灵x轴递减移动
		}

	}
	//点击坐标x轴减去精灵x轴 绝对值小于 点击坐标在精灵x轴减去精灵x轴
	else
	{
		//点击的坐标y轴大于精灵y轴 在精灵的上侧
		if (touchlocation.y > touchsprite.y)
		{
			mpoint = ccp(touchsprite.x, touchsprite.y+32);	//精灵y轴递增移动
		}
		else //点击的坐标y轴小于精灵y轴 在精灵的下侧
		{
			mpoint = ccp(touchsprite.x, touchsprite.y-32);	//精灵y轴递减移动
		}

	}
	setSpritePoint(mpoint);//设置新坐标移动精灵,并检测碰撞
	CCPoint sp_point = sprite1->getPosition();
	setViewpointCenter(sp_point); //设置视图中心点

}

视角跟随精灵移动

void HelloWorld::setViewpointCenter(CCPoint position)
{
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	float x = MAX(position.x, winSize.width / 2);
	float y = MAX(position.y, winSize.height / 2);
	x = MIN(x, (map->getMapSize().width*map->getTileSize().width) - winSize.width / 2);
	y = MIN(y, (map->getMapSize().height*map->getTileSize().height)- winSize.height / 2);

	CCPoint acturalPosition = ccp(x, y);  

	CCPoint centerView = ccp(winSize.width / 2, winSize.height / 2);
	CCPoint viewPoint = ccpSub(centerView, acturalPosition);
	this->setPosition(viewPoint);

}

检测与石头图素的碰撞,若石头图素属性为true不移动精灵,否则移动精灵

void HelloWorld::setSpritePoint(CCPoint position)
{
	 CCPoint tilecoord = this->tileCoordForPosition(position);//将坐标转换成tile坐标
	 CCTMXLayer *layer = map->layerNamed("layer1") ; //获取地图层
	 int tilegid = layer->tileGIDAt(tilecoord);//获取图素GID值
	 CCLOG("tilegid: %d", tilegid);
	 if (tilegid)
	 {
		 CCDictionary *properties  = map->propertiesForGID(tilegid)	;//根据GID值获取图素属性键值集合
		 if (properties)
		 {
			 const CCString *str = properties->valueForKey("ShiTou");//键值名称
			 if (str && str->compare("true") == 0) 	 //键值
				 return;
		 }
	 }
	 sprite1->setPosition(position);
}

将坐标转换成tile坐标

CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
{
	int x = position.x / map->getTileSize().width;
	int y = ((map->getMapSize().height * map->getTileSize().height) - position.y) / map->getTileSize().height;
	return ccp(x, y);
}

Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测,布布扣,bubuko.com

时间: 2024-10-15 22:26:10

Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测的相关文章

Cocos2d-x Tiled地图编辑器(一)基本使用

8.2 模板 String模块包含一个用途广泛的类,此类为最终用户的编辑提供了简单的语法支持.这让用户不修改应用程序的前提下实现他们应用程序的定制. 这种格式使用$加有效的python标识符(数字.字母和下划线)形式的占位符名称.通过在占位符两侧使用大括号便可以不用空格分隔在其后面跟随更多的字母和数字字符.使用$$来创建一个单独$转码字符. >>> from string import Template >>> t = Template('${village}folk 

Tiled地图编辑器终于可以添加不同尺寸的图片了

一直在关注这个功能,最近(Tiled几乎一年一更新...)新出的版本0.10.0终于添加了这一特性.激动啊!! 具体步骤如下: 1. 如上图,添加Collection of Images类型的图块. 2. 如上图,点击那个箭头(我为如何添加图片找了很久),再点击"Add Tiles"就可以随便选择你要导入的图片了. 另外,新版的Tiled还添加了物理碰撞编辑器的功能(视图->Tile Collision Editor),你可以为图块中的每个图片添加相应的碰撞面积块. 不知不觉间T

Tiled Map地图编辑器键盘快捷键

Tiled是款不错的地图编辑器,不过快捷键真是隐蔽啊,不看github上得wiki根本不知道,用的过程中查英文文档总是觉得慢,所以翻译成了中文. 通用 右键点击图块(tile):复制图块到图章刷(拖动可以复制更大的区域) Ctrl+鼠标滚轮:缩放图块集或地图 Ctrl+加号/减号:缩放地图 Ctrl+0:调整地图到标准大小 Ctrl+对象大小调整:贴合到网格 Ctrl+对象移动:贴合到网格 鼠标中间点击/空格:拖动地图位置 F5:运行默认命令 Ctrl+C:复制 Ctrl+V:粘帖 Ctrl+X

开源地图编辑器 MarbleMap,支持Cocos2d-x坐标系

由9秒社团开发并维护的MarbleMap是支持Cocos2d-x坐标系和as3坐标系的地图编辑器,功能完善高效.这里详细介绍一下它的使用方法! 一.功能简述 由9秒社团开发并维护的MarbleMap是支持Cocos2d-x坐标系和as3坐标系的地图编辑器,功能完善高效.这里详细介绍一下它的使用方法! 二.        控制面板 具体功能将在之后分别介绍. A.        新建 点击"浏览",可以导入地图图片资源.可编辑属性包括:地图名称,网格宽度(像素).网格高度(像素),左下角

XNA 地图编辑器(上)

地图编辑器通常是用来设计世界地图或是游戏的关卡,网络上有很多免费的地图编辑器,像是Mappy.tIDE-其实操作起来原理都是一样的,今天要示范的是tIDE. 地图编辑器通常是用来设计世界地图或是游戏的关卡,网络上有很多免费的地图编辑器,像是Mappy.tIDE-其实操作起来原理都是一样的,今天要示范的是tIDE. 首先到官方网站下载回来安装 (官方载点) 安装完毕开启软件 先下载这张Tile Sheet回去,我们要用这个来拼出地图 (下载) 回到软件画面选择 Tile Sheet > New 按

【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器

从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了.经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了.首先讲讲我的设计目标: 1.地图编辑器 2.道具系统 3.简单AI系统 4.计分器 其中,最重要的就是地图编辑器了,其次到AI系统,其他几个都挺简单的. ---------------------------------------------------------------------------

为android游戏开发-准备的地图编辑器-初步刷地图

采用多文理混合,单页面支持8张文理进行刷绘 为android游戏开发-准备的地图编辑器-初步刷地图,布布扣,bubuko.com

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

地图编辑器V3

V3.0.0 (2014-06-25) DOING---------------------------1. 导出地形图XML:2. 导出引导提示XML:3. 新增加了引导提示编辑功能: 地图编辑器V3