在Cocos2d-x上实现横竖屏切换

在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
}

实现以上三步就可以实现屏幕横竖屏切换功能,在设置窗口大小和逻辑屏幕尺寸一定要注意!!!
希望对大家有帮助.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值