博客

  • 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,
    ...
    },
    
  • android游戏开发框架libgdx的使用(十)—双舞台

    android游戏开发框架libgdx的使用(十)—双舞台

    游戏屏幕最常见的就是一个变化较少的背景加上一系列和用户交互的角色和部件。为了方便管理你还可以为背景建个Group方便管理。

    但是有时候写的时候没有想到这个问题,或者是背景不是单纯的一个图片什么的,背景和角色还有一些混合逻辑分布在两个Stage里。

    我重写太麻烦,想想反正都是SpritBatch绘制出来的,用双舞台大不了多个摄像头。马上试试还真行。

    先看看Stage的draw方法:

    /** Renders the stage */
    publicvoiddraw () {
    camera.update();
    if (!root.visible)return;
    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    root.draw(batch,1);
    batch.end();
    }

    batch的话两个舞台可以共用。用Stage(width, height, stretch, batch)实例化第二个舞台。

    代码如下:

    package com.cnblogs.htynkn.game;
    
    import com.badlogic.gdx.ApplicationListener;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.InputProcessor;
    import com.badlogic.gdx.graphics.GL10;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import 
  • android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d

    android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d

    在游戏开发中难免会需要模拟现实情况,一般常见的就是模拟物理世界。

    比如物体碰撞,车辆前进,物体下落等。也许有人会觉得原来有实现过一些效果没有看到用什么物理知识呢。

    在我看来引入物理引擎并不是必须的,但是这样可以让游戏更逼真。物理引擎的话首选Box2d,但是它是C++写的,直接用不方便。

    在Android游戏开发中使用物理引擎一般有三个比较好的选择:

    1.JBox2d

    Box2d的Java移植版本,速度有点慢。不过对于不熟悉C++的朋友而言这个可以拿来看看原理。

    2.Havok

    这个就不多说了,我怎么没有用过。

    3.Libgdx

    libgdx用了jni封装了box2d,速度和易用性都不错。

    下面我们来看看一个示例,原来没有接触过box2d的朋友最好先找资料看看。

    代码如下:

    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.OrthographicCamera;
    import com.badlogic.gdx.math.Vector2;
    import com.badlogic.gdx.physics.box2d.Body;
    import com.badlogic.gdx.physics.box2d.BodyDef;
    import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
    import com.badlogic.gdx.physics.box2d.CircleShape;
    import com.badlogic.gdx.physics.box2d.World;
    import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
    
    publicclass DemoGame implements ApplicationListener 
  • 是sourceForge还是google code?

    是sourceForge还是google code?

    最近写了一点小东西,想把代码放到网上。最先想到的是google code,没有其他什么说的,界面简单,使用方便。

    svn服务器速度也不错,校园网这个渣速也可以跑到40K/S。用着用着就觉得有点纠结了,因为仔细研究了一下sourceForge,觉得也不错,有点像移动到sourceForge上去。

    但是sourceForge的速度有点纠结了,还有满屏的英语…看着有点困难。而且建立项目的界面改了,有点不知所云。(可以切换到老界面创建项目)。

    仔细比较了一下觉得二者各有优劣,遂把随感随想写成博文,一方面给后来人参考,一方面想听听其他朋友的看法。

    1.google code

    优点:

    *毫无悬念,速度快,特别是SVN服务器,提交代码时感觉很爽。

    *界面简单,极其一般的英语水准都可以胜任。

    *上手容易,快速体验。

    劣势:

    *功能较弱,一般的需求没有问题,但是SVN权限划分,wiki的支持上都有不是很强。

    *没有统计,虽然Google Code集合自家产品的统计,但是我觉得Google Analytics是做网站统计,对于svn库没有统计,对于下载等的统计没有单独划分出来。

    *稳定性不够.有时候会访问不起。(我觉得是被盾了)

    2.sourceForge

    优点:

    *老牌,用户量,各方面的操作和管理方式都经过了时间的考验。

    *功能服务,只要你能够想到的,都会有提供,实在没有的你还可以在Hosted Apps里面找找。

    *提供了web空间,可以更随意的表现。

    缺点:

    *因为功能丰富,所以上手有点困难。

    *速度,速度,有时候确实有点慢。

     

    其实依我来看,Google Code拿来做点简单的还是可以的,特别是你的项目本身就有网站什么的,不足的功能可以自己架。偶尔的无法访问也没有大的影响。

    如果你需要强大的功能,而且可以接受有点慢的速度,那就推荐sourceForge了。

    我在两者上面都建立了一个项目,监控了几天在线率,结果如下:

    gs2

    Google Code的无法访问一般就是几分钟的事情。

    gs1

  • android游戏开发框架libgdx的使用(八)–相机和观察点

    android游戏开发框架libgdx的使用(八)–相机和观察点

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

    相机也可以成为观察者,最简单的例子就是魂斗罗。

    魂斗罗

    玩家操作角色前进,后退,跳跃等,显示的世界(就是后面的背景)会不停变化。其实就是相机的观察点(视角)的改变引起的。

    也许游戏的世界(背景地图)很大,比如10240480,而设备的分辨率是800480。现在游戏的角色在地图的最左侧,那么它的观察点就是(400,240)。

    随着角色的向前移动,观察点也变化,通常是y值变大。

    角色后退时x值变小。

    角色跳跃时,y值变化。(其实地图可能要稍微高一点,比如500,这样角色的跳跃才会有效果)。

    可以说相机是游戏开发的一个基本组件。而Libgdx的Stage类中就默认包含了一个Camera。

    Camera类按照功能而言也有很多种,最常用的是OrthographicCamera(正投影相机),Stage中默认Camera的实现类为该类。

    OrthographicCamera实现以下功能:

    1.移动和旋转镜头

    2.放大和缩小

    3.改变观察点(视角)

    4.窗体和世界的点的转化

    相机的最大好处就是无需手动操作矩阵就可以移动游戏世界,所有的矩阵投影和观察点运算就是对开发者隐藏的。

    相机的使用一般配合着mesh。mesh绘制一个矩形区域,然后将地图贴图在其上。

    接下来的例子将使用一张图:

    xk

    大小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 
  • android游戏开发框架libgdx的使用(七)–开发框架总观

    android游戏开发框架libgdx的使用(七)–开发框架总观

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

    上几篇文章介绍了libgdx框架的一些基本类的用法,也夹杂着浏览了一下部分源代码,但是如果使用libgdx进实际开发,
    仅仅了解几个类是不够的,还需要对框架有具体和宏观的了解。

    1.应用的生命周期

    游戏应该高效和稳定,特别是对于android平台。目前的开发都是面向手机和平板。如果有效的管理资源,如何高效的运行都是非常重要的。

    试想一个制作优美,可玩性高的游戏运行于你的android手机上却10秒钟崩溃一次,运行时卡的如同在看漫画,这样的游戏是有合格的吗?

    application_lifecycle_diagram

    Android一般不用管resize(),我们在create中实例化所需的对象,在render()中进行绘制。pause()时可以保持当前的灵活数据。dispose()报销对象。

    而在resume()中根据保持的数据对游戏进行还原。

    其实说不负责一点,dispose()你可以不管,android系统会自动回收一些,用户对于退出后的短暂停滞也是有接受能力的。

    create()你也可以水一些,大不了进入游戏或者初始化相关场景时速度慢一些罢了。

    但是pause()和resume()你必须认真处理。电话是最常见的意外性中断,不会有用户偏爱一个电话就可以让记录或者进度消失的游戏的。

    2.游戏构架

    对于是否该称架构我一直有所疑惑,你可以理解为游戏的组成。一个游戏不论大小,不论复杂程度都应该具有的大致框架。

    架构

    这里稍微解释一下。

    输入只是用户的响应,可以使点击(Touch)或者点击(Click),拖拽(Drag)等。

    输出一般是图片和声音或者影像,当时也有文件或者其他数据(比如网络的存储)。

    而在输入中的文件一般为图片和声音,逻辑由数学逻辑和物理逻辑构成。

    而libgdx对于物理上处理是Box2D的封装,可以满足一般需求了。对于数学的封装了一些常见的结构和少量算式,不过可以基于此开发自己需要的算法。

    libgdx对于图像和声音等文件的处理比较好,可以直接使用。

    3.游戏容器

    最原始的容器自然是Application了。

    图表2

    然后是Game,它管理着若干个Screen,比如游戏场景,积分场景,帮助场景,高分榜场景。而场景之下有着若干舞台,舞台之中是演员。…

  • android游戏开发框架libgdx的使用(六)–演员和演出

    android游戏开发框架libgdx的使用(六)–演员和演出

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

    上一篇说到UI,然后之前说到舞台,现在我们可以很轻松的构建一出戏了。

    因为actor类在绘制是以x,y值为基准,所以我们可以通过控制x,y值变化演员的位置,但是演员的其他效果需要配合Action类进行操作。

    Action类是一个抽象类,所有的具体实现都在com.badlogic.gdx.scenes.scene2d.actions包中。

    actions

    而包中的类依功能而言可以分为两类:

    1. 控制Action
    2. 表现Action

    控制Action没有直接表现效果,它操作的对象是表现Action。

    比如Delay。

    表现Action就是直接的表现效果,继承自AnimationAction,操作对象是Actor。

    比如MoveTo。

    现在挨着说吧:

    控制类:

    Delay $ (Action action,float duration)

    延迟duration秒执行action。

    Forever $ (Action action)

    一直执行action。

    Parallel $ (Action... actions)

    并行(同时)执行actions。

    Repeat $ (Action action,int times)

    重复action times次。

    Sequence $ (Action... actions)
  • android游戏开发框架libgdx的使用(五)–舞台和常用UI类

    android游戏开发框架libgdx的使用(五)–舞台和常用UI类

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

    常用的UI类包括标签,按钮,勾选框,下拉框,图片,输入框,列表,滑动面板,滑条,分割面板。它们都在com.badlogic.gdx.scenes.scene2d.ui包中,都属于Actor,可以方便的纳入舞台的管理中。

    其实仔细看看UI类的实现代码不难发现其实它们都是大部分继承自Widget或者Table,如果需要自定义UI可以继承以上两个类(它们继承自Actor),这里要说明一下libgdx的布局部分使用了TWL,有兴趣的朋友可以去看看。

    在介绍每个控件之前我们先来看一下NinePatch,这是最近的一个比较重大的更新。

    何为NinePatch?其实android原生即有NinePatch类,常在按钮中使用。

    NinePatch

    如图,将图片分成九份。中间部分可以根据需要扩大,使按钮的大小内容变动不受图片的限制。

    而在libgdx的NinePatch其实就是九个TextureRegion对象。

    常用的实例化方法有两个:

    publicNinePatch (Texture texture,int left,int right,int top,int bottom)
    
    publicNinePatch (TextureRegion region,int left,int right,int top,int bottom)

    关于其中的四个int型参数如何取值我们可以参考一下源码:

    publicNinePatch (TextureRegion region,int left,int right,int top,int bottom) {
    int middleWidth = region.getRegionWidth() - left - 
  • android游戏开发框架libgdx的使用(四)–舞台和演员

    android游戏开发框架libgdx的使用(四)–舞台和演员

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

    我们先看几个游戏截图再来理解何为舞台。

    12942M3Q423F-45025

    请仔细观察图片中的元素,有些东西是不能动,有些可以动,有些有特效,有些没有。有些是按钮,有些是图片,但是其实它们都可以统一称为演员(Actor)。

    而整个游戏界面就是我们的舞台。

    12942M3Q423F-45025 - 副本

    再看一个射击类游戏

    f2316c3c29ce2660f93dce72a0944453

    而其中的演员是

    f2316c3c29ce2660f93dce72a0944453

    演员是游戏设计中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件,比如触摸,点击,但是同时还有自身的响应和属性。

    而舞台就是容纳演员的场所。它统一管理所有演员,接受输入,同时提供一个方便的框架操作演员的时间变化。

    我们来看一下Stage类:

    protectedfinal Group root;
    protectedfinal SpriteBatch batch;
    protected Camera camera;

    它拥有一个Group,一个SpriteBatch,还有一个相机。

    SpriteBatch我们在前几篇说过,这里就不再重复了。

    Group是一个类,用于容纳和控制演员。但是这里要注意Group本身其实也是继承自Actor。

    相机我们这里跳过,以后再说,可以暂时理解成一个控制观察视角和指标转化的工具。

    当我们拥有一个演员后就可以调用addActor方法加入舞台。

    舞台可以获取输入,但是需要设置。

    Gdx.input.setInputProcessor(stage);

    下面来个列子,控制一个人物前进。

    actor1

    控制人物的按钮:

    narrow

    将所需的图片放到assert中

    所需资源

    新建三个类:

    FirstGame,实现接口ApplicationListener

    FirstActor,继承Actor

    NarrowButton,继承Actor

    先看一下FirstGame

    声明一个Stage,然后实例化FirstActor和NarrowButton,将二者加入舞台中,最后设置输入响应为Stage。

    package com.cnblogs.htynkn.listener;
    
    import java.util.Date;
    import java.util.Random;