cocos2d-x屏幕自适应解决办法

本文介绍了一种适用于Cocos2d-x项目的跨平台屏幕适配方法,通过自定义函数和调整配置实现资源在不同设备上的自动缩放,以确保在多种分辨率下都能正常显示。

原文来自:http://blog.youkuaiyun.com/zhangjingyangguang/article/details/7617816



最近在写一个项目,要求pc,ipad,andriod平台上都可以运行,所以选择用cocos2d-x来开发。我们的资源大小是1024*768的,在pc上和苹果上都是没有问题的,可是到了andriod上,问题就来了。andriod上有有各种各样的分辨率,那么程序在所有的分辨率上都可以正常运行显示呢?针对这个问题,我想了好几种方法:

(1)弄多套资源

因为这个项目里面有很多动画资源,如果要弄多套资源,工作量比较大,项目时间比较紧,不允许用这套方案

(2)cocos2d-x里面有一个方法

pDirector->setContentScaleFactor(0.5);

这个方法是把整个场景缩小到一半,界面上看上去没问题,但是里面要点击的精灵相应位置全不对了,如果用这套方法,代码要写好几套,要根据不同的分辨率来调整不同精灵的摆放位置和相应位置。尽管资源是一份,可是,代码要重新写过,要先机器的分辨率,然后再决定用那套精灵位置和相应位置的代码。可如何或如andriod下面机器分分辨率,这个还是个问题。再三思考后,打算做成多个apk文件,就做主流的分辨率,譬如说1024*768,1280*800,800*480等。本来已经打算这么弄了,可还是发现了更好的第三种办法。

(3)这种办法只需要一套资源,精灵位置也只有一套(不管是绝对位置还是相对位置),绝对是最佳的选择。

先说windows下的解决方法:

譬如说我们的项目是1024*768的,现在要改成大小是800*600的,那么只需要写一个函数

 

[cpp]  view plain copy
  1. int ViewAutoScale(cocos2d::CCEGLView* view,     
  2.                       void* title,    
  3.                       int width,     
  4.                       int height,    
  5.                       cocos2d::CCSize* supportDisplay,    
  6.                       int displays,    
  7.                       int defaultWidth,    
  8.                       int defaultHeight)    
  9.     {    
  10.          if(view == NULL)    
  11.         {    
  12.                  return -1;    
  13.         }    
  14.         for (int i=0; i < displays; i++)    
  15.         {    
  16.   
  17.   
  18.             if ((w==size.width && h==size.height) || (h==size.width && w==size.height))    
  19.                 {    
  20.                      view->Create((LPCTSTR)title, width, height);    
  21.                              return i+1;    
  22.                 }    
  23.         }    
  24.         view->Create((LPCTSTR)title, defaultWidth, defaultHeight);    
  25.         view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight));    
  26.         view->resize(width, height);    
  27.         view->centerWindow();    
  28.         return 0;    
  29.     }    


 

这个函数要放在AppDelegate.cpp中作为全局函数,然后在

bool AppDelegate::initInstance()中调用,用法如下:

