android 游戏引擎libgdx demo cuboc分析

开始学习android游戏开发也有一段时间了,挑选libgdx这个游戏引擎来进行学习和开发。Libgdx是一款支持2D与3D游戏开发的游戏类库,并且它是夸平台的。例如你可以在windos下开发,同样的代码也可以运行在android上。
  刚开始学习这个游戏引擎可能会感觉无从下手,从看该引擎作者提供的DEMO 然后仿照写是个不错的方法。从SVN地址:http://libgdx.googlecode.com/svn/trumk 下载到 cuboc 这个例子。打开后有两个项目 一个是cuboc 一个是cuboc-android,其实我们发现 这两个项目是关联的cuboc-android 用的也是cuboc里的代码。
  运行游戏后是一个类似采蘑菇的游戏,下面我们看下cuboc-android\assets\data下的资源文件是如何在代码中使用,怎么构建的整个游戏屏幕的
  打开com.badlogic.cubocy.screens 这个包,下面定义了几个屏幕类,其中GameScreen 就是游戏主屏幕了。用到了Map MapRenderer OnscreenControlRenderer 这三个类。
  我们先看下 Map,用到了data/levels.png 这张图片,这是一个地图模型,游戏地图就是根据这个绘制的,黑色部分就是通道,还有红色的(0xff0000)复活点 出口(0xff00ff)等等,Map ()构造函数中 根据判断某个像素点的 rgp 在该位置 生成相关的东西。
  接着是MapRenderer,这是是地图的渲染类。下面的代码是加载资源,生成相关的动画。 在libgdx 的图片长宽必须是2的整次幂,不然会报错。可以用http://zwoptexapp.com/flashversion 这个网站快速的把图片生成这样的尺寸

