cocos2d制作的手机游戏如何实现在不同cocos2dx分辨率适配的手机上都能全屏匹配

【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】
先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋&&&&每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!!这次新项目专项针对android,目的性强,适配方案我觉得2套图去兼容android各种分辨率;我们先了解一下android手机上的屏幕密度:Android主要有以下几种屏:QVGA和WQVGA屏density=120;HVGA屏density=160;WVGA屏density=240....更多&density值表示每英寸有多少个显示点;和分辨率不一样,大部分做应用的就可以通过屏幕密度走,那么游戏中也可以类似走这种路线;但是现在的出现了超高清屏幕,诸如小米,三星稍微比较高端一点新出的机型分辨率都非常之高达到FHD;FHD级别就是我们所谓的屏幕像素达到了P格式,也就是全高清屏幕的简称了,要适应这种屏幕得单独适配;废话不多了就直接上解决方案吧:思路1:背景适配,然后往背景里面add部分UI原件的方法。先解决背景适配;思路2:根据屏幕尺寸,去适应&屏幕窗口UI原件&,不属于任何原件直接Add到CClayer中的;代码如下:先建立一个VisibleRect类去通过CCEGLView拿到屏幕尺寸,然后再取八个点作为静态方法以后直接当做目标定位使用#ifndef __VISIBLERECT_H__#define __VISIBLERECT_H__#include "cocos2d.h"USING_NS_CC;class VisibleRect{public:
static CCRect getVisibleRect();
static CCPoint left();
static CCPoint right();
static CCPoint top();
static CCPoint bottom();
static CCPoint center();
static CCPoint leftTop();
static CCPoint rightTop();
static CCPoint leftBottom();
static CCPoint rightBottom();private:
static void lazyInit();
static CCRect s_visibleR};#endif /* __VISIBLERECT_H__ */VisibleRect.cpp#include "VisibleRect.h"CCRect VisibleRect::s_visibleRvoid VisibleRect::lazyInit(){
if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f)
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
s_visibleRect.origin = pEGLView-&getVisibleOrigin();
s_visibleRect.size = pEGLView-&getVisibleSize();
}}CCRect VisibleRect::getVisibleRect(){
lazyInit();
return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height);}CCPoint VisibleRect::left(){
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/2);}CCPoint VisibleRect::right(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/2);}CCPoint VisibleRect::top(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height);}CCPoint VisibleRect::bottom(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y);}CCPoint VisibleRect::center(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height/2);}CCPoint VisibleRect::leftTop(){
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);}CCPoint VisibleRect::rightTop(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);}CCPoint VisibleRect::leftBottom(){
lazyInit();
return s_visibleRect.}CCPoint VisibleRect::rightBottom(){
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);}有了这个工具类可以做很多事情了;下面我们需要去适配背景,具体方法如下:CCSprite* PublicShowUI::setTagScale(CCSprite* tagSprite){
float last_X,last_Y;
float X2 = tagSprite-&getContentSize().
float Y2 = tagSprite-&getContentSize().
last_X = ( (float)VisibleRect::getVisibleRect().size.width/X2) ;
last_Y = ( (float)VisibleRect::getVisibleRect().size.height/Y2);
tagSprite-&setScaleX(last_X);
tagSprite-&setScaleY(last_Y);
return tagS
}要适应各种大小分辨率,一套图是不够用的,根据自己项目的需要去制作2套图,我推荐的是如下分辨率套图:800*480 一套 二套HD高清 第三套&1920 * 1080 目前手机上面比较高的,据说三星的超过2000,可以自己去设定!有了这些图,分别整理自己的资源文件夹然后去适配,代码如下:/****************** *获取屏幕分辨率 *根据分辨率计算使用哪一套资源 ******************/int PublicShowUI::getinch(void){
int lastinch = -1;
CCSize winSizeInPixels = screenS
if(winSizeInPixels.width&=800&&winSizeInPixels.width&=960)
lastinch = INCH_1;//ihpone3.5寸
else if(winSizeInPixels.width&960&&winSizeInPixels.width&=1136)
lastinch = INCH_2;//ihpone4寸及大部分android4寸左右屏幕
else if(winSizeInPixels.width&1136&&winSizeInPixels.width&=1920)
lastinch = INCH_MAX;//超高清屏幕
lastinch = INCH_2;
return}/****************** *根据自定义图片路径去取不同套图的路径 *imgres 格式:imgdir%d/imgname.png ******************/CCString* PublicShowUI::getResImgPath(char* imgres){
sprintf(str, imgres ,getinch());
return CCString::create(str);}获取屏幕分辨率screenSize:CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();pDirector-&setOpenGLView(pEGLView);CCSize screenSize = pEGLView-&getFrameSize();&使用:view_Room = new View_Room(this, PublicShowUI::getResImgPath(IMG_ROOM_BACKGROUND), 1, VisibleRect::center());背景图一定要居中显示:VisibleRect::center()OK以上便是我适配的方案和思路;下面我上2张IOS模拟器上的图,我故意再背景图的边框加了绿线,来显示区别显示全屏,然后用了两套图去适配!3.5寸IOS的分辨率如下:&&4寸分辨率如下:&&
最新教程周点击榜
微信扫一扫让Cocos2d-x兑现全屏等比缩放适配Android各种分辨率 续 - 操作系统当前位置:& &&&让Cocos2d-x兑现全屏等比缩放适配Android各种分辨率让Cocos2d-x兑现全屏等比缩放适配Android各种分辨率 续&&网友分享于:&&浏览:989次让Cocos2d-x实现全屏等比缩放适配Android各种分辨率 续
/yangws/archive//2114132.html其实方法很简单,在保持长宽比的前提下缩放图像盖满屏幕,然后用代码获取触摸屏上下左右和斜方向和屏幕边缘相交的8个点+中心点的坐标位置作为定位点,所有血条等UI元素根据9个定位点在屏幕内定位。这样就可以了。根据上面的介绍我git clone /laschweinski/cocos2d-x.git下载了 cocos2d引擎& 并且把作者修改的代码替换,重新编译了cocos2d引擎依赖的库和cocos2dx windows系统也依赖EGL和GLES不同 linux版依赖glfw用的也是opengl版而不是opengles版.编译之前要先***glfw这个库到系统在ubuntu下可以sudo apt-get install libglfw-dev另外png也需要zlib的支持 但是一般的linux环境都有声音依赖fmod库 gpl协议 所以linux版不能用于商业, 看重的是它的mp3格式的支持该库是编译成动态库 所以最好要把它放到/usr/lib下运行sudo sh installLinuxLib.sh 将该声音库文件引进去。用eclipse编译首先编译cocos2dx库eclipse上File-&import-&exsisting projectsselect root directory&&& Path to cocos2dx/cocos2dx/proj.linux编译之,编译后会把编译后的动态库放到 Path to cocos2dx/lib/linux里最后编译helloworld项目引入项目:目录为:Path to cocos2dx/HelloWorld/linux然后配置cocos2dx所***的目录, 为了能找到头文件和库文件目录:在项目右击preference-》c/c++ Build-&Build variables 在变量那更改Value为: Path to cocos2dx/也可以到/home/sunny/cocos2d/cocos2d-x/HelloWorld/android/build_native.sh修改此文件:ANDROID_NDK_ROOT=/cygdrive/e/android-ndk-r5COCOS2DX_ROOT=/cygdrive/d/Work7/cocos2d-xHELLOWORLD_ROOT=$COCOS2DX_ROOT/HelloWorld/android改成自己的路径把helloworld项目导入到eclipse中运行即可
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

参考资料

 

随机推荐