个人觉得第四章偏难了点,因为理解上需要对数学矩阵以及三维映射方面有较为全面的理解。所以这里我们只是对第四章的大方向进行简介,具体的细节自己把握。
一、首先创建一个活动(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类中的矩阵和纹理投影进行了一系列的操作。具体的过程大家慢慢查资料吧,涉及到一些数学矩阵、投影方面的内容,比较麻烦,不深入了。主要就是根据顶点矩阵和纹理矩阵进行缩放、移动等匹配,然后绘制出合适的背景图片过程。