cocos2dx 坐标转换相关函数应用演示

本文通过实例演示了Cocos2d-x中不同坐标系统的转换方法,并详细解释了Touch类与Node类中坐标获取及转换函数的具体含义。

坐标问题对于每一个初学者都是一个必须清晰的问题,但是一口气不能吃成胖子,面对这么函数怎么能一口气全部知道呢,毕竟初学(包括我),所以用现象说话,用实验论证,与其百度,不妨亲手一试,废话不多说上Demo,Code。

Size visableSize=Director::getInstance()->getVisibleSize();

auto block=	LayerColor::create(Color4B(255,0,0,255),200,200);
block->ignoreAnchorPointForPosition(false);
block->setPosition(visableSize.width/2,visableSize.height/2);
this->addChild(block);


auto listenerTouch=EventListenerTouchOneByOne::create();
listenerTouch->onTouchBegan=[=](Touch* t, Event* e){
	//Director::convertToUI
			

	Vec2 ViewPos= t->getLocationInView();
	Vec2 TouchPos=t->getLocation();//内部用的就是convertToGL
	Vec2 NodeSpaceToblock=block->convertToNodeSpace(TouchPos);
	Vec2 WorldSpaceToblock=block->convertToWorldSpace(TouchPos);


	std::string Info="";
	Info+=	StringUtils::format("%20s:(%.0f,%.0f)\r\n","getLocationInView",ViewPos.x,ViewPos.y);
	Info+=	StringUtils::format("%20s:(%.0f,%.0f)\r\n","getLocation",TouchPos.x,TouchPos.y);
	Info+=	StringUtils::format("%20s:(%.0f,%.0f)\r\n","convertToNodeSpace",NodeSpaceToblock.x,NodeSpaceToblock.y);
	Info+=	StringUtils::format("%20s:(%.0f,%.0f)\r\n","convertToWorldSpace",WorldSpaceToblock.x,WorldSpaceToblock.y);

	MessageBox(Info.c_str(),"test");
	return true;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerTouch,this);

随便找一个空场景的Init里面加上此段,就可以用鼠标点击来看看,各种坐标到底转化成了什么。

最后总结:


注:以下位置都是以cocos2dx标准世界坐标系左下角0,0而说的

Touch类中

getLocationInView:等效于 点击位置-右上角位置

getLocation:等效于 点击位置-左下角位置

Node类中

convertToNodeSpace:等效于 点击位置-参照物(本Node)的左下角

convertToNodeSpaceAR:等效于 点击位置-参照物(本Node)的锚点位置

convertToWorldSpace:等效于 点击位置+参照物(本Node)的左下角

convertToWorldSpaceAR:等效于 点击位置+参照物(本Node)的锚点位置

补充:一个简单获得锚点位置的方法

static Vec2 GetWorldPoint(Node* node)
{
  return node->getParent()->convertToWorldSpaceAR(node->getPosition());
}

可以发现如果锚点为(0,0)

convertToNodeSpace等效于convertToNodeSpaceAR

convertToWorldSpace等效于convertToWorldSpaceAR

Director::类静态

注:UIKIT原点左上角,OpenGL原点左下角

convertToGL:把UIKIT坐标->OpenGL坐标

convertToUI:把OpenGL坐标->UIKIT坐标

TMXTiledMap坐标转换

以下是TMX地图坐标转换函数

//pos为OpenGL世界坐标
static Vec2 ConvertToTMXMapPoint(Vec2 pos,TMXTiledMap* map)
{
	Vec2 location=map->convertToNodeSpace(pos);
	Size MapSize=map->getMapSize();
	Size TitleSize=map->getTileSize();
	return Vec2(location.x/TitleSize.width,MapSize.height-1- location.y/TitleSize.height);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值