月度归档: 2012 年 8 月

  • android游戏开发框架libgdx的使用(二十四)—physics-body-editor配合Box2D加快开发

    android游戏开发框架libgdx的使用(二十四)—physics-body-editor配合Box2D加快开发

    Box2d是一个很出名的2d物理引擎,有C++、Java等等版本。libgdx对Box2D进行了很高效的封装,极大的降低了学习和使用成本。

    但是我觉得和Libgdx的UI库比起来,Box2D的使用始终比较复杂,单纯的物体降落什么的还好说,要是遇上一个特别复杂的物体,有时候就有点繁琐了。

    在网上游荡时发现了physics-body-editor,绝对堪称神器。

    physics-body-editor

    项目主页:http://code.google.com/p/box2d-editor/

    libgdx-box2d-1

    复杂对象的创建只需要用鼠标点点就行了。

    工具可以到处Json格式的文件,还可以用于其他环境中。

    对于Libgdx而言,该项目有一个专门的loader可供使用。

    第一个小瓶子

    我想了半天都没有找到一个合适的例子可以用做演示,干脆就用官方提供了那个瓶子的图片做演示。

    启动编辑器,新建一个项目,导入我们要的图片。

    libgdx-box2d-2

    点点鼠标把边描绘出来。

    libgdx-box2d-4

    编辑器还可以进行测试,点击鼠标拖动就可以出现不同大小和速度的小球。

    libgdx-box2d-3

    保存项目,你可以获得一个Json格式的文件。

    将压缩包中的loader引入项目。

    使用

    BodyEditorLoader loader =new BodyEditorLoader(Gdx.files.internal("box2d/b.json"));

    读入配置文件。然后创建一个动态对象:

    BodyDef bd =new BodyDef();
    bd.type = BodyType.DynamicBody;

    指定密度等等

    FixtureDef fd =new FixtureDef();
    fd.density =1;
    fd.friction =0.5f;
    fd.restitution =0.3f;
  • android游戏开发框架libgdx的使用(二十三)—使用Universal Tween Engine实现动画效果

    android游戏开发框架libgdx的使用(二十三)—使用Universal Tween Engine实现动画效果

    libgdx的ui库可以实现一些动画效果,但是做游戏来说可能有些不足。Universal Tween Engine是一个纯java实现的动画库。

    地址:http://code.google.com/p/java-universal-tween-engine/

    只要能够用float表示的一切java对象它可以让它动画化,可以使用于Libgdx、Android、Swing等等。

    Universal Tween Engine使用一般流程

    使用Universal Tween Engine最重要的一个步骤就是实现TweenAccessor接口,这个接口定义了getValues和setValues方法。

    然后Engine中注册对应的接口。然后定义一些动画效果并添加到管理器中。最后用update方法更新时间。

    具体的可以参考一下Wiki:http://code.google.com/p/java-universal-tween-engine/wiki/GetStarted

    在libgdx中实现简单动画

    我比较喜欢使用Stage,所以下面的例子都是Stage中的。

    首先实现TweenAccessor接口,我没有区分对待,比如给Image写一个,再给Button写个啥的。我直接给Actor写了一个,这样都可以用。

    getValues和setValues中我定义了3中操作:只修改X值;只修改Y值;修改X和Y值。

    publicstaticfinalint POSITION_X =1;
    publicstaticfinalint POSITION_Y =2;
    publicstaticfinalint POSITION_XY =3;

     

    这里注意一下getValues的返回值,你修改或者操作了几个值就返回几。

    代码如下:

    package com.cnblogs.htynkn;
    
    import aurelienribon.tweenengine.TweenAccessor;
    
    import com.badlogic.gdx.scenes.scene2d.Actor;
    
    publicclass 
  • android游戏开发框架libgdx的使用(二十二)—利用TABLELAYOUT进行布局

    android游戏开发框架libgdx的使用(二十二)—利用TABLELAYOUT进行布局

    前面有一篇文章介绍了用TWL进行布局,最近做其他java的东西接触到了table-layout,用着很不错,仔细看来一下文档,原来还支持libgdx。

    简单试用了一下,比TWL好使多了。

    TABLELAYOUT简介

    tablelayout-logo

    TABLELAYOUT是一个轻量级的UI组件布局库。使用表格实现,有点像HTML的TABLE。

    它支持libgdx, Swing, Android和TWL。支持Java API和配置文件两种方式。

    同时有个配套的编辑器http://table-layout.googlecode.com/svn/wiki/jws/editor.jnlp

    使用配置文件

    其实最好的方法应该是使用配置文件,这样便于修改,还可以利用工具进行可视化编辑。但是libgdx对于配置文件的支持好像没有很到位(或者是版本修改等等问题)。

    所以先介绍配置文件方式。配置文件的具体书写格式请参考table-layout主页。

    打开编辑器,绘制一个简单的游戏界面,包含一个开始按钮和设置按钮。

    libgdx-layout-1

    配置文件如下:

    debug
    *spacing:12 padding:5 align:center
    
    ---
    [StartButton] width:200 height:60
    ---
    [PrefButton] width:200 height:60

    那个debug是显示边框的,方便调试。空间以对应的类型为结尾,比如StartButton就是按钮。

    第二行定义的是全局样式。还有很多其他样式可以定义,我个人觉得很Css盒子模型很接近。

    将文件保存为main.layout。

    因为TableLayout是在Stage中使用的,所以很其他的Actor的用法雷同。先添加一个table,在从table中获取TableLayout。然后定义控件,并和配置文件中的名字一一对应注册进去,最后加载配置文件。

    先新建一个table并添加到stage中

    Table table =new Table(skin);
    
  • android游戏开发框架libgdx的使用(二十一)—使用TTF字库支持中文

    android游戏开发框架libgdx的使用(二十一)—使用TTF字库支持中文

    好久没有更新这个系列的文章了。今天下午在群上讨论libgdx对中文的支持问题。本来Hiero做是最好的,但是LIbgdx的BitmapFont不支持多图,常用汉字3500个,是在做不到一张图上。

    libgdx很早之前就有ttf的支持了,不过那个时候有点问题。经测试新版本(0.96)完全支持,特地总结出来和大家分享。

    TTF字库

    TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式,应用范围非常广。

    如果是Windows操作系统,可以从Fonts文件夹中找到很多字库。也可以从网上下载。

    我推荐YaHei.Consolas字库,看着很爽,反正我的eclipse就是用的这个字库。

    gdx-setup-ui的使用

    从libgdx下载0.96版本,可以看到文件结构如下:

    libgdx-chinese-1

    强烈运行gdx-setup-ui.jar,这一个项目初始化工具。

    运行界面如下:

    libgdx-chinese-2

    项目名字,包名什么的按情况填写。在中间的Required配置中可以直接下载最新的稳定版本和Nightly版本。不过推荐选用本地的附件。

    libgdx-chinese-3

    不用解压,直接选择zip文件,它会自动抽取需要的文件。

    我使用的Eclipse,直接Import即可。

    libgdx-chinese-4

    我只生成了桌面项目,一般可以把Android和Web的一起生成了。

    注意一下,默认的Android项目对应的SDK是15,可以根据需要更改。有时候导入的项目会有红色感叹号,添加一个assets文件夹即可。

    libgdx-chinese-5

    其中back-libgdx项目是我们的核心,一切逻辑什么的都在这里实现。back-libgdx-XXX是对应的启动而已。

    libgdx使用TTF字库

    准备一个TTF字库改名为font.ttf复制到assets文件夹。从压缩包中找到gdx-stb-truetype-natives.jar和gdx-stb-truetype.jar。其中gdx-stb-truetype-natives.jar添加到桌面项目,gdx-stb-truetype.jar添加到核心项目中去。如图:

    libgdx-chinese-6

    现在来看看最关键的方法TrueTypeFontFactory.createBitmapFont。

    我们通过它创建一个支持ttf字库的BitmapFont出来。它需要一个FileHandle和要支持的文字。当然还有一些参数,具体意义可以参考API文档。

    也就是说我们需要使用TTF字库的哪些文字必须声明出来。不过问题也不到,3500常用汉字基本可以满足要求。网上还有一个常用500字,不过那个完全不够用。

    我这里随便写几个作为演示。

    publicstaticfinal String FONT_CHARACTERS ="世界人民爱好的美好中文支持再看看";

    然后使用初始化

    font = TrueTypeFontFactory.createBitmapFont(
    Gdx.files.internal("font.ttf"), FONT_CHARACTERS,12.5f,7.5f,
    1.0f, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    剩下的工作和使用Hiero一样的了。

    publicclass App implements ApplicationListener 
  • 基础工具–Guava-Libraries学习笔记(一)

    基础工具–Guava-Libraries学习笔记(一)

    什么是Guava-Libraries?

    Guava-Libraries是google对java的一个扩展,主要涵盖集合、缓存、并发、I/O、反射等等。

    它本来是Google内部所使用的一个类库,后来整理开源出来了。这套库的设计引入了很多新的理念,研究一下可能会使你对Java这门语言有新的认识和看法。

    地址:http://code.google.com/p/guava-libraries/

    这篇短文主要是关于Guava-Libraries基础工具,内容是我参考官方wiki和自己的使用体验结合而成。

    null的使用

    null在java中是一个很特殊的东西。它可以标识一个不确定的对象,比如

    Ojbect o =null

    同时在很多个集合中它代表key不存在,也可以代表值为null。

    null使用需要给外的小心,稍不注意就会出现很多问题。当然更多的时候只是单纯的觉得null不够优雅而已。

    Guava为我们提供了一个Optional的抽象类来解决这个问题。用类Present和Absent代表值存在和不存在。

    以下是一个例子:

    Optional possible = Optional.of(5);
    if (possible.isPresent()) {
    System.out.println(possible.get());
    }
    
    Optional absentValue = Optional. absent();
    if (absentValue.isPresent())
    System.out.println(absentValue.get());
    System.out.println(absentValue.or(-1));
    System.out.println(absentValue.orNull());
    System.out.println(absentValue.asSet());

    第一种是值存在的,第二种是值不存在的。执行效果如下:

    guava-1-1

    这里说明一下isPresent()方法是判断是否有值的。or方法是非null返回Optional的值,否则返回传入值。

    orNull()方法是非null返回Optional的值,否则返回null。

    我个人觉得or方法比较常用就是了。

    条件判断