//首先声明一下:
//本文章完全原创,转载请说明出处。
//原文地址:http://blog.csdn.net/u012858622/article/details/21962535
//废话不多说啦直接上代码。
class GameWinSize
{
static GameWinSize* mSize;
GameWinSize();
public:
static GameWinSize* init();
double scale; //除背景 以外 其他的都用它缩放(具体看情况)
double bgScale; //背景用它缩放(具体看情况)
double map_x_sub; //tile map 用到的 一个让 map保持在屏幕中间的 参数 用法 后面介绍
double map_y_sub;//tile map 用到的 一个让 map保持在屏幕中间的 参数 用法 后面介绍
};
#include "GameWinSize.h"
GameWinSize* GameWinSize::mSize=NULL;
GameWinSize* GameWinSize::init()
{
if (mSize==NULL)
{
mSize= new GameWinSize();
CCSize size =CCDirector::sharedDirector()->getWinSize();
//我的资源分辨率是 960*640 宽高比是 3:2 所以用这判断(建议用高清图)
if((size.width/size.height)>=3.0f/2.0f)
{
//除背景 以外 其他的都用它缩放(具体看情况)
double scale_= size.height/640;mSize->scale=scale_;
//背景用它缩放(具体看情况)
double scale_b= size.width/960;mSize->bgScale=scale_b;
}
else
{
//除背景 以外 其他的都用它缩放(具体看情况)
double scale_= size.width/960;mSize->scale=scale_;
//背景用它缩放(具体看情况)
double scale_b= size.height/640;mSize->bgScale=scale_b;
}
mSize->map_x_sub=(size.width/mSize->scale-960)/2.0*mSize->scale;
mSize->map_y_sub=(size.height/mSize->scale-640)/2.0*mSize->scale;
}
return mSize;
}
GameWinSize::GameWinSize()
{
}
用法:
CCSize size=CCDirector::sharedDirector()->getWinSize();
//背景
CCSprite * bgsp =CCSprite::create("***");
bgsp->setPosition(ccp(size.width/2,size.height/2));
//背景缩放就用 bgScale 一切都应该根据当时的情况而定
bgsp->setScale(GameWinSize::init()->bgScale);
//----------------------
//其他 的
CCSprite * sp = CCSprite::create("***");
sp->setPosition(ccp(size.width/2,size.height/2));
//不是背景缩放就用 scale 一切都应该根据当时的情况而定
sp->setScale(GameWinSize::init()->scale);
//位置很重要
//如 在屏幕中间用不用 乘 GameWinSize::init()->scale 如果 挨着左边或者右边 的话 x坐标就不用 乘 GameWinSize::init()->scale 如果挨着上边或者下边 的话 y坐标就不用 乘 GameWinSize::init()->scale 具体怎么设置 请根据你想要的效果设定(小弟能力有限目前还没把他和 cocos2dx 引擎结合在一起,如果有大神的话 还请指点)
CCSprite * sp = CCSprite::create("***");
//设置位置相当重要
sp->setPosition(ccp(500*GameWinSize::init()->scale,130*GameWinSize::init()->scale));
sp->setScale(GameWinSize::init()->scale);
//tile map 用法 :
CCTMXTiledMap* tileMap=CCTMXTiledMap::create(“***”);
tileMap->setAnchorPoint(ccp(0.5,0.5));
tileMap->setPosition(size.width/2,size.height/2);
tileMap->setScale(GameWinSize::init()->scale);
// 注意 从tilemap 里获取的 动对象 或者其他 的 东西 x坐标要加上map_x_sub, y坐标要加上map_y_sub
group = tileMap->objectGroupNamed("Objects");
CCArray* objects =group->getObjects();
CCObject* pObj = NULL;
CCARRAY_FOREACH(objects, pObj)
{
dict=(CCDictionary*)pObj;
if (!dict)
{
break;
}
int x = ((CCString*)dict->objectForKey("x"))->intValue();
x*=GameWinSize::init()->scale;
x+=GameWinSize::init()->map_x_sub;
int y = ((CCString*)dict->objectForKey("y"))->intValue();
y*=GameWinSize::init()->scale;
y+=GameWinSize::init()->map_y_sub;
int width = ((CCString*)dict->objectForKey("width"))->intValue();
width*=GameWinSize::init()->scale;
int height = ((CCString*)dict->objectForKey("height"))->intValue();
height*=GameWinSize::init()->scale;
}
}
//嘿嘿 这就可以了 这个 方法 完全可以做到 所有显示屏 完美适配 (无黑边不拉伸 全屏显示)用这个做的项目已经 上线 (由于是 从 我的分辨率适配系统里浓缩出来的有可能有错误 还请 发现者 及时指出 )这个 还没能喝 cocos2dx 引擎结合起来 用起来 有点麻烦(不过很灵活)还请各位大神把他完善了 嘿嘿。
cocos2dx 一套资源做完美分辨率适配(不拉伸无黑边全屏显示)
最新推荐文章于 2024-05-21 10:52:15 发布