安卓第三课:关于第四章中的OPENGL【大方向上的介绍】

来源:互联网 发布:肩膀疼 知乎 编辑:程序博客网 时间:2024/06/05 00:36

个人觉得第四章偏难了点,因为理解上需要对数学矩阵以及三维映射方面有较为全面的理解。所以这里我们只是对第四章的大方向进行简介,具体的细节自己把握。

一、首先创建一个活动(Activity)SFGame,那么如何从主菜单界面过渡到该活动呢?
添加start按钮的click事件监听:

   

        ImageButton start = (ImageButton)findViewById(R.id.btnStart);        start.getBackground().setAlpha(SFEngine.MENU_BUTTON_ALPHA);        start.setHapticFeedbackEnabled(SFEngine.HAPTIC_BUTTON_FEEDBACK);        start.setOnClickListener(new OnClickListener(){            @Override            public void onClick(View v) {                /** Start Game!!!! */                Intent game = new Intent(getApplicationContext(),SFGame.class);                SFMainMenu.this.startActivity(game);            }                    });

这样就通过点击start按钮创建一个从SFMainMenu到SFGame的意图(Intent)。

二、接下来就是说明SFGame活动所调用的游戏视图
重载SFGame的OnCreate,利用:
   
@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        gameView = new SFGameView(this);        setContentView(gameView);    }


表明该活动调用的视图界面是SFGameView的一个实例化对象gameView。
而SFGameView继承自GLSurfaceView,主要依靠渲染器(Renderer)来实现:

  
 public SFGameView(Context context) {        super(context);                renderer = new SFGameRenderer();                this.setRenderer(renderer);    }

三、后面的重点就是关于这个渲染器的东西了。
        三个需要重载的函数:
        onDrawFrame、onSurfaceChanged和onSurfaceCreated

        1、首先我们来看onSurfaceCreated

   
    gl.glEnable(GL10.GL_TEXTURE_2D);//必须的,表示可以将纹理投影    gl.glClearDepthf(1.0f);    gl.glEnable(GL10.GL_DEPTH_TEST);    gl.glDepthFunc(GL10.GL_LEQUAL);//以上三行主要就是设置深度缓存,深度就相当于3D的Z轴    gl.glEnable(GL10.GL_BLEND);         gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); //设置色彩混合(one,one)表示两种颜色简单相加    background.loadTexture(gl,SFEngine.BACKGROUND_LAYER_ONE, SFEngine.context);    background2.loadTexture(gl,SFEngine.BACKGROUND_LAYER_TWO, SFEngine.context);//加载两个背景纹理

        2、然后我们来看onSurfaceChanged
    gl.glViewport(0, 0, width,height);//开个窗看纹理    gl.glMatrixMode(GL10.GL_PROJECTION);//投影矩阵    gl.glLoadIdentity();//初始化(重置矩阵)    gl.glOrthof(0f, 1f, 0f, 1f, -1f, 1f);//看到纹理的大小

        3、最后我们来看onDrawFrame
    try {        Thread.sleep(SFEngine.GAME_THREAD_FPS_SLEEP);    } catch (InterruptedException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }//以上线程休眠    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//清空缓存    scrollBackground1(gl);    scrollBackground2(gl);//滚动背景1和2    //All other game drawing will be called here    gl.glEnable(GL10.GL_BLEND);    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); //色彩简单相加。

        看到这里又出现了两个新函数scrollBackground1和scrollBackground2。这两个函数主要就是用来绘制背景,并设置背景滚动。
        这两个函数和onSurfaceCreated中的background.loadTexture函数一样都利用了SFBackground类中的矩阵和纹理投影进行了一系列的操作。具体的过程大家慢慢查资料吧,涉及到一些数学矩阵、投影方面的内容,比较麻烦,不深入了。主要就是根据顶点矩阵和纹理矩阵进行缩放、移动等匹配,然后绘制出合适的背景图片过程。






0 0
原创粉丝点击