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

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=19765&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

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


201112061841125812.jpg

2012-1-17 21:34 上传
下载附件(40.47 KB)


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

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

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

角色后退时y值变小。

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

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

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

OrthographicCamera实现以下功能:

1.移动和旋转镜头

2.放大和缩小

3.改变观察点(视角)

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

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

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

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


201112061841248635.jpg

2012-1-17 21:34 上传
下载附件(25.36 KB)


大小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. }
复制代码
注意这一句:

  1. mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });
复制代码
这是设置索引,我用一张图来说明。 201112061841319271.png
2012-1-17 21:34 上传
下载附件(10.03 KB)

0,1,2是指右上角的三角形而2,3,0是左下角的三角形
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值