[cpp]  view plain copy
  1. bool AppDelegate::initInstance()  
  2. {  
  3.     bool bRet = false;  
  4.     do  
  5.     {  
  6. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  7.   
  8.         // Initialize OpenGLView instance, that release by CCDirector when application terminate.  
  9.         // The HelloWorld is designed as HVGA.  
  10.         CCSize sSupportDisplay[]={CCSize(1024, 768)};  
  11.         CCEGLView * pMainWnd = new CCEGLView();  
  12.         //CC_BREAK_IF(! pMainWnd  
  13.         //      || ! pMainWnd->Create(TEXT("回乡偶书"), 1024, 768));  
  14.         if (ViewAutoScale(pMainWnd,TEXT("回乡偶书"),1024,768,  
  15.                             sSupportDisplay,  
  16.                             sizeof(sSupportDisplay)/sizeof(CCSize),  
  17.                             1024,  
  18.                             768)<0)  
  19.         {  
  20.             return false;  
  21.         }  
  22.   
  23. #endif  // CC_PLATFORM_WIN32  

}

上面的1024*768是我们本身的大小,800*480是我们想适应的大小,这样,就只要调整800*480的参数,就可以改成自己想要的大小。

第二个是在andriod下实现屏幕自适应,其实更简单,只需要一个方法,而且cocos2d-x下面已经帮我们实现好了,只需要调用即可。

修改方法如下:

进入到HelloWorld/android/jni/helloworld/main.cpp中,

然后调用view->create(1024,768);

代码如下:

[cpp]  view plain copy
  1. void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)  
  2. {  
  3.     if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())  
  4.     {  
  5.     cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();  
  6.         view->setFrameWidthAndHeight(w, h);  
  7.         view->create(1024,768);  
  8.         // if you want to run in WVGA with HVGA resource, set it  
  9.         // view->create(480, 320);  Please change it to (320, 480) if you're in portrait mode.  
  10.         cocos2d::CCDirector::sharedDirector()->setOpenGLView(view);  
  11.   
  12.         AppDelegate *pAppDelegate = new AppDelegate();  
  13.         cocos2d::CCApplication::sharedApplication().run();  
  14.     }  
  15.     else  
  16.     {  
  17.         cocos2d::CCTextureCache::reloadAllTextures();  
  18.         cocos2d::CCDirector::sharedDirector()->setGLDefaultValues();  
  19.     }  
  20. }  

这样,就可以了,不管andriod是什么分辨率,使用了这个方法后,都会自动调整,一切ok。

 

好了,现在总结一下

用第三种方法固然后,但是也有弊端,譬如说程序本来是支持1024*768的,然后我们要改成800*480的,宽和高是不成比例的,所以用这种方法后,在x轴上会有黑边。

如果要全屏的效果,那只能用第一种方法,做多套资源处理之。

