关闭

android游戏开发框架libgdx的使用(二)--图形绘制

749人阅读 评论(0) 收藏 举报
 
 

首先了解一下何为texture。按照英文解释来理解:一个图片从原始格式解码并上传到GPU就被称为纹理。(说实话我不是很清楚这个的定义哈,求指点)

为了绘制texture,常常使用几何来描述,通过几何对应的顶点来描述纹理。比如要描述一个矩形,可以通过描述每个顶点来描述矩形。

要绘图时,首先要绑定纹理,然后传递一个几何描述给OpenGL进行绘制。而绘图的大小和位置由几何描述和OpenGL的viewport的设置共同决定。

当然大部分的游戏都会让viewport的大小和屏幕一致。这就意味使用像素更容易让纹理绘制在合适的大小和位置。

绘制一个矩形的几何图形是非常常见的,同样让同一个纹理在不同位置以不同大小位置也是非常常见的,比如漫天的弹幕。但是每次都传递每个形状到GPU进行绘制的效率是较低的。

所以许多相同纹理可以一起描述并一起送入GPU,这就是SpriteBatch类所要做的。

SpriteBatch被赋予了纹理和坐标以便每个图形的绘制。它(SpriteBatch)汇集了很多图形而没有直接提交给GPU。如果它被赋予的纹理不同于原有的,它将保持原有的图形,并获取新的图形。

上一篇文章其实就使用了SpriteBatch,但是没有绘制图形,现在我们来试试绘制。

先找张图片来,分辨率必须是2的次方(如32*32,256*512)。

我截取了我的桌面的一部分,分辨率调成512*512。

image1

拷贝到assets文件夹中,图片文件最好都是放在这个里面哈。

SpxImage

然后修改代码

private Texture texture;

实例化texture,texture=new Texture(Gdx.files.internal("image1.jpg"));

然后来说一下为什么要将图片放在assets文件夹中。

Gdx.files是libgdx的文件模块,主要提供以下5大功能。

读取文件

写文件

复制文件

移动文件

列出文件和目录

而获取操作文件的FileHandle有4种方法。

1.Classpath

路径相对于classpath,文件通常为只读。

2.Internal

内部文件路径相对于程序根目录或者android 的assets文件夹。

3.External

外部文件路径是相对于SD卡根目录

4.Absolute

assets文件夹本身就是存储资源的文件夹,而且相比resource文件夹,它其中的资源不会生成R中的ID,用来放图片很是合适。

所以用Gdx.files.internal("image1.jpg")获取图片,然后调用batch.draw(texture,20,10);绘制图形,20,10是坐标,笛卡尔座标,以左下角为原点。

完整代码:

package com.cnblogs.htynkn;

import com.badlogic.gdx.ApplicationListener;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.GL10;

