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

项目是使用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_ANDROID JniMethodInfo 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_IOS return GameIOS::getInstance()->setOrientation(screen); #endif
return 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
至此,屏幕切换完成。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信