分类: libGDX

  • android游戏开发框架libgdx的使用(十九)—使用自定义配置改进AVG游戏开发

    android游戏开发框架libgdx的使用(十九)—使用自定义配置改进AVG游戏开发

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    先说明一下上一篇文章我使用了多张hiero图的字体绘制,因为我对源码进行了一些修改,本来想这次发出来的,但是我仔细调试了一下,发现对于多图的支持还是有问题,有些字会出现偏移。

    这个只有继续尝试了…大家可以考虑使用ttf字库。

    然后继续说上一篇,虽然实现了一个简单的效果,但是目前有很多不足。我把AVG游戏需要的资源全部提取出来,放在一个个文件夹中,然后通过配置文件加载这些数据。

    libgdx的工具库

    com.badlogic.gdx.utils就是libgdx的工具库,支持两种格式xml和json。

    我最先倾向于使用json格式,但是反复想了想,虽然json的大小可能要小点,但是没有xml直观好读。

    所以还是选择使用xml格式,读取xml文件使用XmlReader。

    XmlReader reader =new XmlReader();
    try {
    Element config = reader.parse(Gdx.files.internal("data/config.xml"));
    config.get("name");//获取属性值,如果没有属性值则返回同名child的值
    config.getAttribute("name");//获取属性值
    }catch (Exception e) {
    e.printStackTrace();
    }

    配置文件格式分析

    配置文件需要配置的内容其实就是上一篇我们硬编码进去的东西,有背景、边框、对话等。

    我设计的比较随意,不一定是最好的,大家可以参考参考。

    <?xml version="1.0" encoding="UTF-8"?>
    <scene>
    <packfile>pack</packfile>
    <background>bg1</background>
    <border>
    <border-name>border</border-name>
    <border-left>26</border-left>
    <border-right>26</border-right>
    <border-top>31</border-top>
    
    …
  • android游戏开发框架libgdx的使用(十八)—简单的AVG游戏效果实现

    android游戏开发框架libgdx的使用(十八)—简单的AVG游戏效果实现

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    好久没有写libgdx的东西了,主要是最近迷上了各种算法…

    文章是关于实现简单的AVG游戏效果,可能会有好几篇。

    想用libgdx做点AVG效果主要是因为目前Android上运行的AVG游戏(主要是恋爱模拟类型)的基本基于NScripter引擎移植出来的,我的2B中兴机子跑着巨卡,所以想自己做个。

     

    何为AVG游戏

    冒险类游戏AVG (Adventure Game)通常是玩家控制角色进行虚拟冒险的游戏,其故事情节往往是以完成某个任务或是解开一个谜题的形式出现的。

    我这里说的AVG主要是指日式AVG,就是在最初的文字冒险游戏的基础上利用精美的CG图片和动人的音响效果加以强化,靠优秀的文字和剧情打动人心的一种游戏形式。

    比如夜明前的琉璃色

    20100317110151412

     

    简单分析

    AVG游戏主要是由对话,CG图和音效组成。

    拆分下来其实很简单,如下图

    thinking

    再看一张:

    thinking2

    就不举其他例子了,每个场景基本由背景(场景图),对话,人物组成。要是以前玩过的话就很清楚了,背景切换比较少,人物的变化也比较少,文字是点击或者触摸就切换到下一句去。

    我是选用的libgdx的Stage,背景和人物做成Image,对话由Label实现,对话边框由NinePatch实现,然后触摸对话框区域就切换到下一句去。

     

    文字处理

    AVG游戏的对话占据了很大部分,中文的处理很重要。

    libgdx支持中文有两种方法,一是使用Hiero制作,二是使用ttf字库(好像目前还有点问题,暂时不推荐使用)。

    最全的汉字字库有文字9万余个,但是常用的字并不多(相对于所有文字)。

    对比中国大陆、中国台湾和香港特区各自的常用字标准,可以得到3500个常用字,全部做成libgdx用的字体文件。

    总共生成12张图,共1.90M

    chinese

    还是有点大就是了。我比较偏向于先使用这个常用字开发,完成后在重新根据实际使用制作字库。

     

    libgdx实现

    我选用的是Stage,游戏由Game和Screen控制。新建一个类AVGScreen,实现Screen接口。

    private Stage stage;//舞台
    private TextureRegion background;//背景
    private List<string[]> dialogues;//对话
    private BitmapFont 
    …
  • android游戏开发框架libgdx的使用(十七)—TiledMap中角色的行动路径

    android游戏开发框架libgdx的使用(十七)—TiledMap中角色的行动路径

    分享了一些素材,有兴趣的朋友可以看看:http://www.cnblogs.com/htynkn/archive/2012/01/19/game_resource.html

    前些日子的文章介绍了tiledmap的主角出现和移动等等问题。相对于主角游戏自然还应该有敌人(?)。

    与主角不同的是,这些元素的移动时程序控制的,一般有3种。

    1.随主角的移动变化,靠近主角或远离主角

    2.按照固定路线移动

    3.不动

    第一种的话完全是看你的游戏逻辑决定,和tiledmap关系不大。第二种的话我们可以避免硬编码(把移动路径写入程序代码中),而采用tiledmap实现,下面我们来看看具体过程。

    还是新建一张地图,我选用的大小是5030,块大小:3232。

    towntown1

    然后绘制地图:

    adancedmap

    我们假定敌人从地图中间的那条路走到左边的角上。路径如下:

    adancedmap

    现在新建一个对象层,命名为wayPoints。在几个关键的地方标注上对象,命名为wayPoint1,wayPoint2…

    adancedmap

    处理好地图后拷贝到项目中。

    advancelibgdx

    现在新建一个Enemy类,继承Image。

    现在来整理一下思路,首先我们要得到所有的wayPoint.而第一个wayPoint就是角色的初始化点。那么Enemy类首先需要一个Vector2列表,然后继承Image需要一个TextureRegion。

    所以构造函数为

    publicEnemy(List<vector2> vector2s, TextureRegion region) {super(region);this.vector2s = vector2s; currentIndex =0;this.x = vector2s.get(currentIndex).x;this.y = vector2s.get(currentIndex).y; }

    初始点有了,如何移动呢?我们先来看一下坐标

    advancelibgdx2

    我们现在在点1位置,将要移动到点2位置。只需计算x,y,z长度,然后求出对应的moveX和moveY就可以了。

    float x = Math.abs(v1.x - v2.x);float 
    …
  • 分享从网上收集的一些游戏资源,以RPG类为主

    分享从网上收集的一些游戏资源,以RPG类为主

    最近一直在研究libgdx引擎的使用,自然需要一些图片资源,一边学习一边从网上搬运各种用的上的资源,估摸可能有人用的上,特意分享在此。

    下载地址:点击此处

    收集的资源主要分5个大类,我每一类传几张预览图吧:

    1.tiles

    主要是tiledmap用的。

    TileA1

     

    TileC

    2.场景

    002-Woods01

     

    005-Beach01

    3.过渡

    000007-9S-Transition07

     

    000012-9S-Transition12

    4.角色

    这个的角色资源包含脸部特写,也包含人物走动的图,还有一张情绪图。

    chara01_a

     

    face_m02c

    5.游戏结束

    000016-9S-GameOver16

     

    000026-9S-GameOver26

    反正东西也不大,我就不分开打包了。大家要是觉得有用就下载吧。

    下载地址:

    诚通网盘:http://www.ctdisk.com/file/4279436

     

    这个网站也不错哈~素材丰富 http://www.66rpg.com/category.php?c=3…

  • android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度

    android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度

    libgdx绝对是一个相当不错的游戏引擎,最近一段时间的学习我感觉收获很多。但是我一直对于libgdx加载的图片大小必须是2的次方感到很纠结。

    如果是一张一般的图片想在libgdx中使用的话就需要自己去用ps什么的把图像拉一下,一两张没关系,但是数量大了还是有点烦。

    而且拉大的图片还需要TextureRegion来切割一下,实在麻烦。仔细看了一下libgdx的tool包,发现早有解决方案了。

    具体的类是imagepacker,在com.badlogic.gdx.tools.imagepacker包之中。它可以将多张图片合并在一张之中。同时可以通过原有文件的文件名获得图片资源。

    这里有几张图片:

    111415xpic2766

    将它们放在一个文件夹中(这个文件夹没有其他东西了)。引用gdx-tool.jar。

    代码如下:

    Settings settings =new Settings(); settings.alias =true; TexturePacker.process(settings,"D:img","D:imgoutput");

    在output文件夹中可以找到两个文件,其中一个是合成好的图片

    img1

    另外一个名为pack,其中记录了源文件的位置,大小和名称。

    将图片和pack文件拷贝到项目目录。这里说明一下,pack文件的文件名可以随便改,合成的图片如果需要改名的话就需要改一下pack文件里面的内容了。

    使用时的具体类是TextureAtlas。

    代码:

    package com.cnblogs.htynkn.game;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.g2d.TextureAtlas;import com.badlogic.gdx.scenes.scene2d.Stage;import com.badlogic.gdx.scenes.scene2d.ui.Image;publicclass TexturePackerDemo implements ApplicationListener { Stage stage;@Overridepublicvoidcreate() { stage=new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),false); TextureAtlas atlas=new TextureAtlas(Gdx.files.internal("imgs/pack"));//根据pack文件获取所有图片 
    …
  • android游戏开发框架libgdx的使用(十五)—TWL布局

    android游戏开发框架libgdx的使用(十五)—TWL布局

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    TWL是一个基于OpenGL的图形化用户界面库,它提供了一套非常丰富的窗口小部件,比如标签,编辑框,表格等等。不同的布局方式配合使用可以创建出非常高级的用户界面。

    TWL我原来接触过,但是觉得配置文件太难写了,今天逛论坛发现了官方出了Theme编辑器,马上来试试。

    官网:http://twl.l33tlabs.org/

    Editor下载地址:http://twl.l33tlabs.org/themer/themer.jnlp

    双击等下就可以运行了,界面如下。

    twl1

    先新建一个项目。

    twl2

    来看看默认的项目有什么。

    twl3

    第一项是字体,默认字体只支持英文。

    第二项是输入映射,定义了诸如全选,剪切等操作的快捷键。

    第三项是一个名为-defaults的主题样式,这个样式指明了字体使用第一项声明的那个,同时规定了文字靠左。

    第四项是一个名为label的主题样式。

    我们先让其支持中文。我们仍然可以使用hiero制作文字(注意格式上转化),然后将做好的文件拷贝到项目文件夹中。

    新建一个字体定义。

    twl4

    将新定义拖到最上面,改名为normal。

    twl5

    注意:保持修改要点右边的小勾。

    label其实就是为标签设计的样式。TWL Theme Editor提供了很方便的开发环境。

    twl6

    选择Label,选择Theme name为label,测试效果如下:

    twl7

    现在来新建一个Button的样式,先建一个Image,图片用下面那张:

    widgets

    新建Image节点

    twl8

    新建一个Aera节点,命名为buttonBackground。

    twl9

    将no center,spilt x,spilt y选上。

    twl10

    图像范围的选择可以直接用鼠标,这也是我最喜欢的地方…不用自己数像素了。

    twl11

    新建一个样式,名为button。字体选成normal,background选成buttonBackground,测试一下。

    twl13

    可以看出按钮有问题,新建一个button,将L和R都设成10.

    然后需要按钮有按下的效果怎么办?新建一个select节点,在其中添加两个alias节点。

    其中if(pressed)的效果设置成inset 2(就是变小一点),颜色改成黄色。

    twl16

    将button样式的background指定成buttons。保存项目,将项目文件拷贝到android项目的资源文件夹中。

    TWL Theme Editor的更多使用可以参考:…

  • android游戏开发框架libgdx的使用(十四)—TiledMap中视角完善和障碍物处理

    android游戏开发框架libgdx的使用(十四)—TiledMap中视角完善和障碍物处理

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    本文紧跟上文:http://www.cnblogs.com/htynkn/archive/2012/01/13/libgdx_13.html

    上文说到绘制了Map,然后我们的主角也可以四处活动了,但是仍有一些不完善的地方。

    1.地图的边界没有控制。Camera的位置其实是viewport的位置,不是屏幕边界,所以如果直接按照上文的做法做的话主角走到屏幕边缘的时候就有问题了。

    zuobiao

    2.没有障碍,主角的行动没有约束。

    现在先来解决第一个问题。

    解决方案很简单,我们时刻注意viewport的位置,根据viewport计算Screen的边界,让其不超过地图。

    代码如下:

    privatevoidCameraMove(Vector3 vector3, Actor mainActor) {
    Vector3 viewport = stage.getCamera().position.cpy();
    viewport = viewport.add(vector3);
    Vector3 zbound =new Vector3(width /2, height /2,0).add(viewport);
    if (zbound.x > maxCamPosition.x || zbound.y > maxCamPosition.y) {
    return;
    }
    Vector3 
    …
  • android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动

    android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    本文紧跟上文,[android游戏开发框架libgdx的使用(十二)TiledMap地图的使用]

    地图我们创建好了接下来就是主角的出现。其实上文介绍了如何TiledMap和Stage的结合,角色的处理就简单了。

    可以继承Actor类创建主角类,我就偷个懒,用Image代替。

    编辑我们的TMX文件,添加一个对象层。

    在主角要出现的地方加个形状

    取名为play1

    我们的主角是:

    思路是我们遍历map中的所有Object,如果名字和我们设定的play1一致,那么就实例化一个Image,位置和Object一致,添加到舞台。

    关键代码:

    for (TiledObjectGroup group : map.objectGroups) {
    for (TiledObject object : group.objects) {
    if ("play1".equals(object.name)) {
    player =new Image(new TextureRegion(new Texture(Gdx.files
    .internal("map/player.png")),0,0,27,40));
    player.x = object.x;
    player.y = tileMapRenderer.getMapHeightUnits() - object.y;//map是左上角,Stage是左下角
    
    …
  • android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用

    android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用

    提示:本文记录的是本人的操作流程和心得,各位操作时可能由于版本和其它问题会出现点障碍,请参考本文后面的评论和回复。

    虽说可以用Image什么的当个背景,但是要是做个RPG类的游戏就有点复杂了。为了追求效率一般可以使用libgdx的SpriteCache,但是如果习惯于TiledMap的话libgdx也是支持的。

    相关的类是TiledMap,TileAtlas,TileMapRenderer,都在com.badlogic.gdx.graphics.g2d.tiled之中。

    现在我们从头来看看TiledMap的使用。

    1.制作TiledMap。

    我使用的是Tile Map editor,下载地址:http://www.mapeditor.org/

    先新建一个地图,大小5030,每个块的大小是3232。

    tiledmap1

    然后我使用的图块资源是从网上下的,具体出处不知了,对于资源奉献者表示感谢~

    map

    添加一个新图块

    tiledmap2

    块的高宽都是32.边距和间距都是1px,这些数值是取决你的图块资源本身的。效果如下:

    tiledmap3

    然后发挥想象吧,画一幅地图。

    tiledmap

    保存tmx文件。然后用gdx-tiled-preprocessor处理一下。

    处理完成后会多三个文件,覆盖原来的同名文件:

    tiledmap4

    tilest1.png文件:

    tileset1

    终于可以开始绘制了

    map = TiledLoader.createMap(mapHandle);
    atlas =new TileAtlas(map,new FileHandle("map/"));
    tileMapRenderer =new TileMapRenderer(map, atlas,10,10)

    最后在render用tileMapRenderer.render(cam);绘制

    而在TileMapRenderer(map, atlas, 10, 10)这句中后面两个10是缓冲的块数,可以酌情调整。我是随意写的。

    tiledmap5

    我个人比较喜欢舞台,其实tiledmap一样可以在舞台中使用。

    我在舞台绘制一个标签作为例子。

    其实原理很简单,从Stage获取Camera,然后给Render用,最后在Stage绘制。

    关键代码:…

  • android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用

    android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    libgdx的UI改进很大,原来各种稀奇古怪的问题都已经解决了,而且UI的类型也基本上完全了。推荐大家下载最近的版本使用。

    UI的使用我觉得唯一复杂的就是各种样式的制定,比如TextButton:

    public TextButtonStyle (NinePatch down, NinePatch up, NinePatch checked,float pressedOffsetX,float pressedOffsetY,float unpressedOffsetX,float unpressedOffsetY, BitmapFontfont,Color fontColor,Color downFontColor,Color checkedFontColor)

    再看看List:

    public ListStyle (BitmapFontfont,Color fontColorSelected,Color fontColorUnselected, NinePatch selectedPatch)

    每次使用都需要实例化若干个Texture,NinePatch什么的还是有点麻烦,还好libgdx给出了一个解决方案:Skin。

    Skin保存了UI的样式和相关的资源,定义使用的是Json或者Json-like。API地址:http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/scenes/scene2d/ui/Skin.html

    先看看基本格式:

    {
    resources: {
    className: {
    name: value,
    ...
    },
    
    …