上一节中讲了libgdx引擎框架总观,本节讲讲相机和观察点。
       相机也可以成为观察者,最简单的例子就是魂斗罗。

       玩家操作角色前进,后退,跳跃等,显示的世界(就是后面的背景)会不停变化。其实就是相机的观察点(视角)的改变引起的。
       也许游戏的世界(背景地图)很大,比如10240*480,而设备的分辨率是800*480。现在游戏的角色在地图的最左侧,那么它的观察点就是(400,240)。
       随着角色的向前移动,观察点也变化,通常是y值变大。
       角色后退时y值变小。角色跳跃时,x值变化。(其实地图可能要稍微高一点,比如500,这样角色的跳跃才会有效果)。
       可以说相机是游戏开发的一个基本组件。而Libgdx的Stage类中就默认包含了一个Camera。
       Camera类按照功能而言也有很多种,最常用的是OrthographicCamera(正投影相机),Stage中默认Camera的实现类为该类。
       OrthographicCamera实现以下功能:
       1. 移动和旋转镜头
       2. 放大和缩小
       3. 改变观察点(视角)
       4. 窗体和世界的点的转化
       相机的最大好处就是无需手动操作矩阵就可以移动游戏世界,所有的矩阵投影和观察点运算就是对开发者隐藏的。
       相机的使用一般配合着mesh。mesh绘制一个矩形区域,然后将地图贴图在其上。
       接下来的例子将使用一张图:

大小2048*2048
       代码如下:
Java代码
    - package com.cnblogs.htynkn.listener;    
     - import com.badlogic.gdx.ApplicationListener;    
     - import com.badlogic.gdx.Gdx;    
     - import com.badlogic.gdx.graphics.GL10;    
     - import com.badlogic.gdx.graphics.Mesh;    
     - import com.badlogic.gdx.graphics.OrthographicCamera;    
     - import com.badlogic.gdx.graphics.Texture;    
     - import com.badlogic.gdx.graphics.VertexAttribute;    
     - import com.badlogic.gdx.graphics.VertexAttributes;    
     - import com.badlogic.gdx.graphics.VertexAttributes.Usage;    
     - import com.badlogic.gdx.math.Rectangle;    
     - public class FirstGame implements ApplicationListener {    
     - private OrthographicCamera cam;    
     - private Texture texture;    
     - private Mesh mesh;    
     - private Rectangle glViewport;    
     - @Override    
     - public void create() {    
     -   
     -   
     -   
     - mesh = new Mesh(true, 4, 6, new VertexAttribute(    
     - VertexAttributes.Usage.Position, 3, "attr_Position"),    
     - new VertexAttribute(Usage.TextureCoordinates, 2,    
     - "attr_texCoords"));    
     - texture = new Texture(Gdx.files.internal("img/xk.jpg"));    
     -   
     -   
     -   
     - mesh.setVertices(new float[] { -2048f, -2048f, 0, 0, 1, 2048f, -2048f,    
     - 0, 1, 1, 2048f, 2048f, 0, 1, 0, -2048f, 2048f, 0, 0, 0 });    
     -   
     - mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });    
     - float WIDTH = Gdx.graphics.getWidth();    
     - float HEIGHT = Gdx.graphics.getHeight();    
     - cam = new OrthographicCamera(WIDTH, HEIGHT);    
     - cam.position.set(WIDTH / 2, HEIGHT / 2, 0);    
     - glViewport = new Rectangle(0, 0, WIDTH, HEIGHT);    
     - }    
     - @Override    
     - public void dispose() {    
     - }    
     - @Override    
     - public void pause() {    
     -   
     - }    
     - @Override    
     - public void render() {    
     - GL10 gl = Gdx.graphics.getGL10();    
     -   
     - gl.glClear(GL10.GL_COLOR_BUFFER_BIT);    
     - gl.glViewport((int) glViewport.x, (int) glViewport.y,    
     - (int) glViewport.width, (int) glViewport.height);    
     - cam.update();    
     - cam.apply(gl);    
     -   
     - gl.glActiveTexture(GL10.GL_TEXTURE0);    
     - gl.glEnable(GL10.GL_TEXTURE_2D);    
     - texture.bind();    
     - mesh.render(GL10.GL_TRIANGLES);    
     - }    
     - @Override    
     - public void resize(int width, int height) {    
     -   
     - }    
     - @Override    
     - public void resume() {    
     -   
     - }    
     - }  
 
       注意这一句:
       mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });
       这是设置索引,我用一张图来说明。

      图片分享:
      0,1,2是指右上角的三角形
      而2,3,0是左下角的三角形