最近在做一个棋牌项目,有个需求,是当点击某个按钮的时候,游戏从横屏转到竖屏,再次点击的时候,游戏从竖屏再转到横屏。之前写过一个更改项目横竖屏的博客,但是那个只是在确定项目屏幕方向的时候设置。这次的更改,与上次不同。进入正题:

项目是使用LUA,所以需要对应的在android和ios双平台分别做切换处理,在通过lua,调用不同的平台处理。

一、android平台

1、首先我们需要在android的AppActivity.java添加如下代码

    //设置手机的旋转方向1:横屏,2:竖屏,3根据用户朝向public static int setOrientation(int orientation){if(orientation == 1 ) {m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);}else if (orientation == 2 ){m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//            m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);}else if (orientation == 3 ) {m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);m_activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);}return 0;}

1)当orientation为1的时候,第一个设置为设置横屏,不随重力感应器切换方向。第二个为根据手机重力感应,设置横屏的上下方向

2)当orientation为2的时候,第一个设置为设置竖屏,不随重力感应器切换方向。第二个为根据手机重力感应,设置竖屏的上下方向

设置完之后,android处理方法添加完毕,我们再去IOS里面添加对应的IOS代码

二、IOS平台

首先我们添加一个转换方法,将lua即将传过来的方向的值,转化为ios里面对应的Boolean值

int GameIOS::setOrientation(int screen)
{if(screen == 1){[AppController setOrientation:false];}else if(screen == 2){[AppController setOrientation:true];}return 0;
}

然后,我们需要在AppContriller.mm里面,实现这个setOrientation方法,代码如下