<think>好的,我现在要解决用户遇到的Git问题,用户在执行`git branch --set-upstream-to origin/pcid`时提示错误:“fatal: the requested upstream branch 'origin/pcid' does not exist”。需要仔细分析原因并提供解决方案。 首先,用户的问题是关于设置上游分支时出现的错误。根据错误信息,`origin/pcid`不存在,这意味着远程仓库中没有名为`pcid`的分支,或者本地还没有获取到该远程分支的信息。这时候需要一步步排查可能的原因。 回想之前的对话,用户之前遇到了推送失败的问题,可能是因为分支不同步,现在又出现了上游分支不存在的问题。可能用户在尝试设置上游分支时,远程仓库还没有这个分支,或者本地没有正确获取远程分支的信息。 根据用户提供的引用内容,引用[2]中提到处理类似问题需要先关联远程仓库,拉取允许不相关历史,然后设置上游分支。这可能适用于用户当前的情况,但需要调整步骤以适应`pcid`分支的情况。 首先,检查远程仓库是否存在`pcid`分支。用户可能还没有将本地分支推送到远程,因此远程仓库中不存在该分支。如果是这种情况,用户需要先推送本地分支到远程,创建远程分支,然后再设置上游。 另外,也可能本地仓库没有正确获取远程分支的信息。执行`git fetch origin`可以更新远程分支列表,确认是否存在`origin/pcid`。如果不存在,说明需要先推送分支。 接下来,考虑用户可能的操作步骤。用户可能在本地创建了`pcid`分支,但尚未推送到远程仓库,因此尝试设置上游时失败。解决方案应该是先推送分支到远程,然后设置上游。 此外,用户可能之前尝试过推送,但遇到了非快进的问题,现在试图设置上游但失败。需要综合之前的解决方案,确保步骤正确。 还需要注意用户可能混淆了分支名称,或者远程仓库的URL配置不正确,导致无法找到远程分支。检查远程仓库配置是否正确,使用`git remote -v`查看。 总结可能的原因: 1. 远程仓库中不存在`pcid`分支。 2. 本地未获取最新的远程分支信息。 3. 远程仓库配置有误。 解决方案步骤: 1. 确认远程仓库是否存在`pcid`分支,如果不存在,推送本地分支到远程。 2. 使用`git fetch`获取最新的远程分支信息。 3. 正确设置上游分支,确保分支名称正确。 需要分步骤指导用户,确保他们能逐步操作,并解释每个步骤的作用,避免进一步的错误。同时,提供预防措施,如推送时自动设置上游,避免未来出现类似问题。</think>--- ### 错误核心原因 当执行`git branch --set-upstream-to origin/pcid`时出现`origin/pcid does not exist`错误,说明以下两个条件至少满足其一: 1. **远程仓库未创建`pcid`分支** Git本地仓库未检测到`origin/pcid`远程分支的引用 2. **本地-远程分支未建立物理关联** 未通过`git push`或`git fetch`建立分支映射关系[^2] --- ### 分步解决方案 #### 第一步:验证远程分支是否存在 ```bash git ls-remote --heads origin | grep pcid # 检查远程是否存在pcid分支 ``` - **若输出含`refs/heads/pcid`** → 执行第二步 - **若无输出** → 说明远程无该分支,需先推送本地分支到远程 #### 第二步:本地分支首次关联远程(远程无pcid分支时) ```bash # 强制推送本地分支到远程并建立跟踪 git push -u origin pcid --force-with-lease ``` 此操作将完成: 1. 在远程仓库创建`pcid`分支 2. 自动设置`pcid`分支跟踪`origin/pcid`[^2] #### 第三步:手动建立跟踪(远程已存在pcid分支时) ```bash git fetch origin pcid # 拉取远程分支元数据 git branch -u origin/pcid pcid # 显式关联本地分支与远程分支 ``` --- ### 关键操作解析 | 命令 | 作用 | 适用场景 | |------|------|----------| | `git push -u origin <branch>` | 推送并自动建立上游关联 | 首次推送新分支 | | `git branch -u origin/<branch>` | 手动建立分支追踪 | 已有远程分支需重新关联 | | `git fetch --all` | 同步所有远程分支信息 | 修复本地仓库元数据过期问题 | --- ### 关联失败常见场景排查 #### 场景1:远程分支被意外删除 ```bash # 重新拉取远程分支信息 git remote prune origin # 清理本地缓存中已失效的远程分支引用 git fetch origin pcid # 重新获取最新分支数据 ``` #### 场景2:本地分支名称与远程不一致 ```bash # 查看所有分支关联状态 git branch -vv # 若显示[gone]标识,说明关联的远程分支已不存在 git branch --unset-upstream # 解除无效关联后重新设置 ``` --- ### 预防措施 1. **推送时自动关联上游** ```bash git config --global push.autoSetupRemote true # 所有新推送分支自动跟踪 ``` 2. **可视化分支拓扑** ```bash git log --oneline --graph --all # 显示完整分支关系 ``` --- ### 典型错误修复对照表 | 错误现象 | 修复方案 | 执行命令示例 | |---------|----------|-------------| | "origin/pcid不存在"且远程无该分支 | 创建远程分支并关联 | `git push -u origin pcid` | | 本地分支关联到错误远程分支 | 重置上游关联 | `git branch -u origin/pcid` | | 本地分支历史与远程冲突 | 强制推送覆盖(慎用) | `git push --force-with-lease` | --- ### 扩展应用 若需要将已有本地分支与其他远程分支关联(例如切换代仓库源): ```bash git remote add new_origin https://new-repo-url # 添加新远程仓库 git fetch new_origin pcid # 获取新仓库的分支 git branch --set-upstream-to=new_origin/pcid pcid # 重新关联 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值