cocos如何在游戏中动态设置横竖屏
最近在做一个棋牌项目,有个需求,是当点击某个按钮的时候,游戏从横屏转到竖屏,再次点击的时候,游戏从竖屏再转到横屏。之前写过一个更改项目横竖屏的博客,但是那个只是在确定项目屏幕方向的时候设置。这次的更改,与上次不同。进入正题:
项目是使用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如何在游戏中动态设置横竖屏相关推荐
- 游戏中动态设置文字描边颜色
首先将text组件的useOutline属性设为true,然后使用CS.UnityEngine.Color32()设置描边的色值,方法内的4个参数是RGBA的值.
- android动态设置横竖屏,Android开发强制横屏和强制竖屏设置实例代码
强制竖屏设置 1.代码在Activity的onResume方法中添加如下代码 @Override protected void onResume() { /** * 设置为横屏 */ if (getR ...
- 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法
微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法 参考文章: (1)微信小程序首页index.js获取不到app.js中动态设置的globalDat ...
- Quartz在Spring中动态设置cronExpression
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...
- Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2019独角兽企业重金招聘Python工程师标准>>> 什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改 ...
- 代码中动态设置view或布局的宽高
有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: 网上有一些教程使用relativeView.setLayoutParam ...
- vue修改meta值_vue中动态设置meta标签和title标签的方法
vue中动态设置meta标签和title标签的方法 因为和原生的交互是需要h5这边来提供meta标签的来是来判断要不要显示分享按钮,所有就需要手动设置meta标签,标题和内容 //router内的设置 ...
- android 动态设边距,在代码中动态设置页边距 - android
我有一个只包含ScrollView和TableLayout的活动.在我的代码我加入tablerows,一切工作正常,除了利润 - 它不工作(没有任何反应),下面是代码:在代码中动态设置页边距 - an ...
- android 设置 linearlayout 高度,在RelativeLayout中动态设置LinearLayout高度/宽度
我在RelativeLayout中有一个linearLayout.我需要能够根据屏幕尺寸动态设置线性布局的高度.我有一些困难. 我怎么能做到这一点?在RelativeLayout中动态设置Linear ...
最新文章
- FreeRTOS(四)——内存管理
- ASP.NET MVC4+BootStrap实战
- Photoshop激活教程
- python批量删除文件1001python批量删除文件_Python实现递归遍历文件夹并删除文件...
- python 怎么在一行获取多个数字
- PHP 完整实战23种设计模式
- 以“术”彰“道”,用匠心做技术—对话阿里云MVP刘洪峰
- android listview仿iphone特效
- u盘在磁盘管理可以显示 但是电脑中找不到_电脑无法识别U盘?5步操作让办公族轻松搞定!...
- 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
- FULENT软件测试自学,fluent网格质量检查 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
- 《Java 核心技术 卷1》 笔记 第八章 事件处理
- 海康威视摄像头+OpenCV+VS2017 图像处理小结(一)
- UDS04-清除诊断信息服务【ServiceID = 0x14】
- 网络传输(个人整理 多网站)
- 嵌入式软件工程师—成长笔记#03
- JAVA高级特性(三)——Set集合
- 穷不是中年危机的理由
- wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017
- 系统出错信息及解决方案(菜菜学习贴)
热门文章
- Java将内容写入到csv文件中
- Java必背基础词汇
- java实现24点经典游戏
- oracle修改数据前备份,Oracle 之利用BBED修改数据块SCN—-没有备份数据文件的数据恢复...
- jsp无图片时显示默认图片解决方案
- Code With Me插件,IDEA多人协作
- 在c语言中int i k d,c语言int *pInt=(int *)d; 什么意思?
- php webshell 分析,一款奇葩的PHP Webshell后门分析
- 一键部署开箱即用的代理服务器,解决 SAP UI5 应用开发过程中访问远端 OData 服务的跨域问题试读版
- 医疗单据、医疗票据OCR识别接口