python 生成 cocos 序列帧动画

本贴最后更新于 1953 天前,其中的信息可能已经天翻地覆

散图自动生成序列帧 anim 动画文件

配置文件:
config.txt:

{
	"path":"/Users/wangankang/Desktop/ani",
	"time":1.2,
	"wrapMode":"1",
	"speed":1,
	"sample": 60
}

序列帧散图

#!/usr/bin/env python3
# -*- coding: utf-8 -*

import os
import json

class AniTemplate:
    spriteFrame = []
    events = []
    name = ""
    duration = 1
    wrapMode = "1"
    speed = 1
    sample = 60

    def __init__(self, name, time1):
        self.name = name
        self.duration = time1

    def setWrapMode(self, wrapMode):
        self.wrapMode = wrapMode

    def setSpeed(self, speed):
        self.speed = speed

    def setSample(self, sample):
        self.sample = sample

    def obj_2_json(self):
        return {
            "__type__": "cc.AnimationClip",
            "_name": self.name,
            "_objFlags": 0,
            "_duration": self.duration,
            "sample": self.sample,
            "speed": self.speed,
            "wrapMode": self.wrapMode,
            "curveData": {
                "comps": {
                    "cc.Sprite": {
                        "spriteFrame": self.spriteFrame
                    }
                }
            },
            "events": self.events
        }



# 读取一个json文件,并且转为json对象
def fileToJson(fileName):
    file = open(fileName)
    str = file.read()
    file.close()
    return json.loads(str)

# 读取一个meta文件中的uuid
def getMetaUuid(path):
    basename = os.path.basename(path)
    meta = fileToJson(path)
    basename = basename[0:basename.rfind(".")]
    basename = basename[0:basename.rfind(".")]
    return meta['subMetas'][basename]['uuid']

def saveStrToFile(file_name, contents):
    fh = open(file_name, 'w')
    fh.write(contents)
    fh.close()


def genAnim(path, name, time,wrapMode,speed, sample, has_even):
    print("=================================")

    fileList = os.listdir(path)
    metaList = []
    for i in range(0, len(fileList)):
        if fileList[i].endswith(".meta"):
            metaList.append(fileList[i])

    metaList.sort()

    print("读取meta序列帧文件完成,共{" + str(len(metaList)) + "}个")

    if 0 == len(metaList):
        print(name + ">没有找到meta文件,无法生成序列帧,自动跳过")
        return

    # step = time / (len(metaList) - 1)
    step = 0.125
    time = 0.125 * len(metaList)

    print("序列帧动画间隔为:" + str(step) + "s")

    print("准备生成动画文件....")
    template = AniTemplate(name, time);

    template.setSample(sample)
    template.setSpeed(speed)
    template.setWrapMode(wrapMode)

    lastFrameTime = 0

    spriteFrame = []
    for i in range(0, len(metaList)):
        lastFrameTime = i*step
        spriteFrame.append({
            "frame": i * step,
            "value": {
                "__uuid__": getMetaUuid(path +"/" + metaList[i])
            }
        })

    template.spriteFrame = spriteFrame;

    if has_even:
        template.events = [{
            "frame": lastFrameTime,
            "func": "actionOver",
            "params": []
        }]
    else:
        template.events = []

    saveStrToFile(name + '.anim', json.dumps(template, default=AniTemplate.obj_2_json, sort_keys=False, indent=4))

    print("文件生成完成:\n" + os.path.realpath(name + '.anim'))

#
# =======================================
#               main
# =======================================
#

print("开始读取config配置数据...")
config = fileToJson("./config.txt")
print("读取config配置成功...")

path = config['path']
time = config['time']
# wrapMode = config['wrapMode']
speed = config['speed']
sample = config['sample']

print("配置数据解析完成")
print("\tpath:" + path)
print("\ttime:" + str(time))

root = os.listdir(path)
for i in range(0, len(root)):
    if os.path.isdir(path + "/" + root[i]):
        aniPath = path + "/" + root[i]
        aniName = root[i]
        aniName = str(aniName)
        hasAtk = aniName.find("Attack") != -1
        hasStand = aniName.find("Stand") != -1

        hasEvent = hasAtk

        wrapMode = 1
        if hasStand:
            wrapMode = 2

        genAnim(aniPath, aniName, time,wrapMode,speed, sample, hasEvent)


序列帧合集:

#!/usr/bin/env python3
# -*- coding: utf-8 -*

import os
import json

