在Cocos2d-x上实现横竖屏切换
- 该demo使用引擎3.10版本,经测试在Android,PC上都OK
- 主要实现以下三个步骤即可实现横竖屏切换
第一步
在AppDelegate重写applicationScreenSizeChanged方法,主要是重新设置窗口大小和逻辑屏幕尺寸
virtual void applicationScreenSizeChanged(int newWidth, int newHeight)
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
Application::applicationScreenSizeChanged(newWidth, newHeight);
auto director = cocos2d::Director::getInstance();
auto glview = director->getOpenGLView();
if (glview != NULL)
{
glview->setFrameSize(newWidth, newHeight);
//竖屏
if (newWidth < newHeight)
{
glview->setDesignResolutionSize(SCR_W, SCR_H, ResolutionPolicy::SHOW_ALL);
}
//横屏
else
{
glview->setDesignResolutionSize(SCR_H, SCR_W, ResolutionPolicy::SHOW_ALL);
}
}
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#endif
}
第二步
在AppActivity里面实现切换屏幕的消息处理
private static final String TAG = "TAG";
/**
* 各种请求动作
* @param actionType
* @param str
*/
public static void requestAction(int actionType,String str)
{
Log.i(TAG, "收到指令--------------->"+actionType);
Message msg = actionHandler.obtainMessage();
msg.what = actionType;
msg.obj = str;
actionHandler.sendMessage(msg);
}
private static Handler actionHandler = new Handler(new Handler.Callback()
{
@Override
public boolean handleMessage(Message msg)
{
// TODO Auto-generated method stub
if(msg.what == 0)
{
context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
else if(msg.what == 1)
{
context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
return false;
}
});
第三步
在2dx里面调用
void GameLayerH::setScreenH()
{
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
//这个数值表示屏幕方向
//JNI函数并没最优化,应用到项目的时候请自行优化
int value = 0;
std::string msg = "abc";
JniMethodInfo jniMethodInfo;
bool isHave = JniHelper::getStaticMethodInfo(
jniMethodInfo,
"org/cocos2dx/cpp/AppActivity",
"requestAction",
"(ILjava/lang/String;)V");
if (isHave)
{
//需要传递到Java层的字符串
jstring strArg = jniMethodInfo.env->NewStringUTF(msg.c_str());
jniMethodInfo.env->CallStaticVoidMethod(jniMethodInfo.classID, jniMethodInfo.methodID, value, strArg);
jniMethodInfo.env->DeleteLocalRef(jniMethodInfo.classID);
jniMethodInfo.env->DeleteLocalRef(strArg);
}
#elif CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
auto director = cocos2d::Director::getInstance();
auto glview = director->getOpenGLView();
if (glview != NULL)
{
glview->setDesignResolutionSize(SCR_H, SCR_W, ResolutionPolicy::SHOW_ALL);
glview->setFrameSize(SCR_H, SCR_W);
}
#endif
}
实现以上三步就可以实现屏幕横竖屏切换功能,在设置窗口大小和逻辑屏幕尺寸一定要注意!!!
希望对大家有帮助.