cocos2d-在遊戲中動態設置橫豎屏

項目是使用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"];
}
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
至此,屏幕切換完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章