import com.badlogic.gdx.graphics.Texture;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class FirstGame implements ApplicationListener {

    //绘图用的SpriteBatch

    private SpriteBatch batch;

    //纹理

    private Texture texture;

    @Override

    public void create() {

        batch = new SpriteBatch(); //实例化

        texture=new Texture(Gdx.files.internal("image1.jpg"));

    }

    @Override

    public void dispose() {

        // TODO Auto-generated method stub

    }

    @Override

    public void pause() {

        // TODO Auto-generated method stub

    }

    @Override

    public void render() {

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏

        batch.begin();

        batch.draw(texture,20,10);

        batch.end();

    }

    @Override

    public void resize(int width, int height) { 

        // TODO Auto-generated method stub

    }

    @Override

    public void resume() {

        // TODO Auto-generated method stub

    }

效果:

  • SpxImage

    可以看到图片不能完整显示,而实际操作中我们也经常使用图片的一部分,或者将多个图片资源集合在一个图片文件中。

    而要显示图片的一部分就可以使用TextureRegion类了。

    最常用的方法是draw(TextureRegion region, float x, float y, float width, float height)

    指定初始点和长宽。

    修改代码:

package com.cnblogs.htynkn;

import com.badlogic.gdx.ApplicationListener;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.GL10;

import com.badlogic.gdx.graphics.Texture;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class FirstGame implements ApplicationListener {

    //绘图用的SpriteBatch

    private SpriteBatch batch;

    //纹理

    private Texture texture;

    //区域

    private TextureRegion region;

    @Override

    public void create() {

        batch = new SpriteBatch(); //实例化

        texture=new Texture(Gdx.files.internal("image1.jpg"));

        region=new TextureRegion(texture, 30,80, 200,200);

    }

    @Override

    public void dispose() {

        // TODO Auto-generated method stub

    }

    @Override

    public void pause() {

        // TODO Auto-generated method stub

    }

    @Override

    public void render() {

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏

        batch.begin();

        batch.draw(region,0,0);

        batch.end();

    }

    @Override

    public void resize(int width, int height) {

        // TODO Auto-generated method stub

    }

    @Override

    public void resume() {

        // TODO Auto-generated method stub

    }

} 

  • 效果:

    SpxImage

    也许你觉得TextureRegion不够强大,没有关系,还可以使用Sprite。

    Sprite不光包含TextureRegion的功能,还可以指定位置和颜色。

关键代码:

view sourceprint?

sprite=new Sprite(texture, 80, 80, 400, 300);

sprite.setPosition(10, 10); //位置

sprite.setRotation(15);

稍微想一下前几个例子就可以发现,其实Sprite的功能就是以上的集合。但是Sprite更方便,它用一个对象描述了一切。

完整代码如下:

package com.cnblogs.htynkn;

import com.badlogic.gdx.ApplicationListener;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.GL10;

import com.badlogic.gdx.graphics.Texture;

import com.badlogic.gdx.graphics.g2d.Sprite;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class FirstGame implements ApplicationListener {

    //绘图用的SpriteBatch

    private SpriteBatch batch;

    //纹理

    private Texture texture;

    //精灵

    private Sprite sprite;

    @Override

    public void create() {

        batch = new SpriteBatch(); //实例化

        texture=new Texture(Gdx.files.internal("image1.jpg"));

        sprite=new Sprite(texture, 80, 80, 400, 300);

        sprite.setPosition(10, 10); //位置

        sprite.setRotation(15); //旋转

    }

    @Override

    public void dispose() {

        // TODO Auto-generated method stub

    }

    @Override

    public void pause() {

        // TODO Auto-generated method stub

    }

    @Override

    public void render() {

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏

        batch.begin();

        sprite.draw(batch);

        batch.end();

    }

    @Override

    public void resize(int width, int height) {

        // TODO Auto-generated method stub

    }

    @Override

    public void resume() {

        // TODO Auto-generated method stub

    }

}

效果:

  • SpxImage

    同时可以通过sprite的setColor方法为图形着色。

setColor(float r, float g, float b, float a)

其中颜色的表述都是介于0,1之间的数

SpxImageSpxImage

  • 绘制的内容基本就这么多,下一篇是关于关于2D场景的。

    写在最后:

    1.关于混合问题,默认是开启混合了的。这意味着图形绘制完成时半透明的部分已经被混合了。当混合被关闭是任何已经在场景上的东西都会被纹理代替,这适合绘制大背景。

    batch.disableBlending();

    backgroundSprite.draw(batch);

    batch.enableBlending();

    2.关于性能优化

    SpriteBatch 有个构造函数可以指定最大缓冲数目。如果数值过低会造成额外的GPU调用;过高的话将占用过多的内存。

    在SpriteBatch有个字段为maxSpritesInBatch,可以先设置一个很高的缓冲数目,然后观察maxSpritesInBatch的值以确定合适的缓冲值。

    还有一个字段renderCalls,在end被调用时,它的值表示在begin和end之间几何声明被送入GPU的次数。

    还有一个构造函数可以指定缓冲大小和数量,合理的设置可以极大地提供性能。

作者:htynkn 出处:http://www.cnblogs.com/htynkn/

0
0
查看评论

android游戏开发框架libgdx的使用(二)--图形绘制

本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。 首先了解一下何为texture。按照英文解释来理解:一个图片从原始格式解码并上传到GPU就被称为纹理。(说实话我不是很清楚这个的定义哈,求指点) 为了绘制texture,常常使用几何来描述,通过几何对...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2015-04-12 11:04
  • 605

Android游戏开发框架libgdx的使用

对于Android开发者来说,游戏开发框架是一个需要掌握的基本知识。上几篇文章介绍了libgdx框架的一些基本类的用法,也夹杂着浏览了一下部分源代码,但是如果使用libgdx进实际开发?   仅仅了解几个类是不够的,还需要对框架有具体和宏观的了解。  1.应用的生命周期   游戏应该...
  • wop_niaoren19870227
  • wop_niaoren19870227
  • 2011-12-09 13:30
  • 668

游戏开发框架libGdx

1简介编辑 libGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。它基于Apache License, Version 2.0[1] 协议,对商业使用和非商业使用均免费。代码托管于Github中。最新版本为1.5.3。 2特点编辑 ...
  • qeqeqe236
  • qeqeqe236
  • 2015-08-13 11:25
  • 431

libGDX开发教程(二)--图形绘制

图形绘制:http://blog.sina.com.cn/s/blog_940dd50a0101c0l0.html
  • heicainiuniu
  • heicainiuniu
  • 2013-10-15 22:50
  • 534

android游戏开发框架libgdx的使用-环境搭建

Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能运行在Mac、Linux、Windows等系统)与Android平台(Android1.5以上即可使用,Android2.1以上可满功率发挥)。 地址:http://code.google.com/...
  • you123you
  • you123you
  • 2012-11-23 10:30
  • 249

