Cocos2d-x V3.0 透明处理 (Video + 3D<NativeActivity>)

Cocos2d-x V3.0 透明处理 (Video + 3D<NativeActivity>),第1张

概述1. NativeActivity透明处理      总共有以下两层,下层为Video层(SurfaceView),上层为3D OpenGL层(View),Video全屏显示,3D无图形元素的地方透明,即可以看到下层的视频。 1.1 项目中的Cocos2dxActivity.java      其主要功能为:1) 向Activity中增加一个SurfaceView,并使3D OpenGL层(Vie 1. NativeActivity透明处理

总共有以下两层,下层为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>)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1082333.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存