1、关于安卓分辨率适配的一个折中方案
有的时候,在编写游戏的时候,想在不同分辨率的安卓手机上使用同一套背景资源图,就会出现黑边或者不能完全显示的问题。针对这些问题,网友和引擎都给出了解决方案,但是感觉好复杂,选择在学,觉得好难。前段时间在写自己的第一个小游戏的时候,想到了一个折中方案:
CCSize winSize=CCDirector::sharedDirector()->getWinSize(); CCSprite* background=CCSprite::create("Game/bg.png"); background->setScaleX(winSize.width/854); background->setScaleY(winSize.height/480);
这是一段我自己写的代码,创建一个背景。背景资源的大小是854*480(横屏,即宽5854,高480)。这里我用到了两个方法:
setScaleX() setScaleY()
对背景图进行拉伸,拉伸是按照获取到的屏幕宽高和资源的宽高的比例进行拉伸的,并不是简单的使用:
setScale()
对资源进行拉伸。我觉得这样就应该可以一定程度上的根据手机大小进行拉伸或放缩了,并不会把资源的原有比例打破,不会使得显示扭曲。应该是个折中方案吧,应该有更好的方法,随着学习的加深再看吧。
2、新知道的
Cocos2d-x 2.1.5版本中(我一开始就是用这个版本,所以对之前的版本不了解)对于坐标系的转换问题,方法:
CCTouch* pTouch;//假如是触摸传递过来的 CCPoint location=pTouch->getLocation();
这样就直接实现了convertToGL()的转换。当然,关于GL坐标系,世界坐标系等之间的转换还是有点模糊的,还需要再理解。
关于精灵帧缓存:在游戏开始场景加载了,就可以在后面的场景直接使用,这在之前还不知道,现在知道了。
精灵帧缓存的加载与使用:
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("bg/bg.plist","bg/bg.png"); //添加开始界面的背景图 CCSprite* startBG=CCSprite::createWithSpriteFrameName("background.png");
之前对这个不是很熟悉,现在用了几遍了,了解更多了。
精灵动画也可以用精灵帧缓存创建,之前虽然用了,但都不理解:
//精灵动画 CCArray* animatFrams=CCArray::createWithCapacity(4); char str[20]={0}; for (int i=1;i<5;i++) { sprintf(str,"game_loading%i.png",i); //CCLog(str); CCSpriteFrame* frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str); animatFrams->addObject(frame); } CCAnimation* loadingAnimation=CCAnimation::createWithSpriteFrames(animatFrams);
具体方法如上,通过:
CCSpriteFrameCache::sharedSpriteFrameCache->spriteFrameByName("缓存的帧的名字");
方法可以获得一个精灵帧,再:
CCAnimation* animation=CCAnimation::create(); animation->addSpriteFrame("精灵帧");
便将一个精灵帧加入到了animation中了。之前这样做过几次,但都不理解其中的缘由,现在理解清晰了些!