cocos2dx 场景切换怎么在游戏中切换横竖屏

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Android研究院之游戏开发横竖屏的切换(十七)
Android研究院之游戏开发横竖屏的切换(十七)
围观6234次
编辑日期: 字体:
玩过Android手机的同学们应该都很清楚手机横竖屏的机制吧,大部分游戏都是无法横竖屏切换的, 有的游戏只能竖屏的玩,有的游戏只能横屏玩,为什么开发中要强制游戏为单一的屏幕呢?原因很简单 就是因为切换屏幕后带来的问题过多开发起来过于麻烦所以大多数游戏都会强制横屏或者竖屏。的今天我用一个小例子带同学们盘点一下Android开发中横竖屏切换的一些开发技巧。
1. 强制横竖屏
这种方式是最为简单并且可以避免因为切换屏幕导致的一些开发问题,强制屏幕为横屏或者竖屏可以用两种方式来实现, 第一种为代码实现、第二种为配置文件实现,请同学们阅读下面这段简单的例子。
1234567891011121314
import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;&public class HandlerActivity extends Activity {&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.handler); //强制为横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); super.onCreate(savedInstanceState);&&&&}}
AndroidManifest.xml 中设置强制横屏
&activity android:name=".HandlerActivity" android:screenOrientation="landscape"/&
通过代码的方式强制为竖屏
12345678910
public class HandlerActivity extends Activity {&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.handler); //强制为竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); super.onCreate(savedInstanceState);&&&&}}
AndroidManifest.xml 中设置强制竖屏
&activity android:name=".HandlerActivity" android:screenOrientation="portrait"/&
2.横竖屏切换的响应
如果没有设置强制横屏或者竖屏那么每次横竖屏切换的时候Activity都会被重新创建一次,这样就会存在一个问题 横屏后会把图片拉伸可能在竖屏时感觉很协调的界面切换到横屏以后会被拉伸的很难看,比较好的解决办法是为横竖屏做两套图做两个布局文件,这样子程序中只需要监听屏幕切换的结果 设置不同的布局 绘制不同的图片即可。
&activity android:name=".HandlerActivity" android:configChanges="orientation?keyboardHidden"/&
设置后屏幕切换后就不会再次调用OnCreate()方法重新创建这个Activity, 切换屏幕之前程序中的一些数据或者内容就不会因为重新创建Activity导致重置清空。 每当切换横竖屏的时候系统会自己调用onConfigurationChanged()方法这样子就可以拿到当前屏幕的横竖屏状态,根据状态就可以做我们想做的事。
1234567891011121314151617181920212223242526
import android.app.Activity;import android.content.res.Configuration;import android.os.Bundle;&public class HandlerActivity extends Activity {&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.handler);& super.onCreate(savedInstanceState);&&&&}&&&&@Override&&&&public void onConfigurationChanged(Configuration newConfig) {& int type = this.getResources().getConfiguration().orientation;& if (type == Configuration.ORIENTATION_LANDSCAPE) { &&&&//切换到了横屏 } else if (type == Configuration.ORIENTATION_PORTRAIT) { &&&&//切换到了竖屏 }& super.onConfigurationChanged(newConfig);&&&&}}
3.横竖屏切换数据的保存
如果说项目必需要实现横竖屏的切换那么我们就须要对数据进行保存与读取,这也是为什么大部分游戏都不支持横竖屏切换的原因,因为游戏中存在大量的数据 ,比如玩家属性、坐标点、游戏状态、人物属性等等等等实在是太多了。如果要实现正常切换的话那么这些数据都须要进行保存与记录,其实相对软件开发来说做横竖屏切换的到挺多的,毕竟软件当前Activity中保存的数据不会有游戏那么多呵呵,废话就不多说了我分享一个横竖屏切换保存数据与读取数据的方法。
比如横屏切换竖屏实际上是先把当前的横屏的Activity杀掉 然后重新创建一个竖屏的Activity,我们可以使用onSaveInstanceState()方法保存数据,它是在横屏Activity将杀死前调用,可以将须要保存的数据放入Bundle封装在系统中,切换竖屏后这个Activity又重新被创建 这样可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)方法中来回复之前保存在Bundle中的数据,这样就可以实现横竖屏界面切换数据的保存与读取,当然前提是只能保存Bundle类型的数据,也就是说大量的对象数据的话就要想其它办法来恢复。
AndroidManifest.xml 中设置属性禁止重新创建Activity,并且添加屏幕切换监听。
12345678910111213141516171819202122232425262728293031323334
import android.app.Activity;import android.os.Bundle;import android.util.Log;&public class HandlerActivity extends Activity {&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.handler);& super.onCreate(savedInstanceState);&&&&}&&&&&/**切换屏幕之前将数据保存在Bundle中**/&&&&@Override&&&&protected void onSaveInstanceState(Bundle outState) { long outTime = System.currentTimeMillis(); //屏幕切换将当前的时候保存在Bundle中 outState.putLong("time", outTime); Log.v("InstanceState", "outTime is "+ outTime);&&&&&&&&super.onSaveInstanceState(outState);&&&&}&&&&&/**切换屏幕之后在Bundle中把数据取出来**/&&&&@Override&&&&protected void onRestoreInstanceState(Bundle savedInstanceState) { //取出屏幕切换前保存的时间 Long saveTime = savedInstanceState.getLong("time");& Log.v("InstanceState", "saveTime is "+ saveTime);&&&&&&&&super.onRestoreInstanceState(savedInstanceState);&&&&}&}
看一下效果图红框内的Log信息,outTime 为很横竖切换屏幕之前保存的当前时间,SaveTime为横竖切换屏幕之后读取到之前保存的时间。通过这种方法可以正常的保存与读取数据。
总的来说这一章还是比较简单的,真的很不好意思最近MOMO实在是太忙了,每天写程序到凌晨 3
点多 早上 7点多又得爬起来上班。博客更新的也没之前快了,不过我可是时刻都惦记着大家伙和我的开发群中的好朋友们,总之还是那句老话MOMO希望可以通过写博客结识更多的开发者与更多的好朋友,我们一起为中国移动互联网的明天而努力,加油。哇咔咔!!
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!主题 : 视频播放页面已经做好了自动横竖屏的切换,现在想点击一个按钮然后屏幕切换到横屏,怎么做啊?
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 145(时)
发自: Web Page
来源于&&分类
视频播放页面已经做好了自动横竖屏的切换,现在想点击一个按钮然后屏幕切换到横屏,怎么做啊?&&&
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {        return UIInterfaceOrientationMaskAllButUpsideD}//// 支持设备自动旋转- (BOOL)shouldAutorotate {        return YES;}-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {                 [self openCameraObserveLandspaceView ];                          }else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft){            [self openCameraObserveLandspaceView ];                            }else if (toInterfaceOrientation==UIInterfaceOrientationPortrait){            [self closeCameraObserveLandspaceView];               }}
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 145(时)
发自: Web Page
大神们,求解答
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 145(时)
发自: Web Page
帅哥工程师们,有谁能解答下吗?
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 145(时)
发自: Web Page
全能的工程师们,求解答
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 145(时)
发自: Web Page
啦啦,,,来人啊
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版包灬子 的BLOG
用户名:包灬子
文章数:36
评论数:13
访问量:65142
注册日期:
阅读量:5863
阅读量:12276
阅读量:378933
阅读量:1071431
[匿名]51cto游客:
51CTO推荐博文
& 因为iOS,Android设备使用触摸屏来输入,没有传统移动游戏设备配备的按钮,十字按钮或者模拟手柄,我们需要一个虚拟手柄来控制游戏。你可以使用虚拟手柄对游戏物体进行操控,就像使用实际的手柄一样。
SneakyInput控制手柄源码:&
把源码下载下来,加入到你的项目中,别忘了在android.mk添加相关内容哦!
我们首要目标是添加一个可以让玩家进行飞船射击的按钮,他们点击按钮的时候 会发射子弹,
----------------------
接下来 &我会在项目中添加一个新的类InputLayer ,这个类继承自CCLayer,他会被添加到MainScene
CCScene&*MainScene::scene()&{&&&&&CCScene&*pScene&=&NULL;&&&&&do&{&&&&&&&&&pScene&=&CCScene::create();&&&&&&&&&MainScene&*main&=&MainScene::create();&&&&&&&&&pScene-&addChild(main,&-1);&&&&&&&&&InputLayer&*input&=&InputLayer::create();&&&&&&&&&pScene-&addChild(input,&0);&&&&&}&while&(0);&&&&&return&pS&}&
将SneakyInput添加到InputLayer的头文件中
#include&&SneakyInput/SneakyButton.h&&#include&&SneakyInput/SneakyJoystick.h&&#include&&SneakyInput/SneakyButtonSkinnedBase.h&&#include&&SneakyInput/SneakyJoystickSkinnedBase.h&&
另外,我在头文件中加了一个SneakyButton成员变量,因为我们马上就会用到。
class&InputLayer:&public&CCLayer&{&public:&&&&&InputLayer();&&&&&virtual&~InputLayer();&&&&&&SneakyButton&*snkB&&&&&&void&update(ccTime&time);&&&&&&bool&init();CREATE_FUNC(InputLayer)&&&&&;&};&
在init方法中 我们生成了一个SneakyButton
bool&InputLayer::init()&{&&&&&bool&bRet&=&false;&&&&&do&{&&&&&&&&&&CCSize&size&=&CCDirector::sharedDirector()-&getWinSize();&&&&&&&&&&float&buttonRadius&=&42;&&&&&&&&&&snkBtn&=&new&SneakyButton();&&&&&&&&&snkBtn-&autorelease();&&&&&&&&&snkBtn-&initWithRect(CCRectZero);&&&&&&&&&snkBtn-&setPosition(CCPointMake(size.width-buttonRadius,buttonRadius));&&&&&&&&&snkBtn-&setRadius(buttonRadius);&&&&&&&&&this-&addChild(snkBtn);&&&&&&&&&&this-&scheduleUpdate();&&&&&&&&&bRet&=&true;&&&&&}&while&(0);&&&&&return&bR&}&
& 因为SneakyButton没有用到initWithRect方法中的CGRect参数,所以我传了一个CGRectZero给这个方法。实际的处理触摸事件的代码是使用radius(半径)这个属性来决定按钮是否要响应触摸。
InputLayer类通过以下代码预约更新
this-&scheduleUpdate();&
更新方法是用来测试按钮是否已被点击
void&InputLayer::update(ccTime&time)&{&&&&&if&(snkBtn-&getIsActive())&{&&&&&&&&&CCLog(&按下按钮&);&&&&&}&}&
运行程序,你会发现屏幕上没有任何按钮 &不过你可以点击屏幕右下角 然后可以在log日志中正在打印&按下按钮&
接下来 &我们将让按钮可见,也就是添加皮肤
&这里 我们使用到了SneakyButtonSkinnedBase
bool&InputLayer::init()&{&&&&&bool&bRet&=&false;&&&&&do&{&&&&&&&&&&CCSize&size&=&CCDirector::sharedDirector()-&getWinSize();&&&&&&&&&&float&buttonRadius&=&42;&&&&&&&&&&snkBtn&=&new&SneakyButton();&&&&&&&&&snkBtn-&autorelease();&&&&&&&&&snkBtn-&initWithRect(CCRectZero);&&&&&&&&&&snkBtn-&setIsHoldable(true);&&&&&&&&&&SneakyButtonSkinnedBase&*sbsb&=&SneakyButtonSkinnedBase::create();&&&&&&&&&&&&&&&&&&sbsb-&setDefaultSprite(CCSprite::create(&nor.png&));&&&&&&&&&&&&&&&&&&sbsb-&setPressSprite(CCSprite::create(&tou.png&));&&&&&&&&&&&&&&&&&&sbsb-&setActivatedSprite(CCSprite::create(&tou.png&));&&&&&&&&&sbsb-&setPosition(CCPointMake(size.width-buttonRadius,buttonRadius));&&&&&&&&&sbsb-&setButton(snkBtn);&&&&&&&&&this-&addChild(sbsb);&&&&&&&&&&this-&scheduleUpdate();&&&&&&&&&bRet&=&true;&&&&&}&while&(0);&&&&&return&bR&}&
& 我们不需要设置按钮的半径属性了,因为SneakyButtonSkinnedBase类会使用提供的按钮图片来确定按钮半径的大小
接下来我们在游戏中添加摇杆
bool&InputLayer::init()&{&&&&&bool&bRet&=&false;&&&&&do&{&&&&&&&&&&CCSize&size&=&CCDirector::sharedDirector()-&getWinSize();&&&&&&&&&&float&buttonRiadus&=&75;&&&&&&&&&&snkJs&=&new&SneakyJoystick();&&&&&&&&&snkJs-&autorelease();&&&&&&&&&&snkJs-&initWithRect(CCRectMake(0,0,buttonRiadus,buttonRiadus));&&&&&&&&&&&&&&&&&&snkJs-&setAutoCenter(true);&&&&&&&&&&&&&&&&&&&snkJs-&setHasDeadzone(true);&&&&&&&&&&&&&&&&&&snkJs-&setDeadRadius(15);&&&&&&&&&&SneakyJoystickSkinnedBase&*sjssb&=SneakyJoystickSkinnedBase::create();&&&&&&&&&sjssb-&setPosition(CCPointMake(buttonRiadus*1.5,1.5*buttonRiadus));&&&&&&&&&&&&&&&&&&sjssb-&setBackgroundSprite(CCSprite::create(&handle1.png&));&&&&&&&&&&&&&&&&&&sjssb-&setThumbSprite(CCSprite::create(&handle2.png&));&&&&&&&&&sjssb-&setJoystick(snkJs);&&&&&&&&&this-&addChild(sjssb);&&&&&&&&&this-&scheduleUpdate();&&&&&&&&&bRet&=&true;&&&&&}&while&(0);&&&&&return&bR&}&
&完成摇杆的添加 &接下来要实现摇杆事件的监听&
void&InputLayer::update(ccTime&time)&{&&&&&&&CCPoint&velocity&=&ccpMult(snkJs-&getVelocity(),&800);&&&&&if&(velocity.x&!=&0&&&&velocity.y&!=&0)&{&&&&&&&&&CCLog(&x=%f,y=%f&,&velocity.x,&velocity.y);&&&&&}&}&
接下来一章将开发一个小游戏,如有问题,请提出
本教程根据Cocos2d教程翻译过来
使用的cocos2d-x版本为2.02
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 cocos2dx切换layer 的文章

 

随机推荐