概述

阅读本文档,您可以了解如何使用libGDX运行库。该运行库使用Java语言。我们将通过一个示例来说明如何加载导出的JSON文件并在场景中进行播放。

获取运行库

您可以直接从Creature游戏运行库窗口下载运行库,或点击 这里 从版本库获取运行库。

导入语句

以下是使用的导入语句:

import MeshBoneUtil.*;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.graphics.OrthographicCamera;

加载和初始化

假设已导出一个名为default.json的龙动画文件,及其相应的纹理图谱character-dragon.png

首先加载文件资源:

// 加载json
JsonValue json_data = CreatureModuleUtils.LoadCreatureJSONData("default.json");

上述操作将从磁盘加载JSON数据并进入内存。然后,创建可以使用这些加载的资源的实际对象:

// 创建creature
Creature new_creature = new Creature(json_data);

// 创建动画
CreatureAnimation new_animation1 = new CreatureAnimation(json_data, "default", new_creature);
CreatureAnimation new_animation2 = new CreatureAnimation(json_data, "second", new_creature);

// 创建管理器并添加动画
CreatureManager new_creature_manager = new CreatureManager(new_creature);
new_creature_manager.AddAnimation(new_animation1);
new_creature_manager.AddAnimation(new_animation2);

在上述示例中,JSON文件有2个动画剪辑:默认剪辑和第二剪辑。因此,您需要从Creature管理器对象创建2个动画,使它们可以播放。

已完成加载,可以将活动动画设置为默认,并设置一些播放属性,以用于播放:

new_creature_manager.SetActiveAnimationName("default", false);
new_creature_manager.SetIsPlaying(true);
new_creature_manager.SetShouldLoop(true);

现在继续创建对象来渲染角色动画:

    // 加载着色器
    final String VERTEX = Gdx.files.internal("MeshBoneShader.vert").readString();
    final String FRAGMENT = Gdx.files.internal("MeshBoneShader.frag").readString();
    ShaderProgram program = new ShaderProgram(VERTEX, FRAGMENT);

    Texture new_texture = new Texture(Gdx.files.internal("character-dragon.png"));

    // 创建Creature渲染对象
    active_creature_render = new CreatureRenderer(new_creature_manager,
            new_texture,
            program,
            camera);

    // 为Creature设置一个变换矩阵
    Matrix4 xform = new Matrix4();
    xform.scl(1.5f);
    active_creature_render.SetXform(xform);

角色动画和渲染更新

加载角色后,您需要调用相应的更新调用来更新动画并渲染角色。您可以在**render()**回调中完成该操作:

public void render () {
	Gdx.gl.glClearColor(0, 0, 0, 0);
	Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
	batch.begin();
	batch.draw(img, 0, 0);
	batch.end();

	camera.update();
	
	// 更新角色并渲染
	active_creature_manager.Update(Gdx.graphics.getDeltaTime());
	active_creature_render.Flush();
}

完整代码示例

以下为完整的代码布局。大多数代码是从默认的libGDX项目启动器模板生成的。请注意create()方法,该方法执行了大部分工作:

package com.mygdx.game;

import MeshBoneUtil.*;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.graphics.OrthographicCamera;


public class MyGdxGame extends ApplicationAdapter {
    OrthographicCamera camera;
	SpriteBatch batch;
	Texture img;
    CreatureManager active_creature_manager;
    CreatureRenderer active_creature_render;
	
	@Override
	public void create () {
        camera = new OrthographicCamera( (float)Gdx.graphics.getWidth() * 0.05f,
                                            (float)Gdx.graphics.getHeight() * 0.05f);
        batch = new SpriteBatch();
		img = new Texture("badlogic.jpg");

        System.out.println("Loading json...");
        // 加载json
        JsonValue json_data = CreatureModuleUtils.LoadCreatureJSONData("default.json");

        System.out.println("Loading creature...");
        // 创建 Creature
        Creature new_creature = new Creature(json_data);

        System.out.println("Loading animations...");
        // 创建动画
        CreatureAnimation new_animation1 = new CreatureAnimation(json_data, "default", new_creature);
        CreatureAnimation new_animation2 = new CreatureAnimation(json_data, "second", new_creature);

        System.out.println("Loading creature manager...");
        // 创建管理器并添加动画
        CreatureManager new_creature_manager = new CreatureManager(new_creature);
        new_creature_manager.AddAnimation(new_animation1);
        new_creature_manager.AddAnimation(new_animation2);

        new_creature_manager.SetActiveAnimationName("default", false);
        new_creature_manager.SetIsPlaying(true);
        new_creature_manager.SetShouldLoop(true);

        active_creature_manager = new_creature_manager;

        // 加载着色器
        final String VERTEX = Gdx.files.internal("MeshBoneShader.vert").readString();
        final String FRAGMENT = Gdx.files.internal("MeshBoneShader.frag").readString();
        ShaderProgram program = new ShaderProgram(VERTEX, FRAGMENT);

        Texture new_texture = new Texture(Gdx.files.internal("character-dragon.png"));

        // 创建Creature渲染对象
        active_creature_render = new CreatureRenderer(new_creature_manager,
                new_texture,
                program,
                camera);

        // 为Creature设置一个变换矩阵
        Matrix4 xform = new Matrix4();
        xform.scl(1.5f);
        active_creature_render.SetXform(xform);
    }