class AniTemplate:
    spriteFrame = []
    events = []
    name = ""
    duration = 1
    wrapMode = "1"
    speed = 1
    sample = 60

    def __init__(self, name, time1):
        self.name = name
        self.duration = time1

    def setWrapMode(self, wrapMode):
        self.wrapMode = wrapMode

    def setSpeed(self, speed):
        self.speed = speed

    def setSample(self, sample):
        self.sample = sample

    def obj_2_json(self):
        return {
            "__type__": "cc.AnimationClip",
            "_name": self.name,
            "_objFlags": 0,
            "_duration": self.duration,
            "sample": self.sample,
            "speed": self.speed,
            "wrapMode": self.wrapMode,
            "curveData": {
                "comps": {
                    "cc.Sprite": {
                        "spriteFrame": self.spriteFrame
                    }
                }
            },
            "events": self.events
        }



# 读取一个json文件,并且转为json对象
def fileToJson(fileName):
    file = open(fileName)
    str = file.read()
    file.close()
    return json.loads(str)

# 读取一个meta文件中的uuid
def getMetaUuid(path):
    basename = os.path.basename(path)
    meta = fileToJson(path)
    basename = basename[0:basename.rfind(".")]
    basename = basename[0:basename.rfind(".")]
    return meta['subMetas'][basename]['uuid']


def get_plist_uuid(path):
    basename = os.path.basename(path);
    json = fileToJson(path)
    sub_metas = json['subMetas']

    key_list = [];

    for key in sub_metas:
        key_list.append(key)

    # 自定义排序 0.png => int("0.png".sub(0,xxx.indexOf("."))) => int("0)
    key_list.sort(key=lambda i: int(i[0:i.rfind(".")]), reverse=False)


    uuid_list = []
    for i in range(0, len(key_list)):
        uuid = json['subMetas'][key_list[i]]['uuid']
        uuid_list.append(uuid)
    return uuid_list;

def saveStrToFile(file_name, contents):
    fh = open(file_name, 'w')
    fh.write(contents)
    fh.close()

def genAnim(path, name, time,wrapMode,speed, sample, has_even):
    print("=================================")

    fileList = os.listdir(path)
    metaList = []
    for i in range(0, len(fileList)):
        if fileList[i].endswith(".plist.meta"):
            metaList.append(fileList[i])

    metaList.sort()

    print("读取当前文件夹meta plist文件完成,共{" + str(len(metaList)) + "}个plist")

    # 获取plist 里面的所有uuid
    uuid_list = get_plist_uuid(path +"/" + metaList[0])

    if 0 == len(metaList):
        print(name + ">没有找到meta文件,无法生成序列帧,自动跳过")
        return

    if 0 == len(uuid_list):
        print(name + ">没有找到plist下的uuid, 无法生成序列帧动画,自动跳过")
        return

    # step = time / (len(metaList) - 1)
    step = 0.125
    # time = 0.125 * len(metaList)
    time = 0.125 * len(uuid_list)

    print("序列帧动画间隔为:" + str(step) + "s")

    print("准备生成动画文件....")
    template = AniTemplate(name, time);

    template.setSample(sample)
    template.setSpeed(speed)
    template.setWrapMode(wrapMode)

    lastFrameTime = 0

    spriteFrame = []
    for i in range(0, len(uuid_list)):
        lastFrameTime = i*step
        spriteFrame.append({
            "frame": i * step,
            "value": {
                # "__uuid__": getMetaUuid(path +"/" + metaList[i])
                "__uuid__": uuid_list[i]
            }
        })

    template.spriteFrame = spriteFrame;

    if has_even:
        template.events = [{
            "frame": lastFrameTime,
            "func": "actionOver",
            "params": []
        }]
    else:
        template.events = []

    saveStrToFile(name + '.anim', json.dumps(template, default=AniTemplate.obj_2_json, sort_keys=False, indent=4))

    print("文件生成完成:\n" + os.path.realpath(name + '.anim'))

#
# =======================================
#               main
# =======================================
#

print("开始读取config配置数据...")
config = fileToJson("./config.txt")
print("读取config配置成功...")

path = config['path']
time = config['time']
# wrapMode = config['wrapMode']
speed = config['speed']
sample = config['sample']

print("配置数据解析完成")
print("\tpath:" + path)
print("\ttime:" + str(time))

root = os.listdir(path)
for i in range(0, len(root)):
    if os.path.isdir(path + "/" + root[i]):
        aniPath = path + "/" + root[i]
        aniName = root[i]
        aniName = str(aniName)
        hasAtk = aniName.find("Attack") != -1
        hasStand = aniName.find("Stand") != -1

        hasEvent = hasAtk

        wrapMode = 1
        if hasStand:
            wrapMode = 2

        genAnim(aniPath, aniName, time,wrapMode,speed, sample, hasEvent)




  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • Cocos
    4 引用 • 6 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 493 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 165 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖 • 1 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 7 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 441 关注
  • gRpc
    10 引用 • 8 回帖 • 54 关注
  • CodeMirror
    1 引用 • 2 回帖 • 115 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 451 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 527 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 152 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 40 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 318 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    313 引用 • 1666 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 6 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • 倾城之链
    23 引用 • 66 回帖 • 100 关注