一、动画与图片的注册
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所示:

“ATLAS”为图片的注册文件
“IMAGE”为图片
1.3 转码之前的贴图动画文件内容
若我们使用的是自己制作的贴图动画,则需要按照如图1-2所示的路径,分别将动画文件与png图片放置其中:

其中动画文件结构如下:

1.4 自行制作贴图动画需要准备的资源
1.4.1 贴图
我们常把贴图动画放在一起说,实际上他们是两类资源一类为动画,另一类就是接下来我们要说的贴图。
贴图在游戏中主要见于三类:
一是最常见的物品栏、制作栏等,他们一致的特点就是:小,所以知足要64×64像素的png图片即可;
二是小地图的图标,常见的建筑、可移植植物等在小地图上都有专属图标,他们的大小不一,适合即可,一般在128×128左右;
三是游戏中的对话框以及按钮,他们形状各异,大小也不同。
于是对于每一个可以放置于物品栏中的实体,我们都需要为其准备一个64×64的png。
1.4.2 动画
我们在游戏界面中见到的所有物品,无论是静止的还是运动的,均为动画,掉落在地上的物品同样是动画,虽然他没有动。
对于一般的动画,我们可以通过ktool工具从官方资源中提取,具体使用方法可以移步至B站学习,对于有特殊需求的动画,我们需要自行制作,这时需要用到官方赠送的spriter,路径如图1-4所示:

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

二、在代码中使用贴图与动画
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所示图片中的名字:

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

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) -- 设置动画朝向为地面
感兴趣的小伙伴可以自行研究。