static bool g_bIsPortrait = false;- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
{if (g_bIsPortrait == false) {//横屏return UIInterfaceOrientationMaskLandscape;}else{//竖屏return UIInterfaceOrientationMaskPortrait;}
}+(void)setOrientation:(bool)bIsPortrait{if(g_bIsPortrait == bIsPortrait){return ;}g_bIsPortrait = bIsPortrait;UIInterfaceOrientation interfaceOrientation = UIInterfaceOrientationUnknown;if(bIsPortrait){interfaceOrientation =UIInterfaceOrientationPortrait;}else{interfaceOrientation =UIInterfaceOrientationLandscapeRight;}//NSLog(@"%d,setOrientation",bIsPortrait);NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];[[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"];NSNumber *orientationTarget = [NSNumber numberWithInt:interfaceOrientation];[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];/*if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {SEL selector  = NSSelectorFromString(@"setOrientation:");NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];[invocation setSelector:selector];[invocation setTarget:[UIDevice currentDevice]];int val = orientation;// 从2开始是因为0 1 两个参数已经被selector和target占用[invocation setArgument:&val atIndex:2];[invocation invoke];}*//*g_bIsPortrait = bIsPortrait;UIInterfaceOrientation interfaceOrientation = UIInterfaceOrientationUnknown;if(bIsPortrait){interfaceOrientation =UIInterfaceOrientationPortrait;}else{interfaceOrientation =UIInterfaceOrientationLandscapeLeft;}NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];[[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"];NSNumber *orientationTarget = [NSNumber numberWithInt:interfaceOrientation];[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];*/
}

OK,到这里,我们android和IOS端的实现都已经实现,接下来要做的,就是在lua里面去调用这些实现,有两种方式,一种使用lua直接调用,一种是使用C++分别调用android和IOS,我们这里使用第一种

三、使用C++调用android和IOS

我们只需要在C++实现以下方法

int TinyToolSDK::setOrientation(int screen)
{
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROIDJniMethodInfo minfo;if (JniHelper::getStaticMethodInfo(minfo, JAVA_CLASSNAME, "setOrientation", "(I)I")){jint iret = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID, screen);return iret;}
#elif CC_TARGET_PLATFORM == CC_PLATFORM_IOSreturn GameIOS::getInstance()->setOrientation(screen);
#endifreturn 0;}
四、使用lua调用C++

这里也有两种实现方法,一种是通过cocos的tolua工具,将类直接导出到lua使用,另外一种是利用lua_state将全局intC函数直接注册到lua使用,这两种方法,网上都有很多教程,不再赘述。

这里我们使用第一种,假设你已经将C++类导出到了lua,那么我们只需要在lua实现

ret = TinyToolSDK:setOrientation(screen)就可以了

到这里,我们已经实现了屏幕的翻转,但是对于我们游戏来说,还不够,因为我们屏幕翻转了,但是我们的设计分辨率还没有更改,我们的view还没有更改,所以我们需要最后一步操作,这里我就直接放上我的lua实现,供参考:
--设置屏幕方向screen,1:横屏,2:竖屏,3根据用户朝向
function setOrientation(screen)
    if VIEW_ORIENT == screen then return end
    local ret = -1
    ret = TinyToolSDK:setOrientation(screen)

if ret == 0 then 
        VIEW_ORIENT = screen
            --view的分辨率
        local width , height
        if screen == 2 then 
            width = 640
            height = 1136
        elseif screen == 1 then 
            width = 1136 
            height = 640
        end
        local view = cc.Director:getInstance():getOpenGLView()
        view:setFrameSize(view:getFrameSize().height ,  view:getFrameSize().width)
        --重加载display
        package.loaded["cocos.framework.display"] = nil
        display    = require("cocos.framework.display")
    end
    return ret; 
end
至此,屏幕切换完成。

cocos如何在游戏中动态设置横竖屏相关推荐

  1. 游戏中动态设置文字描边颜色

    首先将text组件的useOutline属性设为true,然后使用CS.UnityEngine.Color32()设置描边的色值,方法内的4个参数是RGBA的值.

  2. android动态设置横竖屏,Android开发强制横屏和强制竖屏设置实例代码

    强制竖屏设置 1.代码在Activity的onResume方法中添加如下代码 @Override protected void onResume() { /** * 设置为横屏 */ if (getR ...

  3. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法 参考文章: (1)微信小程序首页index.js获取不到app.js中动态设置的globalDat ...

  4. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  5. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改 ...

  6. 代码中动态设置view或布局的宽高

    有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: 网上有一些教程使用relativeView.setLayoutParam ...

  7. vue修改meta值_vue中动态设置meta标签和title标签的方法

    vue中动态设置meta标签和title标签的方法 因为和原生的交互是需要h5这边来提供meta标签的来是来判断要不要显示分享按钮,所有就需要手动设置meta标签,标题和内容 //router内的设置 ...

  8. android 动态设边距,在代码中动态设置页边距 - android

    我有一个只包含ScrollView和TableLayout的活动.在我的代码我加入tablerows,一切工作正常,除了利润 - 它不工作(没有任何反应),下面是代码:在代码中动态设置页边距 - an ...

  9. android 设置 linearlayout 高度,在RelativeLayout中动态设置LinearLayout高度/宽度

    我在RelativeLayout中有一个linearLayout.我需要能够根据屏幕尺寸动态设置线性布局的高度.我有一些困难. 我怎么能做到这一点?在RelativeLayout中动态设置Linear ...

最新文章

  1. FreeRTOS(四)——内存管理
  2. ASP.NET MVC4+BootStrap实战
  3. Photoshop激活教程
  4. python批量删除文件1001python批量删除文件_Python实现递归遍历文件夹并删除文件...
  5. python 怎么在一行获取多个数字
  6. PHP 完整实战23种设计模式
  7. 以“术”彰“道”,用匠心做技术—对话阿里云MVP刘洪峰
  8. android listview仿iphone特效
  9. u盘在磁盘管理可以显示 但是电脑中找不到_电脑无法识别U盘?5步操作让办公族轻松搞定!...
  10. 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
  11. FULENT软件测试自学,fluent网格质量检查 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  12. 《Java 核心技术 卷1》 笔记 第八章 事件处理
  13. 海康威视摄像头+OpenCV+VS2017 图像处理小结(一)
  14. UDS04-清除诊断信息服务【ServiceID = 0x14】
  15. 网络传输(个人整理 多网站)
  16. 嵌入式软件工程师—成长笔记#03
  17. JAVA高级特性(三)——Set集合
  18. 穷不是中年危机的理由
  19. wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017
  20. 系统出错信息及解决方案(菜菜学习贴)

热门文章

  1. Java将内容写入到csv文件中
  2. Java必背基础词汇
  3. java实现24点经典游戏
  4. oracle修改数据前备份,Oracle 之利用BBED修改数据块SCN—-没有备份数据文件的数据恢复...
  5. jsp无图片时显示默认图片解决方案
  6. Code With Me插件,IDEA多人协作
  7. 在c语言中int i k d,c语言int *pInt=(int *)d; 什么意思?
  8. php webshell 分析,一款奇葩的PHP Webshell后门分析
  9. 一键部署开箱即用的代理服务器,解决 SAP UI5 应用开发过程中访问远端 OData 服务的跨域问题试读版
  10. 医疗单据、医疗票据OCR识别接口