libGdx专题

附录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);
}
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传递了过去 。

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();
    }
}

绘制基本就这样了。

上一篇 下一篇

猜你喜欢

热点阅读