Libgdx的使用(8)——相机和观察点
来源:互联网 发布:淘宝德邦快递单打印 编辑:程序博客网 时间:2024/05/20 15:58
本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。
玩家操作角色前进,后退,跳跃等,显示的世界(就是后面的背景)会不停变化。其实就是相机的观察点(视角)的改变引起的。
也许游戏的世界(背景地图)很大,比如1024*480,而设备的分辨率是800*480。现在游戏的角色在地图的最左侧,那么它的观察点就是(400,240)。
随着角色的向前移动,观察点也变化,通常是y值变大。
角色后退时x值变小。
角色跳跃时,y值变化。(其实地图可能要稍微高一点,比如500,这样角色的跳跃才会有效果)。
可以说相机是游戏开发的一个基本组件。而Libgdx的Stage类中就默认包含了一个Camera。
Camera类按照功能而言也有很多种,最常用的是OrthographicCamera(正投影相机),Stage中默认Camera的实现类为该类。
OrthographicCamera实现以下功能:
1.移动和旋转镜头
2.放大和缩小
3.改变观察点(视角)
4.窗体和世界的点的转化
相机的最大好处就是无需手动操作矩阵就可以移动游戏世界,所有的矩阵投影和观察点运算就是对开发者隐藏的。
相机的使用一般配合着mesh。mesh绘制一个矩形区域,然后将地图贴图在其上。
接下来的例子将使用一张图:
大小2048*2048.
代码如下:
注意这一句:
0,1,2是指右上角的三角形
相机也可以成为观察者,最简单的例子就是魂斗罗。
玩家操作角色前进,后退,跳跃等,显示的世界(就是后面的背景)会不停变化。其实就是相机的观察点(视角)的改变引起的。
也许游戏的世界(背景地图)很大,比如1024*480,而设备的分辨率是800*480。现在游戏的角色在地图的最左侧,那么它的观察点就是(400,240)。
随着角色的向前移动,观察点也变化,通常是y值变大。
角色后退时x值变小。
角色跳跃时,y值变化。(其实地图可能要稍微高一点,比如500,这样角色的跳跃才会有效果)。
可以说相机是游戏开发的一个基本组件。而Libgdx的Stage类中就默认包含了一个Camera。
Camera类按照功能而言也有很多种,最常用的是OrthographicCamera(正投影相机),Stage中默认Camera的实现类为该类。
OrthographicCamera实现以下功能:
1.移动和旋转镜头
2.放大和缩小
3.改变观察点(视角)
4.窗体和世界的点的转化
相机的最大好处就是无需手动操作矩阵就可以移动游戏世界,所有的矩阵投影和观察点运算就是对开发者隐藏的。
相机的使用一般配合着mesh。mesh绘制一个矩形区域,然后将地图贴图在其上。
接下来的例子将使用一张图:
大小2048*2048.
代码如下:
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() { //创建一个静态的,由两个三角形构成的4个顶点的矩形 //矩形分为3*2块。网格有3个位置参数(x,y,z) //网格的位置属性有两个值 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")); //设置对应的边点 //以第一个为例-2048f,-2048f,0是位置参数,因为是二维的,所以Z值为0 //0,1对应顶点坐标 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() { // TODO Auto-generated method stub } @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) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub }}
注意这一句:
mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0 });
这是设置索引,我用一张图来说明。
0,1,2是指右上角的三角形
而2,3,0是左下角的三角形
转载:http://www.huangyunkun.com/2011/12/06/libgdx_8/
0 0
- Libgdx的使用(8)——相机和观察点
- android游戏开发框架libgdx的使用(八)--相机和观察点
- android游戏开发框架libgdx的使用(八)--相机和观察点
- libgdx 学习笔记(二)相机和观察点
- libgdx游戏引擎——libgdx粒子系统的使用
- Libgdx的使用(13)——杂谈Libgdx
- Libgdx的使用(4)——舞台和演员
- Libgdx的使用(6)——演员和演出
- Libgdx的使用(17)——多语言和国际化
- 使用Libgdx时的几点注意事项
- 使用Libgdx时的几点注意事项
- libGDX——舞台类的使用
- libgdx——常见UI的使用
- Libgdx的使用(11)——Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
- android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
- 获取Google IP
- Android xml 写的控件背景
- Swift 值类型和引用类型
- 【socket】深入浅出讲解:php的socket通信
- hdu 1234_sort的陷阱
- Libgdx的使用(8)——相机和观察点
- hdu 4920暑假多校5的1010 Matrix multiplication 矩阵
- MPEG4、H263、H264
- 虚拟机Linux共享主机Windows文件夹
- c/c++结构体定义以及结合typedef的应用
- linux 静态库、共享库
- leetcode Symmetric Tree
- 土元的食用价值与药用价值
- 三星加速智能家居布局,再购Quietside