【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图&设置自适应屏幕

简介:

 本篇主要介绍Cocos2dx项目开发过程中或者说项目务必遇到的一些知识点(ps.貌似Himi博客写的都是务必的 :tx:  Himi认为写别人没写的才更容易吸引人不是~)

OK,不多说废话,第一个介绍的是修改项目配置让你的Android项目支持自适应屏幕;其实关于Android项目自适应屏幕这个问题,Himi实在不想再多费口舌,一方面因为Himi之前博文有说过,另外一方面现在Android开源缘故造成分辨率泛滥也成必然。大家注意做项目尽可能使用相对位置,别写死坐标,另外一点就是针对流行分辨率做适应就好了,如果你们公司很有必要铺Android市场的量,那么只能一个一个分辨率去搞了=。 = Himi身为Kjava(J2me)一路走过来的Dev来说,我是在是对自适应虐到习惯.....

1.  咳咳,本不想说,回到正题,那么对于Cocos2dx中如何设置项目Android版自适应,其实很easy,直接在编译好的Android项目中如下路径查找:

your Project name/Jni/helloworld/main.cpp

OK,找到main.cpp后双击打开,然后看到如下代码段:

 


  
  
  1. // if you want to run in WVGA with HVGA resource, set it 
  2.        view->create(480, 320); // Please change it to (320, 480);if you're in portrait mode. 

view->create(480,320);默认关闭的,这里打开即可;其实Himi也是从cocos2dx引擎框架中看到的,打开你的任意一个cocos2dx引擎框架的项目,然后打开AppDelegate.cpp 文件,就能看到:

2. 下面继续介绍如何让你的cocos2dx-Android项目设置缩放比例,一样很easy,设置代码如下:

 


  
  
  1. CCDirector::sharedDirector()->setContentScaleFactor(2.0); 

默认值是1.0,缩放2倍,从下面这两张图可以明显看出设置后的区别:(点击放大图片)

 

为了便于后续讲解更容易理解,那么这里Himi博文讲解使用的两行图片这里先给出,大家先看下:

rect.png     规格: 40*40         |            rect-hd.png 规格:80*80

    3.下面介绍如何让cocos2dx的Android版项目使用iOS Retina类似@2x的-hd功能也直接使用高清图片,当然cocos2dx引擎默认找的高清图为-hd;但是编译Xcode的cocos2dx项目到Android版后,Android版可不会那么聪明自动使用你的-hd的版图片,所以下面Himi来手把手教你设置;具体步骤如下:

 3.1  首先在你的项目下找到  CCEGLView_android.cpp ,双击打开:

找到  void CCEGLView::create(int width, int height) 函数,然后函数内替换成如下代码:

 


  
  
  1. void CCEGLView::create(int width, int height) 
  2.      
  3.     if (width == 0 || height == 0) 
  4.     { 
  5.         return; 
  6.     } 
  7.      
  8.     m_sSizeInPoint.width = width; 
  9.     m_sSizeInPoint.height = height; 
  10.      
  11.     // calculate the factor and the rect of viewport     
  12.     m_fScreenScaleFactor =  MIN((float)m_sSizeInPixel.width / m_sSizeInPoint.width, (float)m_sSizeInPixel.height / m_sSizeInPoint.height); 
  13.     CCLOG("CCEGLView::Create / Screen Scale Factor = %f", m_fScreenScaleFactor); 
  14.     if (m_fScreenScaleFactor >= 1.5f) 
  15.     { 
  16.         CCLOG("CCEGLView::Create / HD Scale Factor => Increase Content Scale Factor"); 
  17.         cocos2d::CCDirector::sharedDirector()->setContentScaleFactor(2.0f); 
  18.     } 
  19.     int viewPortW = (int)(m_sSizeInPoint.width * m_fScreenScaleFactor); 
  20.     int viewPortH = (int)(m_sSizeInPoint.height * m_fScreenScaleFactor); 
  21.     m_rcViewPort.origin.x = (m_sSizeInPixel.width - viewPortW) / 2; 
  22.     m_rcViewPort.origin.y = (m_sSizeInPixel.height - viewPortH) / 2; 
  23.     m_rcViewPort.size.width = viewPortW
  24.     m_rcViewPort.size.height = viewPortH
  25.      
  26.     m_bNotHVGA = true;     

 3.2   继续在你的项目下找到CCFileUtils_android.cpp  类,双击打开:

找到  const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath) 函数,然后替换如下内容:

 


  
  
  1. const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath) 
  2.     
  3.     if (CC_CONTENT_SCALE_FACTOR() == 2.0f) 
  4.     { 
  5.          
  6.         //CC_RETINA_DISPLAY_FILENAME_SUFFIX 
  7.         // verifier si suffix deja present 
  8.         std::string path = pszRelativePath; 
  9.         std::string::size_type pos = path.rfind("/") + 1// the begin index of last part of path 
  10.          
  11.         std::string::size_type suffixPos = path.rfind(CC_RETINA_DISPLAY_FILENAME_SUFFIX); 
  12.         if ((std::string::npos != suffixPos) && (suffixPos > pos)) 
  13.         { 
  14.             // => if yes, return path directly 
  15.         } 
  16.         else 
  17.         { 
  18.             // => if no, add "retina"/hd suffix and test if file exist 
  19.             CCString *pRet = new CCString(); 
  20.             pRet->autorelease(); 
  21.             pRet->m_sString = path.substr(0, path.rfind(".")) + CC_RETINA_DISPLAY_FILENAME_SUFFIX + path.substr(path.rfind("."), path.length()); 
  22.              
  23.             if (existFileData(pRet->m_sString.c_str())) 
  24.             { 
  25.                 //    => if yes, return path with suffix 
  26.                 CCLog("cocos2d: FilePath(%s) with suffix(%s) exist, use it.", pRet->m_sString.c_str(), CC_RETINA_DISPLAY_FILENAME_SUFFIX); 
  27.                  
  28.                 return pRet->m_sString.c_str(); 
  29.             } 
  30.             else 
  31.             { 
  32.                 //    => if no, return path without suffix 
  33.             } 
  34.         } 
  35.     }    
  36.      
  37.     return pszRelativePath; 

然后接着在本类添加如下两个函数:

 


  
  
  1. bool CCFileUtils::existFileData(const char* pszFileName) 
  2.     string fullPath(pszFileName); 
  3.      
  4.     if ((! pszFileName)) 
  5.     { 
  6.         return false
  7.     } 
  8.      
  9.     if (pszFileName[0] != '/'
  10.     { 
  11.         // read from apk 
  12.         fullPath.insert(0"assets/"); 
  13.         return CCFileUtils::existFileDataFromZip(s_strResourcePath.c_str(), fullPath.c_str()); 
  14.     } 
  15.     else 
  16.     { 
  17.         do 
  18.         { 
  19.             // read rrom other path than user set it 
  20.             FILE *fp = fopen(pszFileName, "rb"); 
  21.             if (fp != NULL) 
  22.             { 
  23.                 fclose(fp); 
  24.                 return true
  25.             } 
  26.         } 
  27.         while (0); 
  28.     } 
  29.     return false
  30. bool CCFileUtils::existFileDataFromZip(const char* pszZipFilePath, const char* pszFileName) 
  31.     unzFile pFile = NULL; 
  32.     bool res = false
  33.     do 
  34.     { 
  35.         CC_BREAK_IF(!pszZipFilePath || !pszFileName); 
  36.         CC_BREAK_IF(strlen(pszZipFilePath) == 0); 
  37.          
  38.         pFile = unzOpen(pszZipFilePath); 
  39.          
  40.         int nRet = unzLocateFile(pFile, pszFileName, 1); 
  41.         res = UNZ_OK == nRet; 
  42.          
  43.     } while (0); 
  44.      
  45.     if (pFile) 
  46.     { 
  47.         unzClose(pFile); 
  48.     } 
  49.     return res; 

最后在CCFileUtils.h 中声明两个函数的定义:

 


  
  
  1. static bool existFileData(const char* pszFileName); 
  2. static bool existFileDataFromZip(const char* pszZipFilePath, const char* pszFileName); 

3.3  最后记得设置缩放比例的值2.0,那么重新编译你的项目到Android运行则如下图所示:

 

OK,本篇就到这里,Himi最近感冒,还没吃晚饭,咳咳,先晚饭去了。。。北京最近下雨天气偏凉~大家多注意身体,





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/969777,如需转载请自行联系原作者
目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1641 4
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
程序员 API 调度
iOS|解决 setBrightness 调节屏幕亮度不生效的问题
在包含视频播放功能的 App 中,一种常见的交互是在播放器界面的左侧上下滑动调节屏幕亮度,右侧上下滑动调节音量。我们的 iOS App 里也是这样设计的,但最近在测试过程中,发现亮度调节不生效了。
730 76
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
2153 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
存储 安全 数据安全/隐私保护
深入探索iOS与Android的隐私保护机制
在数字化时代,智能手机已成为我们生活中不可或缺的一部分,而随之而来的隐私安全问题也日益凸显。本文旨在对比分析iOS和Android两大操作系统在隐私保护方面的策略和技术实现,揭示它们在设计理念、权限管理、数据加密等方面的不同之处,为读者提供一个全面了解两大系统隐私保护机制的视角。
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
660 1

热门文章

最新文章