饥荒联机版mod制作[贴图动画详解]

一、动画与图片的注册

1.1  注册代码

代码如下:

local assets =
{
    Asset("ANIM", "anim/sakura_book.zip"),
    Asset("ATLAS", "images/sakura_book.xml"),
    Asset("IMAGE", "images/sakura_book.tex"),
}

1.2  转码之后的贴图动画文件内容

其中“ANIM”为动画包,里面包括:

anim.bin:动画包

atlas.tex:图集

build.bin:材质包

如图1-1所示:

图1-1  动画资源包中的内容

“ATLAS”为图片的注册文件

“IMAGE”为图片

1.3  转码之前的贴图动画文件内容

若我们使用的是自己制作的贴图动画,则需要按照如图1-2所示的路径,分别将动画文件与png图片放置其中:

图1-2  初始贴图动画资源放置路径

其中动画文件结构如下:

图1-3  动画文件结构

1.4  自行制作贴图动画需要准备的资源

1.4.1  贴图

我们常把贴图动画放在一起说,实际上他们是两类资源一类为动画,另一类就是接下来我们要说的贴图。

贴图在游戏中主要见于三类:

一是最常见的物品栏、制作栏等,他们一致的特点就是:小,所以知足要64×64像素的png图片即可;

二是小地图的图标,常见的建筑、可移植植物等在小地图上都有专属图标,他们的大小不一,适合即可,一般在128×128左右;

三是游戏中的对话框以及按钮,他们形状各异,大小也不同。

于是对于每一个可以放置于物品栏中的实体,我们都需要为其准备一个64×64的png。

1.4.2  动画

我们在游戏界面中见到的所有物品,无论是静止的还是运动的,均为动画,掉落在地上的物品同样是动画,虽然他没有动。

对于一般的动画,我们可以通过ktool工具从官方资源中提取,具体使用方法可以移步至B站学习,对于有特殊需求的动画,我们需要自行制作,这时需要用到官方赠送的spriter,路径如图1-4所示:

图1-4  spriter路径

 需要在steam中下载“Don't Starve Mod Tools”,如图1-5所示:

图1-5  Don't Starve Mod Tools

 二、在代码中使用贴图与动画

2.1  使用贴图

在代码中,我们需要像前一节提到的,先对需要用到的资源进行注册,才可以使用。注册错误或未注册成功会导致无法进入游戏世界,而对于某一实体的定义错误则只会在需要初始化该实体时才会出错。

注册方法如下:

local assets =
{
    Asset("ANIM", "anim/sakura_book.zip"),
    Asset("ATLAS", "images/sakura_book.xml"),
    Asset("IMAGE", "images/sakura_book.tex"),
}

local function fn()
    local inst = CreateEntity()
    -- 实体定义
    return inst
end

return Prefab("sakura_book", fn, assets)

如果注册图片的xml名字与返回的实体名字相同,则不用在代码中重新声明,否则需要重新声明:

inst.components.inventoryitem.atlasname ="images/sakura_book.xml" --设置装备栏贴图

2.2  使用动画

使用动画是一个较为复杂的过程,它包括:

2.2.1  声明实体所使用的动画集与材质包

声明的代码如下:

inst.AnimState:SetBank("sakura_book")
inst.AnimState:SetBuild("sakura_book")

其中bank为动画集,他是所有动画的集合,即如图2-1所示图片中的名字:

图2-1  bank对应的名称

 build为动画所使用的物理资源即贴图以及一些关键帧信息等,游戏中更换皮肤就是通过更换bulild而不换动画集anim实现的,所谓“换皮不换肉”。build对应动画文件压缩包的名称,如图2-2所示:

图2-2  build对应的名称

2.2.2  播放动画

动画即是指动画集bank下面的动画,可以参考图2-1。播放动画的代码如下:

inst.AnimState:PlayAnimation("idle",false)
-- false表示不循环播放动画,如需要循环播放则设为true

通常在初始化实体时,我们便将这句与上面两句一起使用,让实体播放静止动画“idle”。

2.2.3  切换动画资源

我们最初通过2.2.1给一个实体绑定了一个固定的动画资源bulid以及bank,但有时这些实体的动画资源不全处于同一个动画文件中,比如武器、装备等的静止(丢在地上)动画资源在一个压缩包中,而拿在手上的动画资源则在另一个压缩包中,这是就需要完成动画资源的切换来实现人物从地上拿起武器,或者穿上装备等的动作。

更换动画资源意味着需要将build与bank全部更换,而在代码中我们只体现了切换build,这是因为build是包含着bank的,只要切换了build,bank也就一起跟着切换了。这一点通过前面的文件夹关系我们也可以看出来。

切换的代码如下:

local function OnEquip(inst, owner)
    local skin_build = inst:GetSkinBuild()
    if skin_build ~= nil then
        owner:PushEvent("equipskinneditem", inst:GetSkinName())
        owner.AnimState:OverrideItemSkinSymbol("swap_object", skin_build, "swap_sakura_mozhang", inst.GUID, "swap_sakura_mozhang")
    else
        owner.AnimState:OverrideSymbol("swap_object", "swap_sakura_mozhang", "swap_sakura_mozhang")
    end

    owner.AnimState:Show("ARM_carry")
    owner.AnimState:Hide("ARM_normal")
end

注意上面的代码是切换拥有者“owner”的动画,而不是实体的。

这里有两种切换语句,一个是对于有皮肤的物品,另一个是对于没有皮肤的物品。

对于没有皮肤的物品,切换时用到的语句:

owner.AnimState:OverrideSymbol("swap_object", "swap_sakura_mozhang", "swap_sakura_mozhang")

第一个参数为被替换掉的build名称(由于bulid包含bank,所以只需声明build);

第二个参数是替换后的build名称;

第三个参数是替换后的bank名称,也就是第二个参数包含的bank(由于此时系统不知道这个build对应的是哪个bank,所以需要声明)。

对于有皮肤的物品,切换时用到的语句:

owner.AnimState:OverrideItemSkinSymbol("swap_object", skin_build, "swap_sakura_mozhang", inst.GUID, "swap_sakura_mozhang")

第一、三、五个参数与前面没皮肤的相同;

第二个参数是皮肤的动画数据的资源包。skin_build 通常是一个字符串,表示皮肤资源的文件名。

第四个参数是实例的全局唯一标识符(GUID)。GUID 用于在游戏中唯一标识一个实例,确保动画符号的替换是针对特定实例的。

看似复杂,但所有类似操作的装备武器用的切换语句都相同,可以直接复制粘贴,我们只需要修改其中替换前、替换后的部分即可。

2.2.4  隐藏动画与显示动画

在前面切换皮肤的代码中已经出现过,代码为:

owner.AnimState:Show("ARM_carry")
owner.AnimState:Hide("ARM_normal")

之所以要隐藏一只胳膊再显示一只胳膊,是因为人物有两只右手,一只用来拿东西,另一只同左手一样。

2.2.5  其他动画

还有许多其他的动画方法,如下:

inst.AnimState:SetLightOverride(0.1)   -- 覆盖动画中的光源强度  
  
inst.AnimState:SetSymbolBloom("flametail") -- 为动画中的某个符号设置光晕效果  
inst.AnimState:SetSymbolLightOverride("flametail", 0.5) -- 覆盖该符号的光晕强度  
  
inst.AnimState:SetOrientation(ANIM_ORIENTATION.OnGround) -- 设置动画朝向为地面  

感兴趣的小伙伴可以自行研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值