Cocos2dx中应用内部横竖屏切换

cocos如何在游戏中动态设置横竖屏 最近在做一个棋牌项目,有个需求,是当点击某个按钮的时候,游戏从横屏转到,再次点击的时候,游戏从再转到横屏。之前写过一个更改项目横竖屏的博客,但是那个只是在确定项目幕方向的时候设置。这次的更改,与上次不同。进入正题:项目是使用LUA,所以需要对应的在android和ios双平台分别做切换处理,在通过lua,调用不同的平台处理。一、android平台    1、首先我们需要在android的... 阅读详情

语言环境:

Cocos2dx 3.6

Lua 5.1

Android Studio 3.0.1

问题:如何在应用内部进行横竖屏切换?

解决思路:

          由于产品需求,必须在应用内部进行横竖屏切换(苦比〜_〜),没办法,网上教程一大把,大多数是在一开始就定义好了的屏幕,无法做到自由切换,没几个详细的,连个参考的例子都没有,初步思路:以安卓平台为例,

         在需要切换时,先改变相应平台的屏幕设置,在获取当前的场景,将有关于场景位置坐标的类重新定义,就完成了一个切屏操作。

详解:

安卓的平台:

 在安卓平台的的AndroidManifest.xml文件中需要如下配置:

<activity android:name="org.cocos2dx.lua.AppActivity"
      android:label="@string/app_name"
      android:screenOrientation="sensorLandscape"            //开始时屏幕的状态
      android:launchMode="singleTask"
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
      android:configChanges="keyboardHidden|orientation|screenSize">   //重点:定义允许的切屏操作
            
</activity>

接下来在主程序文件中定义一个屏幕状态变量

public static int AppOrientation = -1;           //屏幕方向 默认-1横屏2 竖屏1

重载Cocos2dxActivity类的onConfigurationChanged方法,不懂的可以去了解下这个方法的作用,这里不做说明:

@Override
public void onConfigurationChanged(Configuration newConfig) {
	// TODO Auto-generated method stub
	super.onConfigurationChanged(newConfig);
	String msgText = "AppActivity 提示:---->";
	// 屏幕旋转
	if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
		AppOrientation = newConfig.orientation;
		msgText = msgText + "横屏";
	}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
		AppOrientation = newConfig.orientation;
		msgText = msgText + "竖屏";
	}
	System.out.println(">>>>>>>>>>>>>>>"+msgText+"<<<<<<<<<<<");
}

接下来开始具体实现:

    //设置应用的旋转方向、重力感应
	// 参数1:1:横屏,2:竖屏,3根据用户朝向
	//参数2:重力感应  0开启 1关闭
	public static int setOrientation(int orientation, int gravity){

		System.out.println("调用成功:------------>"+ String.valueOf(orientation) + String.valueOf(gravity));
		//旋转方向
		if(orientation == 1 ) {
			instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
			AppOrientation = 2;
		}else if (orientation == 2 ){
			instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
			AppOrientation = 1;
		}else if (orientation == 3 ) {
			instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
			AppOrientation = 3;
		}
		//重力感应设置
		if(gravity == 0){
			instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
		}else if(gravity == 1){
			instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
		}
		return 0;
	}

在此设置函数中,增加了重力感应扩展,可用可不用,当然,既然是设置,肯定需要重载设置函数

@Override
public void setRequestedOrientation(int requestedOrientation) {
	super.setRequestedOrientation(requestedOrientation);
}

为了脚本层的调用,增加了获取函数

    //获取应用的旋转方向
	public static int getOrientation(){
		return AppOrientation;
	}

至此,平台的设置就完成了,到这一步,已经完成了屏幕的切换,接下来是脚本层的设置,完成坐标的重定义;

LUA:

在LUA脚本中,首先完成初始屏幕设置(个人需求)以及后面要用到的屏幕定义参数:

sysytem.lua

-- screen orientation(横竖屏)
CONFIG_SCREEN_ORIENTATION = "landscape"    --portrait

-- system direction(系统方向 )
SYSTEM_SCREEN_ORIENTATION = -1             -- -1:未设置 1:竖屏 2:横屏 3:用户当前首选

