Android游戲引擎libgdx使用教程8:相機(jī)和觀察點(diǎn)
上一節(jié)中講了libgdx引擎框架總觀,本節(jié)講講相機(jī)和觀察點(diǎn)。
相機(jī)也可以成為觀察者,最簡單的例子就是魂斗羅。
玩家操作角色前進(jìn),后退,跳躍等,顯示的世界(就是后面的背景)會(huì)不停變化。其實(shí)就是相機(jī)的觀察點(diǎn)(視角)的改變引起的。
也許游戲的世界(背景地圖)很大,比如10240*480,而設(shè)備的分辨率是800*480?,F(xiàn)在游戲的角色在地圖的最左側(cè),那么它的觀察點(diǎn)就是(400,240)。
隨著角色的向前移動(dòng),觀察點(diǎn)也變化,通常是y值變大。
角色后退時(shí)y值變小。角色跳躍時(shí),x值變化。(其實(shí)地圖可能要稍微高一點(diǎn),比如500,這樣角色的跳躍才會(huì)有效果)。
可以說相機(jī)是游戲開發(fā)的一個(gè)基本組件。而Libgdx的Stage類中就默認(rèn)包含了一個(gè)Camera。
Camera類按照功能而言也有很多種,最常用的是OrthographicCamera(正投影相機(jī)),Stage中默認(rèn)Camera的實(shí)現(xiàn)類為該類。
OrthographicCamera實(shí)現(xiàn)以下功能:
1. 移動(dòng)和旋轉(zhuǎn)鏡頭
2. 放大和縮小
3. 改變觀察點(diǎn)(視角)
4. 窗體和世界的點(diǎn)的轉(zhuǎn)化
相機(jī)的***好處就是無需手動(dòng)操作矩陣就可以移動(dòng)游戲世界,所有的矩陣投影和觀察點(diǎn)運(yùn)算就是對開發(fā)者隱藏的。
相機(jī)的使用一般配合著mesh。mesh繪制一個(gè)矩形區(qū)域,然后將地圖貼圖在其上。
接下來的例子將使用一張圖:
大小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() {
- //創(chuàng)建一個(gè)靜態(tài)的,由兩個(gè)三角形構(gòu)成的4個(gè)頂點(diǎn)的矩形
- //矩形分為3*2塊。網(wǎng)格有3個(gè)位置參數(shù)(x,y,z)
- //網(wǎng)格的位置屬性有兩個(gè)值
- 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"));
- //設(shè)置對應(yīng)的邊點(diǎn)
- //以***個(gè)為例-2048f,-2048f,0是位置參數(shù),因?yàn)槭嵌S的,所以Z值為0
- //0,1對應(yīng)頂點(diǎn)坐標(biāo)
- mesh.setVertices(new float[] { -2048f, -2048f, 0, 0, 1, 2048f, -2048f,
- 0, 1, 1, 2048f, 2048f, 0, 1, 0, -2048f, 2048f, 0, 0, 0 });
- //設(shè)置索引,這個(gè)有點(diǎn)糾結(jié),看文章詳解
- 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();
- // 相機(jī)移動(dòng)
- 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 });
這是設(shè)置索引,我用一張圖來說明。
圖片分享:
0,1,2是指右上角的三角形
而2,3,0是左下角的三角形