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