android游戏开发框架libgdx的使用(一)--环境搭建

Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能运行在Mac、Linux、Windows等系统)与Android平台(Android1.5以上即可使用,Android2.1以上可满功率发挥)。 logo: 地址:http://code.google...
  • qlfhqtf
  • qlfhqtf
  • 2012-11-05 09:32
  • 240

Libgdx的使用(2)——图形绘制

本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。 首先了解一下何为texture。按照英文解释来理解:一个图片从原始格式解码并上传到GPU就被称为纹理。(说实话我不是很清楚这个的定义哈,求指点) 为了绘制texture,常常使用几何来描述,通过几何对...
  • linmy1211
  • linmy1211
  • 2014-08-18 13:07
  • 605

Android游戏开发框架Libgdx的使用(一)--Libgdx基础入门

libGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。它基于Apache License, Version 2.0协议,对商业使用和非商业使用均免费。代码托管于Github中。最新版本为0.9.8。 随着2012年Android系统的飞速发展,智能手机上面的...
  • twlkyao
  • twlkyao
  • 2013-05-10 18:54
  • 1338

libgdx 图形绘制

纹理(texture) 一个图片从原始格式解码并上传到GPU就被称为纹理。OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件纹理图片才是有效的。 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图 为了绘制texture,常常使用几何来描...
  • xh16319
  • xh16319
  • 2013-10-17 21:57
  • 496

Android上使用libgdx

Android上使用libgdx libgdx是一个非常优秀的2D/3D跨平台物理引擎,今天我们介绍如何在Android上使用它: 1. 在http://code.google.com/p/libgdx/下载libgdx的最新版,我的是0.9.3,同时还有一个g...
  • htttw
  • htttw
  • 2012-05-24 23:18
  • 4301
    个人资料
    • 访问:360601次
    • 积分:4946
    • 等级:
    • 排名:第6840名
    • 原创:50篇
    • 转载:513篇
    • 译文:0篇
    • 评论:15条
    最新评论