附录2:LibGdx绘制的最少代码
2021-06-19 本文已影响0人
大旺旺的弟弟小旺旺
OpenGLES专题附录2中自己封装了surfaceView自己创建一个线程来进行刷新进行渲染,专题主要讲述的是opengles的基础知识和使用,这里使用GLSurfaceView来搭建代码框架,这个整体参考的是LibGDX结构。
先定一个接口,所有的绘制操作在接口的实现方法里面完成。
- 布局
<android.opengl.GLSurfaceView
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="634dp">
</android.opengl.GLSurfaceView>
- 定义接口
public interface ApplicationListener {
public void create ();
public void resize (int width, int height);
public void render();
public void pause ();
public void resume ();
public void dispose ();
void surfaceChanage(int width, int height);
}
- 创建AndroidGraphics
public class AndroidGraphics implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener{
ApplicationListener applicationListener;
private GLSurfaceView view ;
public AndroidGraphics(MainActivity mainActivity){
mainActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
mainActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
view = mainActivity.findViewById(R.id.surface);
// view = new MySurfaceView(mainActivity);
view.setEGLContextClientVersion(2);
view.setEGLConfigChooser(8, 8, 8, 8, 16, 8);//这个应该很熟悉了吧,EGL中说过
view.setRenderer(this);
view.setRenderMode(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
// view.setRenderer(new MyRenderer(mainActivity));
// view.setEGLConfigChooser(8, 8, 8, 8, 16, 16);
// view.getHolder().setFormat(PixelFormat.TRANSLUCENT);
// view.setZOrderOnTop(true);
// view.setRenderer(new ParticleRenderer(mainActivity));
// ViewGroup.LayoutParams lp = view.getLayoutParams();
// Point point_width = new Point();
// mainActivity.getWindowManager().getDefaultDisplay().getSize(point_width);
// lp.width = 1280;
// lp.height = 720;
// view.setLayoutParams(lp);
applicationListener = new MyGame(mainActivity);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
applicationListener.create();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0,0,width,height);
applicationListener.surfaceChanage(width,height);
}
@Override
public void onDrawFrame(GL10 gl) {
applicationListener.render();
}
public void onPause() {
((GLSurfaceView)(view)).onPause();
applicationListener.pause();
}
public void onResume() {
if (view!=null)
((GLSurfaceView)(view)).onResume();
applicationListener.resume();
}
public View getView() {
return view;
}
@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture) {
view.setRenderer(this);
}
}
所有的案例都是在MyGame中写的,这个以为没有做文件读取,纹理使用的时候需要一个上下文,所以将activity传递了过去 。
- MyGame的代码
public class MyGame extends Game {
private BaseGameScreen baseGameScreen;
public MyGame(MainActivity mainActivity){
//使用自定义宽高布局
baseGameScreen = new ImageShuiyin(mainActivity);
}
@Override
public void create() {
baseGameScreen.create();
}
@Override
public void render() {
GLES20.glClearColor(0.5F,0.5F,0.5F,1);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT |GLES20.GL_STENCIL_BUFFER_BIT);
baseGameScreen.render();
}
@Override
public void dispose() {
}
@Override
public void surfaceChanage(int width, int height) {
baseGameScreen.surfaceChange(width,height);
}
@Override
public void resume() {
super.resume();
// shape.resume();
}
@Override
public void pause() {
super.pause();
// shape.pause();
}
}
绘制基本就这样了。