-- Whether to switch screens(切换屏幕判断)
SYSTEM_SCREEN_JUDHE = false

-- design resolution(设计分辨率)
CONFIG_SCREEN_WIDTH  = 1334
CONFIG_SCREEN_HEIGHT = 750

-- auto scale mode(屏幕适配方式)
CONFIG_SCREEN_AUTOSCALE = "SHOW_ALL"    --SHOW_ALL  FIXED_WIDTH  

 

接下来修改框架中的显示方法:

要做到的是应用中切换屏幕,所以场景肯定是在之前就一定存在的,改之前请确保你的屏幕适配是正确的

--检查设备屏幕尺寸
local glview = sharedDirector:getOpenGLView()
if nil == glview then
    glview = cc.GLViewImpl:create("QuickCocos",
        cc.rect(0, 0, CONFIG_SCREEN_WIDTH or 900, CONFIG_SCREEN_HEIGHT or 640))
    sharedDirector:setOpenGLView(glview)
else
    local PLATFORM_OS_ANDROID    = 3
    local PLATFORM_OS_IPHONE     = 4
    local PLATFORM_OS_IPAD       = 5
	--设定设计分辨率
	if platform == PLATFORM_OS_ANDROID or platform == PLATFORM_OS_IPHONE or platform == PLATFORM_OS_IPAD then
		if SYSTEM_SCREEN_JUDHE == true then
			glview:setFrameSize(CONFIG_SCREEN_WIDTH or 900, CONFIG_SCREEN_HEIGHT or 640)
		end
	end
end

重点在于以上代码的东西,至于SYSTEM_SCREEN_JUDHE的判断,是由于存在多个场景切换,当场景存在且要设定的设计分辨率与当前场景的一致时,会出现屏幕可视区域超出的情况,具体原因尚未查明。

接下来在框架的init.lua初始化类中配置SYSTEM_SCREEN_JUDHE的初始化设置,在require display之前这样设置

if SYSTEM_SCREEN_JUDHE == nil then
	SYSTEM_SCREEN_JUDHE = false
end

接下来开始入口:main.lua 中位置坐标的重定义,

--坐标重置
function _RESET_DISPLAY_CLASS(isChange)
	if isChange ~= true then
		SYSTEM_SCREEN_JUDHE = false
	else
		SYSTEM_SCREEN_JUDHE = true
	end
	-- 记录下当前已经加载的文件
    for k, _ in pairs(package.loaded) do
        if k == "hall.src.app.extends.panel" then
            package.loaded[k] = false
        end
        if k == cc.PACKAGE_NAME .. ".cc.init" then
        	package.loaded[k] = false
        end
        if string.find(k,cc.PACKAGE_NAME) ~= nil then
        	package.loaded[k] = false
        end
        if string.find(k,"hall.src.cocos") ~= nil then
        	package.loaded[k] = false
        end
    end
    cleanPackageSnapshot()
    require("hall.src.cocos.init")
    require(cc.PACKAGE_NAME .. ".init")
    require("hall.src.app.extends.panel")
end

每个项目框架的位置坐标类都不同,这只是我的项目框架,在重加载位置坐标时,请注意以下几点:

1.必须先清除已加载的位置类

2.重新加载时请尽量参照正常加载的顺序

3.若位置类中包含全局变量必须初始化

4.能用局部变量的最好用局部

...

未完待续...

【H5+ & Quick-cocos2dx整合】之iOS 五 横竖屏切换处理 ios幕视图分为视图和横屏视图,横屏视可以旋转而视图则不可以。在viewcontroller中有三个系统级的方法来控制当前幕视图的操作。 shouldAutorotate:是否可以旋转; supportedInterfaceOrientations:支持的旋转方向有哪些; preferredInterfaceOrientationForPresentation:默认的幕方向设置 阅读详情

相关推荐

cocos2dx lua 接微博SDK(一)--微博登陆

看到同事和朋友都有在写博客,也来练练手。。。 环境:cocos code ide 1.2 ,  Android 新浪weiboSDK 3.0.1 ,cocos2dx 3.3F,eclipse 一、认证授权(PS:不就是登录吗?),手机有无安装微博客户端都可用 1,申请APP_KEY,注册 应用程序包名和签名,和导入eclipse,及AndroidManifest.xml里要修改的权限

