亲证!Cocos2d-x全屏适配iPhone X

新款iphone发布会

北京时间9月13号凌晨,苹果发布了三款新iPhone, 分别为iPhone 8、iPhone 8 Plus和iPhone X。其中iPhone 8和iPhone 8 Plus的分辨率与前几代保持一致,分别为750x1334与1242x2208,且它们都是矩形屏幕,因此开发者无需针对这两款新iPhone做特殊的适配工作。但作为苹果的第一款全面屏手机iPhone X却剪了个漂亮的刘海,并且拥有更修长的身型,分辨率更改为1125×2436,游戏如果不做修改便无法全屏适配到iPhone X。

e65957ac712babb5feb11ed44a733e9f.jpeg

C姐相信咱们的开发者小伙伴里头不乏土豪。但是即便你买得起iphone X,如果Cocos的游戏不做任何适配,就直接安装,后果将会导致运行后出现上下或者左右两大黑边,游戏体验会大打特打折扣。

1f4138e212f27323ac3c42d4924ed2e8.jpeg

开发者将会在Xcode的Console里看到如下警告信息:

```

js-tests iOS[79809:3252326] [LayoutConstraints] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. 

Try this: 

(1) look at each constraint and try to figure out which you don't expect; 

(2) find the code that added the unwanted constraint or constraints and fix it. 

(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

```

如何全屏适配iphone X

首先,需要了解iOS启动画面的配置原理,从第一代iPhone开始到现在的iPhone X,苹果提供了三套启动画面的配置方法,按时间周期分别为`Static Launch Images`、`Images Asset Catalog`和`Launch Screen Storyboard`。

多张静态图片(Static Launch Images)

早期苹果可能也没想到当今的iOS设备会出现如此多的分辨率,当时只考虑了`Static Launch Images`这种方式,在Info.plist中配置一下UILaunchImages就够了。

```

...

...

<key>UILaunchImages</key>

<array>

<dict>

<key>UILaunchImageMinimumOSVersion</key>

<string>8.0</string>

<key>UILaunchImageName</key>

<string>Default</string>

<key>UILaunchImageOrientation</key>

<string>Portrait</string>

<key>UILaunchImageSize</key>

<string>{320, 480}</string>

</dict>

<dict>

<key>UILaunchImageMinimumOSVersion</key>

<string>8.0</string>

<key>UILaunchImageName</key>

<string>Default</string>

<key>UILaunchImageOrientation</key>

<string>Landscape</string>

<key>UILaunchImageSize</key>

<string>{320, 480}</string>

</dict>

...

...

```

Cocos2d-x从1.0版本开始到最新的3.15版本,也一直都是使用这种方式来适配不同的分辨率。通过提供目标设备分辨率的启动图片并配置在Info.plist中,使游戏在目标设备上能够全屏显示。

这样做的弊端:

* 每出一款新分辨率的iOS设备,需要重新配置这个Info.plist,并提供新的启动图片

* 由于上一点,游戏需要重新适配,并出新包,提交AppStore审核

* 人工修改文本文件,容易出错

* 新添加的启动图片会增加游戏包体

可视化资源管理(Images Asset Catalog)

苹果似乎意识到多张静态图片配置启动画面的弊端,继而推出了可视化配置启动画面的方式。开发者只要将不同设备分辨率的全屏图片拖动到对应的区域即可。

f9b84c7724f579e7411e265520cb55bb.jpeg

看到上图了么,如果是支持横竖屏旋转的普通应用,足足需要配置22张图片啊。游戏由于只有竖屏或者横屏模式,图片数量可以减半,但至少也需要11张之多。

此方法解决了人工修改Info.plist的麻烦,而且如果设置了错误分辨率的图片,Xcode打包的时候会提示出错。

但是此方法还是没法适配未来可能出现的新分辨率的设备,即针对新分辨率设备需要重新出包,也没解决包体增大的问题。

强烈推荐

布局文件(Launch Screen Storyboard))

从Xcode6开始,苹果添加了一种使用Storyboard布局文件的方法设置启动画面。这种方法完美解决以上两种配置方法暴露的问题。

要将Cocos2d-x工程如何修改为使用Storyboard启动画面,只需要简单几个步骤:

