android游戏开发框架libgdx的使用(八)--相机和观察点

转载声明:http://www.cnblogs.com/htynkn/archive/2011/12/06/libgdx_8.html

相机也可以成为观察者,最简单的例子就是魂斗罗。

魂斗罗

玩家操作角色前进,后退,跳跃等,显示的世界(就是后面的背景)会不停变化。其实就是相机的观察点(视角)的改变引起的。

也许游戏的世界(背景地图)很大,比如10240*480,而设备的分辨率是800*480。现在游戏的角色在地图的最左侧,那么它的观察点就是(400,240)。

随着角色的向前移动,观察点也变化,通常是y值变大。

角色后退时y值变小。

角色跳跃时,x值变化。(其实地图可能要稍微高一点,比如500,这样角色的跳跃才会有效果)。

可以说相机是游戏开发的一个基本组件。而Libgdx的Stage类中就默认包含了一个Camera。

Camera类按照功能而言也有很多种,最常用的是OrthographicCamera(正投影相机),Stage中默认Camera的实现类为该类。

OrthographicCamera实现以下功能:

1.移动和旋转镜头

2.放大和缩小

3.改变观察点(视角)

4.窗体和世界的点的转化

相机的最大好处就是无需手动操作矩阵就可以移动游戏世界,所有的矩阵投影和观察点运算就是对开发者隐藏的。

相机的使用一般配合着mesh。mesh绘制一个矩形区域,然后将地图贴图在其上。

接下来的例子将使用一张图:

xk

大小2048*2048.

代码如下:

 1 package com.cnblogs.htynkn.listener;
 2  
 3 import com.badlogic.gdx.ApplicationListener;
 4 import com.badlogic.gdx.Gdx;
 5 import com.badlogic.gdx.graphics.GL10;
 6 import com.badlogic.gdx.graphics.Mesh;
 7 import com.badlogic.gdx.graphics.OrthographicCamera;
 8 import com.badlogic.gdx.graphics.Texture;
 9 import com.badlogic.gdx.graphics.VertexAttribute;
10 import com.badlogic.gdx.graphics.VertexAttributes;
11 import com.badlogic.gdx.graphics.VertexAttributes.Usage;
12 import com.badlogic.gdx.math.Rectangle;
13  
14 public class FirstGame implements ApplicationListener {
15  
16     private OrthographicCamera cam;
17     private Texture texture;
18     private Mesh mesh;
19     private Rectangle glViewport;
20  
21     @Override
22     public void create() {
23         //创建一个静态的,由两个三角形构成的4个顶点的矩形
24         //矩形分为3*2块。网格有3个位置参数(x,y,z)
25         //网格的位置属性有两个值
26         mesh = new Mesh(true, 4, 6, new VertexAttribute(
27                 VertexAttributes.Usage.Position, 3, "attr_Position"),
28                 new VertexAttribute(Usage.TextureCoordinates, 2,
29                         "attr_texCoords"));
30         texture = new Texture(Gdx.files.internal("img/xk.jpg"));
31         //设置对应的边点
32         //以第一个为例-2048f,-2048f,0是位置参数,因为是二维的,所以Z值为0
33         //0,1对应顶点坐标
34         mesh.setVertices(new float[] { -2048f, -2048f, 0, 0, 1, 2048f, -2048f,
35                 0, 1, 1, 2048f, 2048f, 0, 1, 0, -2048f, 2048f, 0, 0, 0 });
36         //设置索引,这个有点纠结,看文章详解
37         mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });
38  
39         float WIDTH = Gdx.graphics.getWidth();
40         float HEIGHT = Gdx.graphics.getHeight();
41          
42         cam = new OrthographicCamera(WIDTH, HEIGHT);
43         cam.position.set(WIDTH / 2, HEIGHT / 2, 0);
44  
45         glViewport = new Rectangle(0, 0, WIDTH, HEIGHT);
46     }
47  
48     @Override
49     public void dispose() {
50  
51     }
52  
53     @Override
54     public void pause() {
55         // TODO Auto-generated method stub
56  
57     }
58  
59     @Override
60     public void render() {
61  
62         GL10 gl = Gdx.graphics.getGL10();
63         // 相机移动 ...这里我傻逼了...各位看官忽略吧
64         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
65         gl.glViewport((int) glViewport.x, (int) glViewport.y,
66                 (int) glViewport.width, (int) glViewport.height);
67  
68         cam.update();
69         cam.apply(gl);
70         // 贴图
71         gl.glActiveTexture(GL10.GL_TEXTURE0);
72         gl.glEnable(GL10.GL_TEXTURE_2D);
73         texture.bind();
74  
75         mesh.render(GL10.GL_TRIANGLES);
76     }
77  
78     @Override
79     public void resize(int width, int height) {
80         // TODO Auto-generated method stub
81  
82     }
83  
84     @Override
85     public void resume() {
86         // TODO Auto-generated method stub
87  
88     }
89  
90 }

注意这一句:

1 mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });

这是设置索引,我用一张图来说明。

x

0,1,2是指右上角的三角形

而2,3,0是左下角的三角形

 

注意:有部分朋友反映这个例子会出现黑屏问题,但是思路是对的。

posted @ 2013-02-04 20:46  王世桢  阅读(198)  评论(0)    收藏  举报