七相粉 的博客 782

cocos2d-在游戏中动态设置横竖屏

项目是使用LUA,所以需要对应的在android和ios双平台分别做切换处理,在通过lua,调用不同的平台处理。 一、android平台 1、首先我们需要在android的AppActivity.java添加如下代码 //设置手机的旋转方向1:横屏2,3根据用户朝向 public static int setOrientation(int orientation){ if(orientation == 1 ) { m_activit...

sun___shine的博客 1583

Cocos2d-x上实现横竖屏切换

Cocos2d-x上实现横竖屏切换 该demo使用引擎3.10版本,经测试在Android,PC上都OK 第一步在AppDelegate重写applicationScreenSizeChanged方法,主要是重新设置窗口大小和逻辑幕尺寸virtual void applicationScreenSizeChanged(int newWidth, int newHeight) #if (CC_TA

FirePrayer的专栏 6459

quick cocos2dx2.2.6 lua 幕旋转横竖屏转换详解 幕方向自由切换

这里指的是程序中代码控制横竖屏转换 1.先调用ios/android的api使幕旋转 IOS 在ios平台,cocos2dx的视图其实都是显示在一个UIViewController的。所以我们需要旋转UIViewController的方向。 在ios8以前只需调用以下代码: [[UIApplication sharedApplication] setStatusBa...

weixin_30698297的博客 439

lua个人随笔--lua项目ardroid版修改幕显示方式(横屏 重力感应显示等)

修改D:\cocos2d-x-3.16\cocos2d-x-3.16\cocosProject\FlappyBird\frameworks\runtime-src\proj.android\AndroidManifest.xml中的android:screenOrientation="landscape" landscape:横屏 portrait: unspecified:默认值。由系...

MccreeCaptain 746

cocos2d-x游戏开发横竖屏切换

android解决方案: 1.在游戏的主activity中编写一个静态方法(继承Cocos2dxActivity) public static void changedActivityOrientation(int orientation){ switch(orientation) { case 1://横屏 instance.setRequest...

baigan2014的博客 304

横竖屏切换 cocos2dx

cocos2dx 横竖屏切换

Code_Nice的博客 2776

xcode5下cocos2dx横竖屏设置

我们在开发一款游戏之前一定会考虑的一件事就是,我们的游戏是支持横屏还是,又或者是横竖屏都支持。那么如何在xcode中对项目进行设置呢?下面我就在xcode5.1.1中利用cocos2dx2.2.3,从新建项目开始,来进行游戏横竖屏的设置。 一、新建项目 找到cocos2dx相应目录,利用python脚本新建项目,在MAC的终端输入如下命令(此处为我的目录位置,...

weixin_30505225的博客 192

iOS横竖屏切换解决方案(转载)

转载自简书作者 NewPan的一篇文章,在此记录收藏。[iOS]终极横竖屏切换解决方案

搬砖日常 704

cocos2d-x如何切换横竖屏

IOS: 找到项目IOS/RootViewController.mm 修改 - (NSUInteger) supportedInterfaceOrientations{ #ifdef __IPHONE_6_0 //横版 //return UIInterfaceOrientationMaskAllButUpsideDown; //版 return UIInter

oJianYue12的专栏 3960

Cocos2dx android 横竖屏设置!

cocos2dx新建的项目默认都是横版,要想在android 项目下的AndroidManifest.xml

Programmer 1137

和屌丝一起学cocos2dx-幕设置

声  明        本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。 gl.paea.cn版权所有。        Hello,大家好,欢迎回到“和屌丝一起学coocs2dx”系列教程。上节我们说到了

gl.paea.cn 2373

横竖屏切换

横竖屏切换

sinat_28238111的博客 265

cocos2dx-幕设置

声  明        本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。 gl.paea.cn版权所有。        Hello,大家好,欢迎回到“和屌丝一起学coocs2dx”系列教程。上节我

711
上一篇: Cocos2dx中关于CCEditBox的那些事
下一篇: 超详细Android接入支付宝支付实现
_Aby_
博客等级 码龄11年 8粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值