Android游戏引擎libgdx使用教程8:相机和观察点

上一节中讲了libgdx引擎框架总观,本节讲讲相机和观察点。

创新互联从2013年成立,先为陈仓等服务建站,陈仓等地企业,进行企业商务咨询服务。为陈仓企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

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

[[91329]]

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

也许游戏的世界(背景地图)很大,比如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

代码如下:

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

注意这一句:

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

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

图片分享:

0,1,2是指右上角的三角形
而2,3,0是左下角的三角形

标题名称:Android游戏引擎libgdx使用教程8:相机和观察点
文章URL:http://www.shufengxianlan.com/qtweb/news13/151763.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联