好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx学习笔记:分辨率坐标适配

最近项目中用到了cocos2dx来开发一个基于陀螺仪的demo,忙了半个星期,一边学习一边开发,总算搞了出来。这里备份下开发中学习到的一些cocos2dx知识。

CONTENTS

如何适配不同分辨率下的坐标?

作者得到的需求是同一套UI下根据不同的分辨率设置不同的坐标。由于时间紧迫,作者就自己实现了一套坐标转换代码。备份如下:

自己实现的:

.h文件:

//coordinate utils
class CU
{
private:
	/************************************************************************/
	/* 0: iphone 4
     1: iphone 5
     */
	/************************************************************************/
	static cocos2d::CCSize visibleSize;
	static cocos2d::CCPoint orignPoint;
	static int currTarget;
	static cocos2d::CCPoint getPoint2(int targetid1, cocos2d::CCPoint p1, int targetid2, cocos2d::CCPoint p2);

public:
	static void setSize(cocos2d::CCSize size, cocos2d::CCPoint orp);
	static cocos2d::CCPoint p(int id);  
	/* ponit select */
	static cocos2d::CCPoint ltp(int id);
};

 .cpp文件:

int CU::currTarget = 0;
cocos2d::CCPoint CU::orignPoint = ccp(0,0);
cocos2d::CCSize CU::visibleSize = CCSizeMake(0,0);

cocos2d::CCPoint CU::getPoint2( int targetid1, cocos2d::CCPoint p1, int targetid2, cocos2d::CCPoint p2 )
{
	if (CU::currTarget == targetid1)
	{
		return p1;
	}
	if (CU::currTarget == targetid2)
	{
		return p2;
	}
	return ccp(0,0);
}
/* 根据不同的size设置获取坐标组合,这里简单的以高度来判断 */
void CU::setSize( cocos2d::CCSize size, cocos2d::CCPoint orp )
{
	CU::orignPoint = orp;
	CU::visibleSize = size;
	if (CU::visibleSize.height > 960)
	{
		CU::currTarget = 1;
	}else
	{
		CU::currTarget = 0;
	}
}

/* id指要获取的UI坐标的ID */
/* 比如10:代表按钮A */
cocos2d::CCPoint CU::p( int id )
{
	cocos2d::CCPoint lt = ltp(id);
	return( ccp( (lt.x + CU::orignPoint.x) , (CU::orignPoint.y + CU::visibleSize.height - lt.y) ) );
}

cocos2d::CCPoint CU::ltp( int id )
{
	switch (id)
	{/* 此处坐标的基准点都是屏幕的左上角,便于美工给坐标 */
	case 10 : return getPoint2(0,ccp(38,24),1,ccp(38,39));//按钮A的坐标
	case 11 : return getPoint2(0,ccp(260,243),1,ccp(260,258));//按钮B的坐标           
	default:
		return ccp(0,0);
	}
}

 使用方式:

//初始化
//初始化其实可以不同初始化,可以通过单例或其他方式来隐藏掉初始化代码,但时间较紧,就直接这样写了。
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CU::setSize(visibleSize, origin);

//使用
sprite->setPosition(CU::p(10));//sprite使用ID为10的坐标

 其他网络资源:

http://www.ityran.com/archives/4809

备注:

由于时间紧张,作者没有详细的设计CU类,其仅仅能完成功能。后续需要优化。

发表评论

18 − 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据