* 拷贝[LaunchScreen.storyboard](https://raw.githubusercontent.com/cocos2d/cocos2d-x/v3/tests/cpp-empty-test/proj.ios/LaunchScreen.storyboard)和[LaunchScreenBackground.png](https://github.com/cocos2d/cocos2d-x/raw/v3/tests/cpp-empty-test/proj.ios/LaunchScreenBackground.png)到`proj.ios`或者`ios`目录。

2614071cef63540b96a5d388d32c8d4b.png

* 添加LaunchScreen.storyboard和LaunchScreenBackground.png进Xcode工程, 并确认在`Build Phases` -> `Copy Bundle Resource`存在这两个文件。

43ac21625804a3257332b4ff017e451c.jpeg

* 工程配置中General -> App Icons and Launch Images中设置Launch Screen File为LaunchScreen。

38fdfe7ab7be6534612a999c1bb7583c.jpeg

* 删除Info.plist中无用的UILaunchImages字段

* 删除无用的旧的启动图片,Default.png, Default@2x.png, Default-568h@2x.png等

具体的修改可以戳「阅读原文」进入Github参考。

修改完,编译运行程序,在iPhone X模拟器中就能够看到游戏已经完美实现全屏了。

86adf8f703164c2eb5da9bfc3217e499.jpeg

总结

Storyboard设置启动画面具备更强大的扩展性,目前引擎的示例中只是添加一张图片放到全屏的UIImageView中,开发者可以根据对启动画面的需求,修改storyboard,添加UILabel等其他iOS系统控件,实现更加丰富的布局效果。

虽然Cocos2d-x优先支持iphone X全屏适配,但Cocos Creator随后就到。小伙伴们敬请期待!

其他

最近社区有小伙伴反馈:xcode9模拟器运行自身应用时很流畅,但在运行Cocos项目时却巨卡无比。是的,我们也发现了这个问题,而且坑爹的是,这是苹果自己弄出来的BUG,我们在引擎层面无力修复。

苹果论坛相关帖子 :

forums.developer.apple.com/message/259528#259528

苹果官方人员的回复是:

410cd93530350bf21043be6f181e30f5.png

也就是说,iOS 11、tvOS 11、watchOS 4的模拟器里面,在OpenGLES.framework是有BUG的,导致性能很低。所以只能坐等苹果修复咯。修复之前,先把自己的iphone升级到iOS 11做真机调试吧。

5fc3664b10ea65f955f324d21f72d01a.gif

戳原文,布局文件详细修改方案!

參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 主要修改兩個檔案: CCEGLView.h CCEGLView.cpp 它們在工程里的位置是 libcocos2d->platform->win32 先打開 CCEGLView.h 在 public: 底下加上一個新功能: void setFullScreen(bool flag); 另外在 private: 里加上一個新變數: bool m_bFullScreen; 接下來是 CCEGLView.cpp: 在 Constructor 加上 m_bFullScreen 的初始值: CCEGLView::CCEGLView() : m_bCaptured(false) , m_hWnd(NULL) , m_hDC(NULL) , m_hRC(NULL) , m_lpfnAccelerometerKeyHook(NULL) , m_bFullScreen(false) 再加上我們的 setFullScreen(): void CCEGLView::setFullScreen(bool flag) { m_bFullScreen = flag; } 然後在 Create() 里, 把CreateWindowEx() 那段改成下邊這樣: /////////////// FULLSCREEN HACK - BEGIN DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style DWORD dwStyle = WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX; // Window Style if (m_bFullScreen) { DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings;,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure dmScreenSettings.dmPelsWidth = w; // Selected Screen Width dmScreenSettings.dmPelsHeight = h; // Selected Screen Height dmScreenSettings.dmBitsPerPel = 32; // Selected Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. if (ChangeDisplaySettings(&dmScreenSettings;,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode. if (MessageBox(NULL, L"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",L"cocos2d-x",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { setFullScreen(false); // back to windowed mode } else { // Pop Up A Message Box Letting User Know The Program Is Closing. MessageBox(NULL,L"Program Will Now Close.",L"ERROR",MB_OK|MB_ICONSTOP); return FALSE; // Return FALSE } } else // yeah! we are in fullscreen { dwExStyle = WS_EX_APPWINDOW; dwStyle=WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; //ShowCursor(FALSE); RECT rect; rect.left=(long)0; // Set Left Value To 0 rect.right=(long)w; // Set Right Value To Requested Width rect.top=(long)0; // Set Top Value To 0 rect.bottom=(long)h; // Set Bottom Value To Requested Height AdjustWindowRectEx(&rect;, dwStyle, FALSE, dwExStyle); // Adjust To True Requested Size } } /////////////// FULLSCREEN HACK - END // create window m_hWnd = CreateWindowEx( dwExStyle, // Extended Style For The Window kWindowClassName, // Class Name wszBuf, // Window Title dwStyle, // Defined Window Style 0, 0, // Window Position 0, // Window Width 0, // Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL ); CC_BREAK_IF(! m_hWnd); 基本上這樣已搞定. 最後在我們自己項目的 main.cpp 里選擇全屏即可: AppDelegate app; CCEGLView& eglView = CCEGLView::sharedOpenGLView(); eglView.setFullScreen(true); eglView.setViewName("Hello Tests"); eglView.setFrameSize(1920, 1080); 要注意事項: - eglView.setFullScreen(true) 一定要在 eglView.setViewName("xxx") 前面. - eglView.setFrameSize(1920, 1080) 設定的大小, 一定要是顯卡可以支持的. - 不能再用CCDirector::sharedDirector()->enableRetinaDisplay(true)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值