python 生成 cocos 序列帧动画

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

散图自动生成序列帧 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 回帖 • 160 关注
  • Python

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

    556 引用 • 675 回帖
  • Cocos
    4 引用 • 6 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 620 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 124 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 509 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 747 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 241 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 726 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖 • 1 关注
  • abitmean

    有点意思就行了

    35 关注
  • 反馈

    Communication channel for makers and users.

    121 引用 • 907 回帖 • 273 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • Spring

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

    948 引用 • 1460 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 489 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 2 关注
  • PHP

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

    181 引用 • 408 回帖 • 485 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 2 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 647 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 12 关注
  • Google

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

    49 引用 • 192 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