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

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

一、首先创建一个活动(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值