Java代码

  1. // 获取资源 生成动画
  2. private void createAnimations() {  
  3. // 地图的方块单元 取tile.png的 20 ,20
  4. this.tile = new TextureRegion(new Texture(  
  5.             Gdx.files.internal("data/tile.png")), 0, 0, 20, 20);  
  6.  
  7. // 载入 资源图片 主角动作分解图 等效果资源
  8.     Texture bobTexture = new Texture(Gdx.files.internal("data/bob.png"));  
  9.  
  10. // [0] 表示只取第一行
  11.     TextureRegion[] split = new TextureRegion(bobTexture).split(20, 20)[0];  
  12. // 镜子 做一个翻转 区分 左移 还是右移
  13.     TextureRegion[] mirror = new TextureRegion(bobTexture).split(20, 20)[0];  
  14.  
  15. for (TextureRegion region : mirror)  
  16.         region.flip(true, false);// 只根据X轴翻转
  17. // 找到第六个 钉子的资源
  18.     spikes = split[5];  
  19.     bobRight = new Animation(0.1f, split[0], split[1]);  
  20.     bobLeft = new Animation(0.1f, mirror[0], mirror[1]);  
  21.     bobJumpRight = new Animation(0.1f, split[2], split[3]);  
  22.     bobJumpLeft = new Animation(0.1f, mirror[2], mirror[3]);  
  23.     bobIdleRight = new Animation(0.5f, split[0], split[4]);  
  24.     bobIdleLeft = new Animation(0.5f, mirror[0], mirror[4]);  
  25.     bobDead = new Animation(0.2f, split[0]);  
  26.  
  27. // 第二行得资源
  28.     split = new TextureRegion(bobTexture).split(20, 20)[1];  
  29. // 立方体的资源
  30.     cube = split[0];  
  31. // 立方体 固定时的动画
  32.     cubeFixed = new Animation(1, split[1], split[2], split[3], split[4],  
  33.             split[5]);  
  34. // 第三行
  35.     split = new TextureRegion(bobTexture).split(20, 20)[2];  
  36. // 立方体 受控制时的资源
  37.     cubeControlled = split[0];  
  38. // 主角重生动画
  39.     spawn = new Animation(0.1f, split[4], split[3], split[2], split[1]);  
  40. // 主角死亡动画
  41.     dying = new Animation(0.1f, split[1], split[2], split[3], split[4]);  
  42. // 重生点
  43.     dispenser = split[5];  
  44.  
  45.     split = new TextureRegion(bobTexture).split(20, 20)[3];  
  46. // 火箭动画
  47.     rocket = new Animation(0.1f, split[0], split[1], split[2], split[3]);  
  48. // 火箭诞生点
  49.     rocketPad = split[4];  
  50.     split = new TextureRegion(bobTexture).split(20, 20)[4];  
  51. // 爆炸动画
  52.     rocketExplosion = new Animation(0.1f, split[0], split[1], split[2],  
  53.             split[3], split[4], split[5]);  
  54.     split = new TextureRegion(bobTexture).split(20, 20)[5];  
  55. // 出口
  56.     endDoor = split[2];  
  57. // 移动的钉子
  58.     movingSpikes = split[0];  
  59. // 激光
  60.     laser = split[1];  

// 获取资源 生成动画 private void createAnimations() { // 地图的方块单元 取tile.png的 20 ,20 this.tile = new TextureRegion(new Texture( Gdx.files.internal("data/tile.png")), 0, 0, 20, 20); // 载入 资源图片 主角动作分解图 等效果资源 Texture bobTexture = new Texture(Gdx.files.internal("data/bob.png")); // [0] 表示只取第一行 TextureRegion[] split = new TextureRegion(bobTexture).split(20, 20)[0]; // 镜子 做一个翻转 区分 左移 还是右移 TextureRegion[] mirror = new TextureRegion(bobTexture).split(20, 20)[0]; for (TextureRegion region : mirror) region.flip(true, false);// 只根据X轴翻转 // 找到第六个 钉子的资源 spikes = split[5]; bobRight = new Animation(0.1f, split[0], split[1]); bobLeft = new Animation(0.1f, mirror[0], mirror[1]); bobJumpRight = new Animation(0.1f, split[2], split[3]); bobJumpLeft = new Animation(0.1f, mirror[2], mirror[3]); bobIdleRight = new Animation(0.5f, split[0], split[4]); bobIdleLeft = new Animation(0.5f, mirror[0], mirror[4]); bobDead = new Animation(0.2f, split[0]); // 第二行得资源 split = new TextureRegion(bobTexture).split(20, 20)[1]; // 立方体的资源 cube = split[0]; // 立方体 固定时的动画 cubeFixed = new Animation(1, split[1], split[2], split[3], split[4], split[5]); // 第三行 split = new TextureRegion(bobTexture).split(20, 20)[2]; // 立方体 受控制时的资源 cubeControlled = split[0]; // 主角重生动画 spawn = new Animation(0.1f, split[4], split[3], split[2], split[1]); // 主角死亡动画 dying = new Animation(0.1f, split[1], split[2], split[3], split[4]); // 重生点 dispenser = split[5]; split = new TextureRegion(bobTexture).split(20, 20)[3]; // 火箭动画 rocket = new Animation(0.1f, split[0], split[1], split[2], split[3]); // 火箭诞生点 rocketPad = split[4]; split = new TextureRegion(bobTexture).split(20, 20)[4]; // 爆炸动画 rocketExplosion = new Animation(0.1f, split[0], split[1], split[2], split[3], split[4], split[5]); split = new TextureRegion(bobTexture).split(20, 20)[5]; // 出口 endDoor = split[2]; // 移动的钉子 movingSpikes = split[0]; // 激光 laser = split[1]; }
  可以看到人物动作其实就是 根据动作分解图生成Animation,在合适的时候播放动画,并不停的改变其位置。看起来就是在行走了。
  根据这些。。我们就可以去试着画地图,还有会动的人物了。

你可能感兴趣的:(android,移动开发,assets,3D游戏,开发资源)