android遊戲開發架構libgdx的使用(八)–相機和觀察點

來源:互聯網
上載者:User

本文使用的libgdx是0.92版本,和現在的最新版可能有一些不一樣的地方。全文內容僅供參考。

相機也可以成為觀察者,最簡單的例子就是魂鬥羅。

玩家操作角色前進,後退,跳躍等,顯示的世界(就是後面的背景)會不停變化。其實就是相機的觀察點(視角)的改變引起的。

也許遊戲的世界(背景地圖)很大,比如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.

代碼如下:

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是左下角的三角形

 

注意:有部分朋友反映這個例子會出現黑屏問題,但是思路是對的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.