cocos2d-x与UIKit混合编程实现半透明效果
关键词
cocos2d-x, UIKit, transparent
问题
cocos2d-x使用一个专门的OpenGL View进行渲染, 它的渲染和UIKit是分开进行的, 因此我们使用时一般是把cocos2d-x全屏显示, 比如 Ray的这篇教程(http://www.raywenderlich.com/4817/how-to-integrate-cocos2d-and-uikit) (cocos2d-x和cocos2d在本篇文章中没有本质区别)
如果我们把cocos2d作为一个子view插进来时, cocos2d的scene如果不加任何东西, 就会是黑色的一个矩形, 无法做成透明效果. 即使把OpenGL View的background color 设成 clearColor 也没用. cocos2d到底能不能变得透明?
通过bing艰难的找到这篇自问自答, http://stackoverflow.com/questions/12846744/cocos2d-opengl-es-becoming-transparent-over-uiview, 虽然只有一个赞, 但确实是网上唯一一个能够解决该问题的回答. 必须记录下来以飨后人.
解决方案
1. opengl view初始化时一定要选择 kEAGLColorFormatRGBA8 像素模式, 这样才能够支持透明.
[CCEAGLView viewWithFrame: CGRectMake(0, 0, winHeight, winWidth)
pixelFormat: kEAGLColorFormatRGBA8
depthFormat: GL_DEPTH24_STENCIL8_OES
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0];
2. opengl view要启用透明模式, 有一个 opaque 属性, 默认为YES, 表示会自动把覆盖区域的内容遮挡住, 这是为了优化渲染快速裁切, 我们要把它设成 NO.
glClearColor(0, 0, 0, 0);
_cocosView.backgroundColor = [UIColor clearColor];
_cocosView.opaque = NO;
3. cocos2d-x的clear color要设置为(0, 0, 0, 0). 这个值是opengl在开始渲染每一帧时, 给每个像素设置的默认值. 因为cocos2d-x和UIKit的渲染是在不同opengl管线里实现的, 因为cocos2d-x会把UIKit渲染的内容替换到, 表现出来就是黑屏.
这个需要修改cocos2d-x的源代码, 在 CCDirector.cpp 的 void Director::setGLDefaultValues() 中, 把clear color值改一下就可以了.
使用以上三步操作, 我们就可以现在透明的cocos2d-x界面, 遮罩在UIKit上方.
cocos2d-x与UIKit混合编程实现半透明效果的更多相关文章
- cocos2d 2.0和UIKit混合编程, Push CCDirector的时候出现黑屏的天坑
症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...
- Layered Windows窗口的半透明效果
介绍: Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合).半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使 ...
- 玩转cocos2d-x lua-binding, 实现c++与lua混合编程
引言 城市精灵GO(http://csjl.teamtop3.com/)是一款基于cocos2d-x开发的LBS社交游戏, 通过真实地图的探索, 发现和抓捕隐匿于身边的野生精灵, 利用游戏中丰富的玩法 ...
- swift 与 OC 混合编程
原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...
- 如玫瑰一般的PHP与C#混合编程
故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- C#Matlab混合编程类 初始化问题解决方法
************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...
随机推荐
- Python divmod方法
有95条数据 每十条存一页 all_item = 95 pager = 10 result = all_item.__divmod__(pager) print(result) (9{商},5{余数} ...
- c# windows服务如何获取自己的安装路径
public static string GetWindowsServiceInstallPath(string ServiceName) { string key ...
- Nginx禁止直接通过IP地址访问网站以及限制IP登陆某目录(关闭默认站点或空主机头)
这篇文章主要介绍了Nginx中禁止使用IP访问网站的配置实例,一般在备案时可能需要这种设置,需要的朋友可以参考下 国内因为备案的原因,所有服务器都要禁止使用IP访问网站.否则,如果允许使用IP访问 ...
- AMD Cpu 性能分析
未完待续... 首先,几款APU系列的cpu: A8-: 一款低功耗的移动版处理器,四核心主频最高2.5GHz,二级缓存2MB, 图形核心Radeon R5 内存频率DDR3-1866,热设计功耗12 ...
- JVM GC-----4、finalize()方法
finalize()方法是Object类中定义的protect方法.每一个类都可以重写该方法,给出自己的实现.当类在被回收期间,这个方法就可能会被调用到. 为什么说可能?这是由于finalize()的 ...
- 不一样的go语言之入门篇-Hello World
这是<不一样的go语言>的开篇之作,我尝试以java语言转变者的角度来聊一聊go语言.所以今天先从go语言的基础开始,即语法. 学习一门新的编程语言,必从语法开始.但需要注意的是, ...
- 我的Java自学之路
其实在转正之后我就想抽个时间好好的梳理一下我的 Java 上车之路 ,但是一直拖到现在 ,因为有学弟问到 ,所以也就给了我动力 .毕竟答应了人家的事要做到 . 首先要有相应的背景介绍 ,不然说个毛线啊 ...
- 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)
题目链接 洛谷 SPOJ BZOJ1095(简化版) 将每次Solve的重心root连起来,会形成一个深度为logn的树,就叫它点分树吧.. 我们对每个root维护两个东西: 它管辖的子树中所有白点到 ...
- 洛谷P2242 公路维修问题
To 洛谷.2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且 ...
- COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)
题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...