	@Override
	public void render () {
        //Gdx.gl20.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());


		Gdx.gl.glClearColor(0, 0, 0, 0);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		batch.begin();
		batch.draw(img, 0, 0);
		batch.end();

        camera.update();
        active_creature_manager.Update(Gdx.graphics.getDeltaTime());

        active_creature_render.Flush();
    }

}

自定义时间/帧范围

您可以为当前活动的动画设置自定义时间/帧范围。假设您想将播放限制在10到20的帧范围内,您可以执行以下操作:

new_creature_manager.SetUseCustomTimeRane(true);
new_creature_manager.SetCustomTimeRange(10, 20);

动画混合

您可以执行以下操作来混合2个动画剪辑:

curManager.SetBlending(true);	
curManager.SetBlendingAnimations("default", "pose2");
curManager.SetBlendingFactor(0.5);	 //  在混合时,可选数值为从0到1

使用Creature平面二进制数据缩减加载时间及内存用量

您可以通过将Creature JSON文件转换为Creature平面二进制数格式来缩减大角色资源的加载时间及内存用量。设备上的堆内存不足时,我们建议您使用平面二进制数据格式加载Creature角色资源。

首先,进入 Creature工具Github页面

  1. 进入平面数据目录;

2)您可以编译Creature平面数据转换器程序,或者从Bin目录中获取系统(Mac或Windows)的二进制数据。

运行Creature平面数据转换器

Creature平面数据转换器是一个命令行程序,可以使用置入的导出Creature角色的JSON文件并将其转换为二进制Creature平面数据文件。建议为最终转换输出的二进制文件使用**.bytes**扩展名,以便Unity可以将其识别为二进制资源。

要运行Creature平面数据转换器,请加载以下终端或命令提示符:

CreatureFlatData <Input JSON File> <Output .bytes File>

在LibGDX中使用Creature平面二进制文件

该加载代码与JSON加载代码非常相似。以下是一段简短的代码段,向您展示如何加载平面数据二进制文件:

String baseResourcePath = "C:\\Mydata\\";
String flatFilename = baseResourcePath + "character_raptor_data.bytes";
String pngFilename = baseResourcePath + "character_raptor_img.png";

// 加载平面数据
CreatureFlatDataJava.rootData flat_data = CreatureModuleUtils.LoadCreatureFlatData(flatFilename);
  
// 创建creature
Creature new_creature = new Creature(flat_data);
    
// 创建动画
CreatureAnimation new_animation1 = new CreatureAnimation(flat_data.dataAnimation(), "default");

上面的代码演示了Creature平面数据文件的加载,以及Creature角色对象及其对应的动画对象的创建。创建这些对象后,您可以照常操作。

覆盖、修改骨骼位置

某些情况下,您需要直接修改角色的骨骼位置。例如,为了添加布娃娃物理效果,您可能希望骨骼位置与若干由弹簧或关节连接在一起的刚体保持一致。在这种情况下,您需要为自己的自定义要求设置骨骼位置,您可以执行以下操作。首先,编写自定义骨架覆盖方法,然后将其分配给Creature管理器对象。在下面的例子中,修改了骨骼y方向上的位置:

    // 以下示例演示了如何设置自定义覆盖回调函数
    // 在播放过程中修改骨骼。在这个例子中,我们将
    // 将角色的骨骼在y方向上移动一个固定的量。
    active_creature_manager_2.SetBonesOverrideCallback(
            new CreatureManager.BonesCallback() {
                public void run(HashMap<String, MeshBone> bones_map)
                {
                    for (HashMap.Entry<String, MeshBone> entry : bones_map.entrySet()) {
                        MeshBone cur_bone = entry.getValue();
                        Vector3 cur_start_pt = cur_bone.getWorldStartPt();
                        Vector3 cur_end_pt = cur_bone.getWorldEndPt();

                        cur_start_pt.y += 17.5;
                        cur_end_pt.y += 17.5;

                        cur_bone.setWorldStartPt(cur_start_pt);
                        cur_bone.setWorldEndPt(cur_end_pt);
                    }
                }
            }
    );

角色实例和内存

如需实例一个角色的多个副本(如2条龙),您可以创建一个新的Creature对象,一个新的Creature管理器对象和一个新的Creature渲染器对象。

您可以添加创建的动画到您新创建的Creature管理器对象中,如下所示:

new_creature_manager_2.AddAnimation(new_animation_1);
new_creature_manager_2.AddAnimation(new_animation_2);

将为(最昂贵的)动画分配的内存存储在标准位置。多个Creature管理器对象将从Creature动画对象的公共池添加动画。