
总共有以下两层,下层为VIDeo层(SurfaceVIEw),上层为3D OpenGL层(VIEw),VIDeo全屏显示,3D无图形元素的地方透明,即可以看到下层的视频。
1.1 项目中的Cocos2dxActivity.java其主要功能为:1) 向Activity中增加一个SurfaceVIEw,并使3D OpenGL层(VIEw)位于最上面。
2) 播放视频
其完整原代码如下所示:
package org.cocos2dx.cpp;import androID.app.NativeActivity;import androID.app.Activity;import androID.graphics.PixelFormat;import androID.media.MediaPlayer;import androID.os.Bundle;import androID.util.Log;import androID.vIEw.SurfaceHolder;import androID.vIEw.SurfaceVIEw;import androID.vIEw.VIEw;import androID.Widget.button;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.linearLayout;import androID.Widget.linearLayout.LayoutParams;import androID.vIEw.VIEwGroup;import java.io.IOException;public class Cocos2dxActivity extends NativeActivity{ private static final String TAG="MyGame"; private SurfaceVIEw mediaPlayVIEw; private SurfaceHolder mediaSurfaceHolder = null; private MediaPlayer mediaPlayer; private boolean isMediaPlay = false; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { // Todo auto-generated method stub super.onCreate(savedInstanceState); Log.d(TAG,"onCreate start..."); mediaPlayVIEw = new SurfaceVIEw(this); mediaSurfaceHolder = mediaPlayVIEw.getHolder(); mediaSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mediaSurfaceHolder.addCallback(new MediaSurfaceHolderCallBack()); linearLayout.LayoutParams para = new linearLayout.LayoutParams( linearLayout.LayoutParams.FILL_PARENT,linearLayout.LayoutParams.FILL_PARENT); /* linearLayout.LayoutParams para = new linearLayout.LayoutParams( linearLayout.LayoutParams.WRAP_CONTENT,linearLayout.LayoutParams.WRAP_CONTENT); */ //this.setContentVIEw(mediaPlayVIEw); // remove old vIEws this.addContentVIEw(mediaPlayVIEw,para); // keep old vIEws VIEwGroup vg = (VIEwGroup)mediaPlayVIEw.getParent(); Log.d(TAG,"child count=" + vg.getChildCount()); /* int count = vg.getChildCount(); for(int i=0; i<count; i++){ VIEw vIEw = vg.getChildAt(i); Log.d(TAG,"index=" + i +":vIEw = " + vIEw); }*/ VIEw vIEw0 = vg.getChildAt(0); if(null != vIEw0) vIEw0.bringToFront(); //For supports translucency //1.change "attribs" in cocosd\platform\androID\nativeactivity.cpp /*const EGlint attribs[] = { EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,//EGL_BLUE_SIZE,5,-->delete //EGL_GREEN_SIZE,6,-->delete //EGL_RED_SIZE,-->delete EGL_BUFFER_SIZE,32,//-->new fIEld EGL_DEPTH_SIZE,16,EGL_STENCIL_SIZE,8,EGL_NONE };*/ //2.Set the format of window getwindow().setFormat(PixelFormat.TRANSLUCENT); } MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { @OverrIDe public voID onPrepared(MediaPlayer mp) { Log.d(TAG,"onPrepared..."); int mVIDeoWIDth = 0; int mVIDeoHeight = 0; mVIDeoWIDth = mp.getVIDeoWIDth(); mVIDeoHeight = mp.getVIDeoHeight(); mediaSurfaceHolder.setFixedSize(mVIDeoWIDth,mVIDeoHeight); mp.start(); //Log.d(TAG,"isPlaying: " + mediaPlayer.isPlaying()); //mediaPlayer.setLooPing(true); isMediaPlay = true; } }; private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { public voID onCompletion(MediaPlayer mp) { Log.d(TAG,"onCompletion..."); //isMediaPlay = false; mp.seekTo(0); mp.start(); } }; @OverrIDe protected voID onPause() { // Todo auto-generated method stub super.onPause(); } private class MediaSurfaceHolderCallBack implements SurfaceHolder.Callback{ @OverrIDe public voID surfaceChanged(SurfaceHolder holder,int format,int wIDth,int height) { Log.d(TAG,"surfaceChanged...,wIDth="+wIDth+",height="+height); } @OverrIDe public voID surfaceCreated(SurfaceHolder holder) { Log.d(TAG,"surfaceCreated..."); mediaPlayer = new MediaPlayer(); mediaPlayer.setonPreparedListener(mPreparedListener); mediaPlayer.setonCompletionListener(mCompletionListener); try { //mediaPlayer.setDataSource("/sdcard/vIDeo/aoa.mp4"); mediaPlayer.setDataSource("/sdcard/NativeMedia.ts"); } catch (IllegalArgumentException e) { e.printstacktrace(); } catch (IllegalStateException e) { e.printstacktrace(); } catch (IOException e) { e.printstacktrace(); } mediaPlayer.setdisplay(mediaSurfaceHolder); try { mediaPlayer.prepareAsync(); } catch (IllegalStateException e) { e.printstacktrace(); } } @OverrIDe public voID surfaceDestroyed(SurfaceHolder holder) { if( mediaPlayer.isPlaying() ){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } if( mediaSurfaceHolder != null ){ mediaSurfaceHolder = null; } } } } 1.2 项目中的nativeactivity.cpp 1.2.1 修改EGL属性
其代码变化如下engine_init_display:
#if 0 const EGlint attribs[] = { EGL_SURFACE_TYPE,EGL_BLUE_SIZE,EGL_GREEN_SIZE,EGL_RED_SIZE,EGL_DEPTH_SIZE,EGL_NONE };#else const EGlint attribs[] = { EGL_SURFACE_TYPE,-->delete //EGL_GREEN_SIZE,-->delete //EGL_RED_SIZE,-->delete EGL_BUFFER_SIZE,//-->new fIEld EGL_DEPTH_SIZE,EGL_NONE };#endif 1.2.2 清除color buffer
在engine_draw_frame中增加一行代码:glClearcolor(0.0f,0.0f,0.0f);
static voID engine_draw_frame(struct engine* engine) { LOG_RENDER_DEBUG("engine_draw_frame(...)"); pthread_t thisthread = pthread_self(); LOG_RENDER_DEBUG("pthread_self() = %X",thisthread); // add code to clear color buffer for transparency glClearcolor(0.0f,0.0f); if (engine->display == NulL) { // No display. LOGW("engine_draw_frame : No display."); return; } dispatch_pending_runnables(); cocos2d::Director::getInstance()->mainLoop(); LOG_RENDER_DEBUG("engine_draw_frame : just called cocos' mainLoop()"); /* // Just fill the screen with a color. */ /* glClearcolor(((float)engine->state.x)/engine->wIDth,engine->state.angle,*/ /* ((float)engine->state.y)/engine->height,1); */ /* glClear(GL_color_BUFFER_BIT); */ if (s_pfEditTextCallback && editBoxText) { s_pfEditTextCallback(editBoxText,s_ctx); free(editBoxText); editBoxText = NulL; } eglSwapBuffers(engine->display,engine->surface);} 总结 以上是内存溢出为你收集整理的Cocos2d-x V3.0 透明处理 (Video + 3D<NativeActivity>)全部内容,希望文章能够帮你解决Cocos2d-x V3.0 透明处理 (Video + 3D<NativeActivity>)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)