python 生成 cocos 序列帧动画

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

散图自动生成序列帧 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思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • Python

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

    556 引用 • 674 回帖 • 1 关注
  • Cocos
    4 引用 • 6 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 643 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 640 关注
  • abitmean

    有点意思就行了

    30 关注
  • 自由行
    1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 269 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 416 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    946 引用 • 1460 回帖 • 1 关注
  • 叶归
    5 引用 • 16 回帖 • 10 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 4 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    77 引用 • 389 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 232 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 168 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 175 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 430 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 83 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 17 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1278 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 651 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 46 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 759 关注